diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md index 75f6a19c6..2a48c0c32 100644 --- a/.github/ISSUE_TEMPLATE/bug.md +++ b/.github/ISSUE_TEMPLATE/bug.md @@ -17,7 +17,5 @@ about: Report a bug [//]: # (Any or all of the following:) [//]: # (* Host system configuration: OS, Docker & friends' versions etc.) -[//]: # (* Project generation options) +[//]: # (* Replay file https://cookiecutter.readthedocs.io/en/latest/advanced/replay.html) [//]: # (* Logs) - - diff --git a/CONTRIBUTORS.rst b/CONTRIBUTORS.rst index bbbfaf9a8..c17c951ef 100644 --- a/CONTRIBUTORS.rst +++ b/CONTRIBUTORS.rst @@ -103,6 +103,7 @@ Listed in alphabetical order. Hendrik Schneider `@hendrikschneider`_ Henrique G. G. Pereira `@ikkebr`_ Ian Lee `@IanLee1521`_ + Irfan Ahmad `@erfaan`_ @erfaan Jan Van Bruggen `@jvanbrug`_ Jens Nilsson `@phiberjenz`_ Jimmy Gitonga `@afrowave`_ @afrowave @@ -161,6 +162,7 @@ Listed in alphabetical order. Tom Atkins `@knitatoms`_ Tom Offermann Travis McNeill `@Travistock`_ @tavistock_esq + Umair Ashraf `@umrashrf`_ @fabumair Vitaly Babiy Vivian Guillen `@viviangb`_ Will Farley `@goldhand`_ @g01dhand @@ -205,6 +207,7 @@ Listed in alphabetical order. .. _@durkode: https://github.com/durkode .. _@epileptic-fish: https://gihub.com/epileptic-fish .. _@eraldo: https://github.com/eraldo +.. _@erfaan: https://github.com/erfaan .. _@eriol: https://github.com/eriol .. _@eyadsibai: https://github.com/eyadsibai .. _@flyudvik: https://github.com/flyudvik @@ -274,6 +277,7 @@ Listed in alphabetical order. .. _@pchiquet: https://github.com/pchiquet .. _@delneg: https://github.com/delneg .. _@purplediane: https://github.com/purplediane +.. _@umrashrf: https://github.com/umrashrf Special Thanks ~~~~~~~~~~~~~~ diff --git a/README.rst b/README.rst index b5a3e7c0e..b9e71ace2 100644 --- a/README.rst +++ b/README.rst @@ -28,8 +28,6 @@ production-ready Django projects quickly. * If you have problems with Cookiecutter Django, please open issues_ don't send emails to the maintainers. -.. _cookiecutter: https://github.com/audreyr/cookiecutter - .. _Troubleshooting: https://cookiecutter-django.readthedocs.io/en/latest/troubleshooting.html .. _528: https://github.com/pydanny/cookiecutter-django/issues/528#issuecomment-212650373 @@ -47,7 +45,7 @@ Features * Optimized development and production settings * Registration via django-allauth_ * Comes with custom user model ready to go -* Grunt build for compass and livereload +* Optional custom static build using Gulp and livereload * Send emails via Anymail_ (using Mailgun_ by default, but switchable) * Media storage using Amazon S3 * Docker support using docker-compose_ for development and production (using Caddy_ with LetsEncrypt_ support) @@ -180,10 +178,9 @@ Answer the prompts with your own desired options_. For example:: 7 - 9.3 Choose from 1, 2, 3, 4 [1]: 1 Select js_task_runner: - 1 - Gulp - 2 - Grunt - 3 - None - Choose from 1, 2, 3, 4 [1]: 1 + 1 - None + 2 - Gulp + Choose from 1, 2 [1]: 1 custom_bootstrap_compilation [n]: n Select open_source_license: 1 - MIT diff --git a/docs/developing-locally.rst b/docs/developing-locally.rst index 7885f45e8..59079453c 100644 --- a/docs/developing-locally.rst +++ b/docs/developing-locally.rst @@ -69,7 +69,7 @@ For instance, one of the packages we depend upon, ``django-allauth`` sends verif Now you have your own mail server running locally, ready to receive whatever you send it. -.. _MailHog: https://github.com/mailhog/MailHog/ +.. _`Download the latest MailHog release`: https://github.com/mailhog/MailHog/releases .. _`properly configured`: https://docs.djangoproject.com/en/dev/topics/email/#smtp-backend @@ -88,9 +88,9 @@ In production, we have Mailgun_ configured to have your back! Sass Compilation & Live Reloading --------------------------------- -If you’d like to take advantage of live reloading and Sass / Compass CSS compilation you can do so with a little bit of preparation_. +If you’d like to take advantage of live reloading and Sass compilation you can do so with a little bit of preparation_. + -.. _`Download the latest MailHog release`: https://github.com/mailhog/MailHog/releases .. _preparation: https://cookiecutter-django.readthedocs.io/en/latest/live-reloading-and-sass-compilation.html diff --git a/docs/live-reloading-and-sass-compilation.rst b/docs/live-reloading-and-sass-compilation.rst index e2007cb02..db8d681f2 100644 --- a/docs/live-reloading-and-sass-compilation.rst +++ b/docs/live-reloading-and-sass-compilation.rst @@ -1,24 +1,22 @@ Sass Compilation & Live Reloading ================================= -If you'd like to take advantage of live reloading and Sass / Compass CSS compilation you can do so with a little bit of prep work. +If you'd like to take advantage of `live reload`_ and Sass compilation: -Make sure that nodejs_ is installed. Then in the project root run:: +- Make sure that nodejs_ is installed. Then in the project root run:: $ npm install .. _nodejs: http://nodejs.org/download/ -If you don't already have it, install `compass` (doesn't hurt if you run this command twice):: - - gem install compass - -Now you just need:: +- Now you just need:: $ npm run dev The base app will now run as it would with the usual ``manage.py runserver`` but with live reloading and Sass compilation enabled. +When changing your Sass files, they will be automatically recompiled and change will be reflected in your browser without refreshing. To get live reloading to work you'll probably need to install an `appropriate browser extension`_ +.. _live reload: http://livereload.com/ .. _appropriate browser extension: http://livereload.com/extensions/ diff --git a/requirements.txt b/requirements.txt index 5d710316a..7cf49ef6a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,5 +9,5 @@ flake8==3.5.0 # Testing # ------------------------------------------------------------------------------ tox==3.2.1 -pytest==3.7.3 +pytest==3.8.0 pytest-cookies==0.3.0 diff --git a/{{cookiecutter.project_slug}}/README.rst b/{{cookiecutter.project_slug}}/README.rst index 80923cd88..49df70198 100644 --- a/{{cookiecutter.project_slug}}/README.rst +++ b/{{cookiecutter.project_slug}}/README.rst @@ -95,16 +95,25 @@ With MailHog running, to view messages that are sent by your application, open y {% else %} In development, it is often nice to be able to see emails that are being sent from your application. If you choose to use `MailHog`_ when generating the project a local SMTP server with a web interface will be available. -To start the service, make sure you have nodejs installed, and then type the following:: +#. `Download the latest MailHog release`_ for your OS. - $ npm install - $ grunt serve +#. Rename the build to ``MailHog``. -(After the first run you only need to type ``grunt serve``) This will start an email server that listens on ``127.0.0.1:1025`` in addition to starting your Django project and a watch task for live reload. +#. Copy the file to the project root. -To view messages that are sent by your application, open your browser and go to ``http://127.0.0.1:8025`` +#. Make it executable: :: -The email server will exit when you exit the Grunt task on the CLI with Ctrl+C. + $ chmod +x MailHog + +#. Spin up another terminal window and start it there: :: + + ./MailHog + +#. Check out ``_ to see how it goes. + +Now you have your own mail server running locally, ready to receive whatever you send it. + +.. _`Download the latest MailHog release`: https://github.com/mailhog/MailHog/releases {% endif %} .. _mailhog: https://github.com/mailhog/MailHog {% endif %} diff --git a/{{cookiecutter.project_slug}}/compose/production/caddy/Caddyfile b/{{cookiecutter.project_slug}}/compose/production/caddy/Caddyfile index d36632e4b..c2bf241c7 100644 --- a/{{cookiecutter.project_slug}}/compose/production/caddy/Caddyfile +++ b/{{cookiecutter.project_slug}}/compose/production/caddy/Caddyfile @@ -1,5 +1,5 @@ www.{% raw %}{$DOMAIN_NAME}{% endraw %} { - redir https://{{cookiecutter.domain_name}} + redir https://{% raw %}{$DOMAIN_NAME}{% endraw %} } {% raw %}{$DOMAIN_NAME}{% endraw %} { diff --git a/{{cookiecutter.project_slug}}/config/settings/production.py b/{{cookiecutter.project_slug}}/config/settings/production.py index 39df0cbfa..87753b552 100644 --- a/{{cookiecutter.project_slug}}/config/settings/production.py +++ b/{{cookiecutter.project_slug}}/config/settings/production.py @@ -86,23 +86,33 @@ AWS_S3_OBJECT_PARAMETERS = { {% if cookiecutter.use_whitenoise == 'y' -%} STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' {%- else %} -STATICFILES_STORAGE = 'config.settings.production.StaticRootS3BotoStorage' -STATIC_URL = f'https://s3.amazonaws.com/{AWS_STORAGE_BUCKET_NAME}/static/' +STATICFILES_STORAGE = 'config.settings.production.StaticRootS3Boto3Storage' +STATIC_URL = f'https://{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com/static/' {%- endif %} # MEDIA # ------------------------------------------------------------------------------ {% if cookiecutter.use_whitenoise == 'y' -%} DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' -MEDIA_URL = f'https://s3.amazonaws.com/{AWS_STORAGE_BUCKET_NAME}/' +MEDIA_URL = f'https://{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com/' {%- else %} # region http://stackoverflow.com/questions/10390244/ +# Full-fledge class: https://stackoverflow.com/a/18046120/104731 from storages.backends.s3boto3 import S3Boto3Storage # noqa E402 -StaticRootS3BotoStorage = lambda: S3Boto3Storage(location='static') # noqa -MediaRootS3BotoStorage = lambda: S3Boto3Storage(location='media', file_overwrite=False) # noqa + + +class StaticRootS3Boto3Storage(S3Boto3Storage): + location = 'static' + + +class MediaRootS3Boto3Storage(S3Boto3Storage): + location = 'media' + file_overwrite = False + + # endregion -DEFAULT_FILE_STORAGE = 'config.settings.production.MediaRootS3BotoStorage' -MEDIA_URL = f'https://s3.amazonaws.com/{AWS_STORAGE_BUCKET_NAME}/media/' +DEFAULT_FILE_STORAGE = 'config.settings.production.MediaRootS3Boto3Storage' +MEDIA_URL = f'https://{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com/media/' {%- endif %} # TEMPLATES @@ -154,7 +164,7 @@ INSTALLED_APPS += ['gunicorn'] # noqa F405 # WhiteNoise # ------------------------------------------------------------------------------ # http://whitenoise.evans.io/en/latest/django.html#enable-whitenoise -MIDDLEWARE = ['whitenoise.middleware.WhiteNoiseMiddleware'] + MIDDLEWARE # noqa F405 +MIDDLEWARE.insert(1, 'whitenoise.middleware.WhiteNoiseMiddleware') # noqa F405 {% endif %} {%- if cookiecutter.use_compressor == 'y' -%} diff --git a/{{cookiecutter.project_slug}}/package.json b/{{cookiecutter.project_slug}}/package.json index 4ee7df4d7..82d9afa0c 100644 --- a/{{cookiecutter.project_slug}}/package.json +++ b/{{cookiecutter.project_slug}}/package.json @@ -23,7 +23,7 @@ "gulp-uglify": "^3.0.0", "gulp-util": "^3.0.7", {% if cookiecutter.custom_bootstrap_compilation == 'y' -%} - "jquery": "3.3.1-slim", + "jquery": "3.3.1", "popper.js": "1.14.3", {% endif -%} "run-sequence": "^2.1.1" diff --git a/{{cookiecutter.project_slug}}/requirements/base.txt b/{{cookiecutter.project_slug}}/requirements/base.txt index 510ab3765..93418b5f2 100644 --- a/{{cookiecutter.project_slug}}/requirements/base.txt +++ b/{{cookiecutter.project_slug}}/requirements/base.txt @@ -1,12 +1,12 @@ pytz==2018.5 # https://github.com/stub42/pytz -python-slugify==1.2.5 # https://github.com/un33k/python-slugify +python-slugify==1.2.6 # https://github.com/un33k/python-slugify Pillow==5.2.0 # https://github.com/python-pillow/Pillow {%- if cookiecutter.use_compressor == "y" %} rcssmin==1.0.6{% if cookiecutter.windows == 'y' %} --install-option="--without-c-extensions"{% endif %} # https://github.com/ndparker/rcssmin {%- endif %} argon2-cffi==18.3.0 # https://github.com/hynek/argon2_cffi {%- if cookiecutter.use_whitenoise == 'y' %} -whitenoise==4.0 # https://github.com/evansd/whitenoise +whitenoise==4.1 # https://github.com/evansd/whitenoise {%- endif %} redis>=2.10.5 # https://github.com/antirez/redis {%- if cookiecutter.use_celery == "y" %} diff --git a/{{cookiecutter.project_slug}}/requirements/local.txt b/{{cookiecutter.project_slug}}/requirements/local.txt index 365d94b01..1b81011f3 100644 --- a/{{cookiecutter.project_slug}}/requirements/local.txt +++ b/{{cookiecutter.project_slug}}/requirements/local.txt @@ -2,7 +2,7 @@ Werkzeug==0.14.1 # https://github.com/pallets/werkzeug ipdb==0.11 # https://github.com/gotcha/ipdb -Sphinx==1.7.8 # https://github.com/sphinx-doc/sphinx +Sphinx==1.8.0 # https://github.com/sphinx-doc/sphinx {%- if cookiecutter.use_docker == 'y' %} psycopg2==2.7.4 --no-binary psycopg2 # https://github.com/psycopg/psycopg2 {%- else %} @@ -12,7 +12,7 @@ psycopg2-binary==2.7.5 # https://github.com/psycopg/psycopg2 # Testing # ------------------------------------------------------------------------------ mypy==0.620 # https://github.com/python/mypy -pytest==3.7.3 # https://github.com/pytest-dev/pytest +pytest==3.8.0 # https://github.com/pytest-dev/pytest pytest-sugar==0.9.1 # https://github.com/Frozenball/pytest-sugar # Code quality @@ -24,7 +24,7 @@ coverage==4.5.1 # https://github.com/nedbat/coveragepy # ------------------------------------------------------------------------------ factory-boy==2.11.1 # https://github.com/FactoryBoy/factory_boy -django-debug-toolbar==1.9.1 # https://github.com/jazzband/django-debug-toolbar +django-debug-toolbar==1.10.1 # https://github.com/jazzband/django-debug-toolbar django-extensions==2.1.2 # https://github.com/django-extensions/django-extensions -django-coverage-plugin==1.5.0 # https://github.com/nedbat/django_coverage_plugin -pytest-django==3.4.2 # https://github.com/pytest-dev/pytest-django +django-coverage-plugin==1.6.0 # https://github.com/nedbat/django_coverage_plugin +pytest-django==3.4.3 # https://github.com/pytest-dev/pytest-django diff --git a/{{cookiecutter.project_slug}}/requirements/production.txt b/{{cookiecutter.project_slug}}/requirements/production.txt index 21fe5bc4e..3a138303c 100644 --- a/{{cookiecutter.project_slug}}/requirements/production.txt +++ b/{{cookiecutter.project_slug}}/requirements/production.txt @@ -13,5 +13,5 @@ raven==6.9.0 # https://github.com/getsentry/raven-python # Django # ------------------------------------------------------------------------------ -django-storages[boto3]==1.6.6 # https://github.com/jschneier/django-storages -django-anymail[mailgun]==4.1 # https://github.com/anymail/django-anymail +django-storages[boto3]==1.7.1 # https://github.com/jschneier/django-storages +django-anymail[mailgun]==4.2 # https://github.com/anymail/django-anymail \ No newline at end of file