From 54a9c168fbc572be07f0ad475aaf4326a9668ba0 Mon Sep 17 00:00:00 2001 From: Corey Oordt Date: Wed, 24 Jul 2019 07:34:24 -0500 Subject: [PATCH] A bunch of minor updates --- .pyup.yml | 2 +- cookiecutter.json | 1 - hooks/post_gen_project.py | 113 ++++++++++-------- .../.envs/dev/django | 17 --- .../.envs/dev/postgres | 11 +- .../.envs/prod/django | 30 +++-- .../merge_production_dotenvs_in_dotenv.xml | 2 +- .../.idea/runConfigurations/migrate.xml | 2 +- .../.idea/runConfigurations/runserver.xml | 34 +++--- .../runConfigurations/runserver_plus.xml | 2 +- {{cookiecutter.project_slug}}/Dockerfile | 32 +---- {{cookiecutter.project_slug}}/README.rst | 2 +- {{cookiecutter.project_slug}}/bin/entrypoint | 19 ++- .../bin/merge_production_dotenvs_in_dotenv.py | 0 .../bin/setup-dev-env | 11 ++ .../bin/start-celery-beat | 2 +- .../bin/start-celery-worker | 2 +- .../bin/start-django | 2 +- .../bin/start-django-dev | 0 .../bin/start-flower | 2 +- {{cookiecutter.project_slug}}/local.yml | 29 ++--- {{cookiecutter.project_slug}}/package.json | 2 +- {{cookiecutter.project_slug}}/pytest.ini | 2 +- .../requirements/base.txt | 7 ++ .../requirements/prod.txt | 9 ++ .../requirements/production.txt | 20 ---- .../{{cookiecutter.project_slug}}/__init__.py | 2 +- .../settings/base.py | 71 +---------- .../settings/dev_template.py | 8 -- .../settings/prod.py | 75 ++++++++++++ .../settings/test.py | 6 - .../{{cookiecutter.project_slug}}/storage.py | 19 +++ .../{{cookiecutter.project_slug}}/wsgi.py | 4 +- 33 files changed, 272 insertions(+), 268 deletions(-) delete mode 100644 {{cookiecutter.project_slug}}/.envs/dev/django mode change 100644 => 100755 {{cookiecutter.project_slug}}/bin/entrypoint mode change 100644 => 100755 {{cookiecutter.project_slug}}/bin/merge_production_dotenvs_in_dotenv.py create mode 100755 {{cookiecutter.project_slug}}/bin/setup-dev-env mode change 100644 => 100755 {{cookiecutter.project_slug}}/bin/start-celery-beat mode change 100644 => 100755 {{cookiecutter.project_slug}}/bin/start-celery-worker mode change 100644 => 100755 {{cookiecutter.project_slug}}/bin/start-django mode change 100644 => 100755 {{cookiecutter.project_slug}}/bin/start-django-dev mode change 100644 => 100755 {{cookiecutter.project_slug}}/bin/start-flower create mode 100644 {{cookiecutter.project_slug}}/requirements/prod.txt delete mode 100644 {{cookiecutter.project_slug}}/requirements/production.txt create mode 100644 {{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/storage.py diff --git a/.pyup.yml b/.pyup.yml index a215e841e..6b4a9d8b3 100644 --- a/.pyup.yml +++ b/.pyup.yml @@ -14,5 +14,5 @@ requirements: - "requirements.txt" - "{{cookiecutter.project_slug}}/requirements/base.txt" - "{{cookiecutter.project_slug}}/requirements/dev.txt" - - "{{cookiecutter.project_slug}}/requirements/production.txt" + - "{{cookiecutter.project_slug}}/requirements/prod.txt" - "{{cookiecutter.project_slug}}/requirements/test.txt" diff --git a/cookiecutter.json b/cookiecutter.json index 0a060e03e..4abbc926f 100644 --- a/cookiecutter.json +++ b/cookiecutter.json @@ -5,7 +5,6 @@ "author_name": "Your Name", "domain_name": "example.com", "email": "{{ cookiecutter.author_name.lower()|replace(' ', '-') }}@example.com", - "version": "0.1.0", "open_source_license": [ "MIT", "BSD", diff --git a/hooks/post_gen_project.py b/hooks/post_gen_project.py index 968c0f73e..1fdd779ae 100644 --- a/hooks/post_gen_project.py +++ b/hooks/post_gen_project.py @@ -18,6 +18,52 @@ HINT = "\x1b[3;33m" SUCCESS = "\x1b[1;32m [SUCCESS]: " DEBUG_VALUE = "debug" +PROJECT_DIRECTORY = os.path.realpath(os.path.curdir) + + +def initialize_git(project_directory): + """ + Initialize the git repo. + + Args: + project_directory: + """ + import subprocess + + print("Initializing git repo...") + result = subprocess.run( + ["git", "init"], cwd=project_directory, encoding="utf8", capture_output=True + ) + if result.returncode != 0: + print("Unable to initialize the git repo.") + print(result.stdout, result.stderr) + + result = subprocess.run( + ["git", "add", "."], cwd=project_directory, encoding="utf8", capture_output=True + ) + if result.returncode != 0: + print("Unable to add all files into the git repo.") + print(result.stdout, result.stderr) + + result = subprocess.run( + ["git", "commit", '-m"Initial commit"'], + cwd=project_directory, + encoding="utf8", + capture_output=True, + ) + if result.returncode != 0: + print("Unable to make the initial commit.") + print(result.stdout, result.stderr) + + result = subprocess.run( + ["git", "tag", "0.1.0"], + cwd=project_directory, + encoding="utf8", + capture_output=True, + ) + if result.returncode != 0: + print("Unable to tag the initial commit.") + print(result.stdout, result.stderr) def remove_open_source_files(): @@ -32,20 +78,10 @@ def remove_gplv3_files(): os.remove(file_name) -def remove_pycharm_files(): - idea_dir_path = ".idea" - if os.path.exists(idea_dir_path): - shutil.rmtree(idea_dir_path) - - docs_dir_path = os.path.join("docs", "pycharm") - if os.path.exists(docs_dir_path): - shutil.rmtree(docs_dir_path) - - def remove_docker_files(): shutil.rmtree("compose") - file_names = ["dev.yml", ".dockerignore"] + file_names = ["local.yml", ".dockerignore"] for file_name in file_names: os.remove(file_name) @@ -146,20 +182,8 @@ def set_django_secret_key(file_path): return django_secret_key -def set_django_admin_url(file_path): - django_admin_url = set_flag( - file_path, - "!!!SET DJANGO_ADMIN_URL!!!", - formatted="{}/", - length=32, - using_digits=True, - using_ascii_letters=True, - ) - return django_admin_url - - def generate_random_user(): - return generate_random_string(length=32, using_ascii_letters=True) + return generate_random_string(length=10, using_ascii_letters=True) def generate_postgres_user(debug=False): @@ -209,36 +233,23 @@ def append_to_gitignore_file(s): def set_flags_in_envs(postgres_user, celery_flower_user, debug=False): - local_django_envs_path = os.path.join(".envs", "dev", "django") production_django_envs_path = os.path.join(".envs", "prod", "django") - local_postgres_envs_path = os.path.join(".envs", "dev", "postgres") - + dev_postgres_env_path = os.path.join(".envs", "dev", "postgres") + pg_pass = set_postgres_password(dev_postgres_env_path) + set_flag(production_django_envs_path, "!!!SET POSTGRES_PASSWORD!!!", value=pg_pass) set_django_secret_key(production_django_envs_path) - set_django_admin_url(production_django_envs_path) - - set_postgres_user(local_postgres_envs_path, value=postgres_user) - set_postgres_password( - local_postgres_envs_path, value=DEBUG_VALUE if debug else None - ) - - set_celery_flower_user(local_django_envs_path, value=celery_flower_user) - set_celery_flower_password( - local_django_envs_path, value=DEBUG_VALUE if debug else None - ) set_celery_flower_user(production_django_envs_path, value=celery_flower_user) - set_celery_flower_password( - production_django_envs_path, value=DEBUG_VALUE if debug else None - ) + set_celery_flower_password(production_django_envs_path) def set_flags_in_settings_files(): - set_django_secret_key( - os.path.join("{{ cookiecutter.project_slug }}", "settings", "dev_template.py") - ) set_django_secret_key( os.path.join("{{ cookiecutter.project_slug }}", "settings", "test.py") ) +def remove_storage(): + os.remove(os.path.join("{{ cookiecutter.project_slug }}", "storage.py")) + def remove_envs_and_associated_files(): shutil.rmtree(".envs") @@ -250,6 +261,12 @@ def create_dev_settings(): os.path.join("{{ cookiecutter.project_slug }}", "settings", "dev_template.py"), os.path.join("{{ cookiecutter.project_slug }}", "settings", "dev.py"), ) + shutil.copy(os.path.join(".envs", "prod", "django"), ".env") + set_flag( + ".env", + "DJANGO_SETTINGS_MODULE=test_project.settings.prod", + value="DJANGO_SETTINGS_MODULE=test_project.settings", + ) def main(): @@ -263,14 +280,14 @@ def main(): if "{{ cookiecutter.open_source_license}}" != "GPLv3": remove_gplv3_files() - append_to_gitignore_file(".env") - append_to_gitignore_file(".envs/*") - if "{{ cookiecutter.cloud_provider}}".lower() == "none": print( WARNING + "You chose not to use a cloud provider, " "media files won't be served in production." + TERMINATOR ) + remove_storage() + elif "{{ cookiecutter.cloud_provider}}".lower() == "GCP": + remove_storage() if "{{ cookiecutter.use_celery }}".lower() == "n": remove_celery_files() @@ -278,6 +295,8 @@ def main(): if "{{ cookiecutter.use_travisci }}".lower() == "n": remove_dottravisyml_file() + initialize_git(PROJECT_DIRECTORY) + print(SUCCESS + "Project initialized, keep up the good work!" + TERMINATOR) diff --git a/{{cookiecutter.project_slug}}/.envs/dev/django b/{{cookiecutter.project_slug}}/.envs/dev/django deleted file mode 100644 index 919f31185..000000000 --- a/{{cookiecutter.project_slug}}/.envs/dev/django +++ /dev/null @@ -1,17 +0,0 @@ -# General -# ------------------------------------------------------------------------------ -USE_DOCKER=yes -IPYTHONDIR=/app/.ipython - -{%- if cookiecutter.use_celery == 'y' %} -# Redis -# ------------------------------------------------------------------------------ -REDIS_URL=redis://redis:6379/0 - -# Celery -# ------------------------------------------------------------------------------ - -# Flower -CELERY_FLOWER_USER=!!!SET CELERY_FLOWER_USER!!! -CELERY_FLOWER_PASSWORD=!!!SET CELERY_FLOWER_PASSWORD!!! -{% endif %} diff --git a/{{cookiecutter.project_slug}}/.envs/dev/postgres b/{{cookiecutter.project_slug}}/.envs/dev/postgres index f190db8e6..eced92192 100644 --- a/{{cookiecutter.project_slug}}/.envs/dev/postgres +++ b/{{cookiecutter.project_slug}}/.envs/dev/postgres @@ -1,7 +1,6 @@ -# PostgreSQL -# ------------------------------------------------------------------------------ -POSTGRES_HOST=postgres -POSTGRES_PORT=5432 -POSTGRES_DB={{ cookiecutter.project_slug }} -POSTGRES_USER=!!!SET POSTGRES_USER!!! POSTGRES_PASSWORD=!!!SET POSTGRES_PASSWORD!!! +# PGDATA=/var/lib/postgresql/data +# POSTGRES_INITDB_WALDIR= +# POSTGRES_INITDB_ARGS= +# POSTGRES_USER=postgres +# POSTGRES_DB=postgres diff --git a/{{cookiecutter.project_slug}}/.envs/prod/django b/{{cookiecutter.project_slug}}/.envs/prod/django index 2c2e94f2d..895ab6cb3 100644 --- a/{{cookiecutter.project_slug}}/.envs/prod/django +++ b/{{cookiecutter.project_slug}}/.envs/prod/django @@ -1,32 +1,47 @@ # General # ------------------------------------------------------------------------------ -# DJANGO_READ_DOT_ENV_FILE=True -DJANGO_SETTINGS_MODULE=config.settings.production +DJANGO_SETTINGS_MODULE={{ cookiecutter.project_slug }}.settings.prod DJANGO_SECRET_KEY=!!!SET DJANGO_SECRET_KEY!!! -DJANGO_ADMIN_URL=!!!SET DJANGO_ADMIN_URL!!! +DJANGO_ADMIN_URL=admin/ DJANGO_ALLOWED_HOSTS=.{{ cookiecutter.domain_name }} +DJANGO_DEBUG=False + +DATABASE_URL=postgres://postgres:!!!SET POSTGRES_PASSWORD!!!@localhost/{{ cookiecutter.project_slug }} # Security # ------------------------------------------------------------------------------ # TIP: better off using DNS, however, redirect is OK too DJANGO_SECURE_SSL_REDIRECT=False +DJANGO_SECURE_HSTS_INCLUDE_SUBDOMAINS=True +DJANGO_SECURE_HSTS_PRELOAD=True +DJANGO_SECURE_CONTENT_TYPE_NOSNIFF=True # Email # ------------------------------------------------------------------------------ -MAILGUN_API_KEY= DJANGO_SERVER_EMAIL= -MAILGUN_DOMAIN= +DJANGO_EMAIL_BACKEND=django.core.mail.backends.smtp.EmailBackend +EMAIL_HOST=localhost +EMAIL_HOST_USER= +EMAIL_HOST_PASSWORD= +EMAIL_PORT=25 +DJANGO_EMAIL_SUBJECT_PREFIX="[{{cookiecutter.project_name}}]" + {% if cookiecutter.cloud_provider == 'AWS' %} # AWS # ------------------------------------------------------------------------------ DJANGO_AWS_ACCESS_KEY_ID= DJANGO_AWS_SECRET_ACCESS_KEY= DJANGO_AWS_STORAGE_BUCKET_NAME= +DJANGO_AWS_S3_REGION_NAME= {% elif cookiecutter.cloud_provider == 'GCP' %} # GCP # ------------------------------------------------------------------------------ GOOGLE_APPLICATION_CREDENTIALS= DJANGO_GCP_STORAGE_BUCKET_NAME= +{% elif cookiecutter.cloud_provider == 'Azure' %} +DJANGO_AZURE_ACCOUNT_NAME= +DJANGO_AZURE_ACCOUNT_KEY= +DJANGO_AZURE_CONTAINER= {% endif %} # django-allauth # ------------------------------------------------------------------------------ @@ -43,15 +58,16 @@ WEB_CONCURRENCY=4 # Sentry # ------------------------------------------------------------------------------ SENTRY_DSN= +# SENTRY_LOG_LEVEL= {% endif %} # Redis # ------------------------------------------------------------------------------ -REDIS_URL=redis://redis:6379/0 +REDIS_URL=redis://localhost:6379/0 {% if cookiecutter.use_celery == 'y' %} # Celery # ------------------------------------------------------------------------------ - +CELERY_BROKER_URL=redis://localhost:6379/0 # Flower CELERY_FLOWER_USER=!!!SET CELERY_FLOWER_USER!!! CELERY_FLOWER_PASSWORD=!!!SET CELERY_FLOWER_PASSWORD!!! diff --git a/{{cookiecutter.project_slug}}/.idea/runConfigurations/merge_production_dotenvs_in_dotenv.xml b/{{cookiecutter.project_slug}}/.idea/runConfigurations/merge_production_dotenvs_in_dotenv.xml index cf2c5dd89..293eafe90 100644 --- a/{{cookiecutter.project_slug}}/.idea/runConfigurations/merge_production_dotenvs_in_dotenv.xml +++ b/{{cookiecutter.project_slug}}/.idea/runConfigurations/merge_production_dotenvs_in_dotenv.xml @@ -12,7 +12,7 @@