mirror of
https://github.com/cookiecutter/cookiecutter-django.git
synced 2025-08-08 05:54:53 +03:00
Merge branch 'master' into adopt-a-better-approach-to-env-variable-handing-with-docker
This commit is contained in:
commit
dcff7330f4
|
@ -89,6 +89,7 @@ Listed in alphabetical order.
|
|||
Dong Huynh `@trungdong`_
|
||||
Emanuel Calso `@bloodpet`_ @bloodpet
|
||||
Eraldo Energy `@eraldo`_
|
||||
Eric Groom `@ericgroom`_
|
||||
Eyad Al Sibai `@eyadsibai`_
|
||||
Felipe Arruda `@arruda`_
|
||||
Garry Cairns `@garry-cairns`_
|
||||
|
|
|
@ -15,7 +15,7 @@ If you don't already have it, install `compass` (doesn't hurt if you run this co
|
|||
|
||||
Now you just need::
|
||||
|
||||
$ grunt serve
|
||||
$ 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.
|
||||
|
||||
|
|
6
tox.ini
6
tox.ini
|
@ -3,9 +3,5 @@ skipsdist = true
|
|||
envlist = py36
|
||||
|
||||
[testenv]
|
||||
deps =
|
||||
binaryornot
|
||||
flake8==2.5.5
|
||||
pytest-cookies
|
||||
sh
|
||||
deps = -rrequirements.txt
|
||||
commands = pytest {posargs:./tests}
|
||||
|
|
|
@ -92,7 +92,7 @@ module.exports = function (grunt) {
|
|||
|
||||
processors: [
|
||||
require('pixrem')(), // add fallbacks for rem units
|
||||
require('autoprefixer-core')({browsers: [
|
||||
require('autoprefixer')({browsers: [
|
||||
'Android 2.3',
|
||||
'Android >= 4',
|
||||
'Chrome >= 20',
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
from .base import * # noqa
|
||||
from .base import env
|
||||
|
||||
# GENERAL
|
||||
# ------------------------------------------------------------------------------
|
||||
|
@ -25,7 +26,7 @@ CACHES = {
|
|||
# TEMPLATES
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/dev/ref/settings/#templates
|
||||
TEMPLATES[0]['OPTIONS']['debug'] = DEBUG
|
||||
TEMPLATES[0]['OPTIONS']['debug'] = DEBUG # noqa F405
|
||||
|
||||
# EMAIL
|
||||
# ------------------------------------------------------------------------------
|
||||
|
@ -47,9 +48,9 @@ EMAIL_PORT = 1025
|
|||
# django-debug-toolbar
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://django-debug-toolbar.readthedocs.io/en/latest/installation.html#prerequisites
|
||||
INSTALLED_APPS += ['debug_toolbar']
|
||||
INSTALLED_APPS += ['debug_toolbar'] # noqa F405
|
||||
# https://django-debug-toolbar.readthedocs.io/en/latest/installation.html#middleware
|
||||
MIDDLEWARE += ['debug_toolbar.middleware.DebugToolbarMiddleware']
|
||||
MIDDLEWARE += ['debug_toolbar.middleware.DebugToolbarMiddleware'] # noqa F405
|
||||
# https://django-debug-toolbar.readthedocs.io/en/latest/configuration.html#debug-toolbar-config
|
||||
DEBUG_TOOLBAR_CONFIG = {
|
||||
'DISABLE_PANELS': [
|
||||
|
@ -70,7 +71,7 @@ if os.environ.get('USE_DOCKER') == 'yes':
|
|||
# django-extensions
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://django-extensions.readthedocs.io/en/latest/installation_instructions.html#configuration
|
||||
INSTALLED_APPS += ['django_extensions']
|
||||
INSTALLED_APPS += ['django_extensions'] # noqa F405
|
||||
{% if cookiecutter.use_celery == 'y' -%}
|
||||
|
||||
# Celery
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import logging
|
||||
|
||||
from .base import * # noqa
|
||||
from .base import env
|
||||
|
||||
# GENERAL
|
||||
# ------------------------------------------------------------------------------
|
||||
|
@ -11,16 +12,16 @@ ALLOWED_HOSTS = env.list('DJANGO_ALLOWED_HOSTS', default=['{{ cookiecutter.domai
|
|||
|
||||
# DATABASES
|
||||
# ------------------------------------------------------------------------------
|
||||
DATABASES['default'] = env.db('DATABASE_URL')
|
||||
DATABASES['default']['ATOMIC_REQUESTS'] = True
|
||||
DATABASES['default']['CONN_MAX_AGE'] = env.int('CONN_MAX_AGE', default=60)
|
||||
DATABASES['default'] = env.db('DATABASE_URL') # noqa F405
|
||||
DATABASES['default']['ATOMIC_REQUESTS'] = True # noqa F405
|
||||
DATABASES['default']['CONN_MAX_AGE'] = env.int('CONN_MAX_AGE', default=60) # noqa F405
|
||||
|
||||
# CACHES
|
||||
# ------------------------------------------------------------------------------
|
||||
CACHES = {
|
||||
'default': {
|
||||
'BACKEND': 'django_redis.cache.RedisCache',
|
||||
'LOCATION': "{}/0".format(env('REDIS_URL', default='redis://127.0.0.1:6379')),
|
||||
'LOCATION': f'{env("REDIS_URL", default="redis://127.0.0.1:6379")}/{0}',
|
||||
'OPTIONS': {
|
||||
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
|
||||
# Mimicing memcache behavior.
|
||||
|
@ -62,7 +63,7 @@ X_FRAME_OPTIONS = 'DENY'
|
|||
# STORAGES
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://django-storages.readthedocs.io/en/latest/#installation
|
||||
INSTALLED_APPS += ['storages']
|
||||
INSTALLED_APPS += ['storages'] # noqa F405
|
||||
# https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#settings
|
||||
AWS_ACCESS_KEY_ID = env('DJANGO_AWS_ACCESS_KEY_ID')
|
||||
# https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#settings
|
||||
|
@ -77,7 +78,7 @@ AWS_QUERYSTRING_AUTH = False
|
|||
_AWS_EXPIRY = 60 * 60 * 24 * 7
|
||||
# https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#settings
|
||||
AWS_S3_OBJECT_PARAMETERS = {
|
||||
'CacheControl': 'max-age=%d, s-maxage=%d, must-revalidate' % (_AWS_EXPIRY, _AWS_EXPIRY),
|
||||
'CacheControl': f'max-age={_AWS_EXPIRY}, s-maxage={_AWS_EXPIRY}, must-revalidate',
|
||||
}
|
||||
|
||||
# STATIC
|
||||
|
@ -93,7 +94,7 @@ STATIC_URL = 'https://s3.amazonaws.com/%s/static/' % AWS_STORAGE_BUCKET_NAME
|
|||
# ------------------------------------------------------------------------------
|
||||
{% if cookiecutter.use_whitenoise == 'y' -%}
|
||||
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
|
||||
MEDIA_URL = 'https://s3.amazonaws.com/%s/' % AWS_STORAGE_BUCKET_NAME
|
||||
MEDIA_URL = f'https://s3.amazonaws.com/{AWS_STORAGE_BUCKET_NAME}/'
|
||||
{%- else %}
|
||||
# region http://stackoverflow.com/questions/10390244/
|
||||
from storages.backends.s3boto3 import S3Boto3Storage
|
||||
|
@ -101,13 +102,13 @@ StaticRootS3BotoStorage = lambda: S3Boto3Storage(location='static') # noqa
|
|||
MediaRootS3BotoStorage = lambda: S3Boto3Storage(location='media', file_overwrite=False) # noqa
|
||||
# endregion
|
||||
DEFAULT_FILE_STORAGE = 'config.settings.production.MediaRootS3BotoStorage'
|
||||
MEDIA_URL = 'https://s3.amazonaws.com/%s/media/' % AWS_STORAGE_BUCKET_NAME
|
||||
MEDIA_URL = f'https://s3.amazonaws.com/{AWS_STORAGE_BUCKET_NAME}/media/'
|
||||
{%- endif %}
|
||||
|
||||
# TEMPLATES
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/dev/ref/settings/#templates
|
||||
TEMPLATES[0]['OPTIONS']['loaders'] = [
|
||||
TEMPLATES[0]['OPTIONS']['loaders'] = [ # noqa F405
|
||||
(
|
||||
'django.template.loaders.cached.Loader',
|
||||
[
|
||||
|
@ -137,7 +138,7 @@ ADMIN_URL = env('DJANGO_ADMIN_URL')
|
|||
# Anymail (Mailgun)
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://anymail.readthedocs.io/en/stable/installation/#installing-anymail
|
||||
INSTALLED_APPS += ['anymail']
|
||||
INSTALLED_APPS += ['anymail'] # noqa F405
|
||||
EMAIL_BACKEND = 'anymail.backends.mailgun.EmailBackend'
|
||||
# https://anymail.readthedocs.io/en/stable/installation/#anymail-settings-reference
|
||||
ANYMAIL = {
|
||||
|
@ -147,13 +148,13 @@ ANYMAIL = {
|
|||
|
||||
# Gunicorn
|
||||
# ------------------------------------------------------------------------------
|
||||
INSTALLED_APPS += ['gunicorn']
|
||||
INSTALLED_APPS += ['gunicorn'] # noqa F405
|
||||
|
||||
{% if cookiecutter.use_whitenoise == 'y' -%}
|
||||
# WhiteNoise
|
||||
# ------------------------------------------------------------------------------
|
||||
# http://whitenoise.evans.io/en/latest/django.html#enable-whitenoise
|
||||
MIDDLEWARE = ['whitenoise.middleware.WhiteNoiseMiddleware'] + MIDDLEWARE
|
||||
MIDDLEWARE = ['whitenoise.middleware.WhiteNoiseMiddleware'] + MIDDLEWARE # noqa F405
|
||||
|
||||
{%- endif %}
|
||||
{% if cookiecutter.use_compressor == 'y' -%}
|
||||
|
@ -171,7 +172,7 @@ COMPRESS_URL = STATIC_URL
|
|||
# Collectfast
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://github.com/antonagestam/collectfast#installation
|
||||
INSTALLED_APPS = ['collectfast'] + INSTALLED_APPS
|
||||
INSTALLED_APPS = ['collectfast'] + INSTALLED_APPS # noqa F405
|
||||
AWS_PRELOAD_METADATA = True
|
||||
|
||||
{%- endif %}
|
||||
|
@ -179,7 +180,7 @@ AWS_PRELOAD_METADATA = True
|
|||
# raven
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.sentry.io/clients/python/integrations/django/
|
||||
INSTALLED_APPS += ['raven.contrib.django.raven_compat']
|
||||
INSTALLED_APPS += ['raven.contrib.django.raven_compat'] # noqa F405
|
||||
MIDDLEWARE = ['raven.contrib.django.raven_compat.middleware.SentryResponseErrorIdMiddleware'] + MIDDLEWARE
|
||||
|
||||
# Sentry
|
||||
|
@ -293,7 +294,7 @@ LOGGING = {
|
|||
# opbeat
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://opbeat.com/docs/articles/get-started-with-django/#setup
|
||||
INSTALLED_APPS += ['opbeat.contrib.django']
|
||||
INSTALLED_APPS += ['opbeat.contrib.django'] # noqa F405
|
||||
# https://opbeat.com/docs/articles/get-started-with-django/#setup
|
||||
OPBEAT = {
|
||||
'ORGANIZATION_ID': env('DJANGO_OPBEAT_ORGANIZATION_ID'),
|
||||
|
|
|
@ -3,6 +3,7 @@ With these settings, tests run faster.
|
|||
"""
|
||||
|
||||
from .base import * # noqa
|
||||
from .base import env
|
||||
|
||||
# GENERAL
|
||||
# ------------------------------------------------------------------------------
|
||||
|
@ -33,8 +34,8 @@ PASSWORD_HASHERS = [
|
|||
# TEMPLATES
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/dev/ref/settings/#templates
|
||||
TEMPLATES[0]['OPTIONS']['debug'] = DEBUG
|
||||
TEMPLATES[0]['OPTIONS']['loaders'] = [
|
||||
TEMPLATES[0]['OPTIONS']['debug'] = DEBUG # noqa F405
|
||||
TEMPLATES[0]['OPTIONS']['loaders'] = [ # noqa F405
|
||||
(
|
||||
'django.template.loaders.cached.Loader',
|
||||
[
|
||||
|
|
|
@ -4,22 +4,22 @@
|
|||
"dependencies": {},
|
||||
"devDependencies": {
|
||||
{% if cookiecutter.js_task_runner == 'Grunt' %}
|
||||
"autoprefixer-core": "~5.2.1",
|
||||
"autoprefixer": "~8.1.0",
|
||||
{% if cookiecutter.custom_bootstrap_compilation == 'y' %}
|
||||
"bootstrap": "^4.0.0",
|
||||
{% endif %}
|
||||
"connect-livereload": "~0.3.2",
|
||||
"cssnano": "~2.1.0",
|
||||
"grunt": "~0.4.5",
|
||||
"connect-livereload": "~0.6.0",
|
||||
"cssnano": "~3.10.0",
|
||||
"grunt": "~1.0.2",
|
||||
"grunt-bg-shell": "~2.3.1",
|
||||
"grunt-contrib-watch": "~0.6.1",
|
||||
"grunt-postcss": "~0.5.5",
|
||||
"grunt-sass": "~1.0.0",
|
||||
"grunt-contrib-watch": "~1.0.0",
|
||||
"grunt-postcss": "~0.9.0",
|
||||
"grunt-sass": "~2.1.0",
|
||||
{% if cookiecutter.custom_bootstrap_compilation == 'y' %}
|
||||
"jquery": "^3.2.1-slim",
|
||||
{% endif %}
|
||||
"load-grunt-tasks": "~3.2.0",
|
||||
"pixrem": "~1.3.1",
|
||||
"pixrem": "~4.0.1",
|
||||
{% if cookiecutter.custom_bootstrap_compilation == 'y' %}
|
||||
"popper.js": "^1.12.3",
|
||||
{% endif %}
|
||||
|
@ -31,26 +31,34 @@
|
|||
"browser-sync": "^2.14.0",
|
||||
"del": "^2.2.2",
|
||||
"gulp": "^3.9.1",
|
||||
"gulp-autoprefixer": "^3.1.1",
|
||||
"gulp-autoprefixer": "^5.0.0",
|
||||
{% if cookiecutter.custom_bootstrap_compilation == 'y' %}
|
||||
"gulp-concat": "^2.6.1",
|
||||
{% endif %}
|
||||
"gulp-cssnano": "^2.1.2",
|
||||
"gulp-imagemin": "^3.0.3",
|
||||
"gulp-imagemin": "^4.1.0",
|
||||
"gulp-pixrem": "^1.0.0",
|
||||
"gulp-plumber": "^1.1.0",
|
||||
"gulp-rename": "^1.2.2",
|
||||
"gulp-sass": "^2.3.2",
|
||||
"gulp-uglify": "^2.0.0",
|
||||
"gulp-sass": "^3.1.0",
|
||||
"gulp-uglify": "^3.0.0",
|
||||
"gulp-util": "^3.0.7",
|
||||
{% if cookiecutter.custom_bootstrap_compilation == 'y' %}
|
||||
"jquery": "^3.2.1-slim",
|
||||
"popper.js": "^1.12.3",
|
||||
{% endif %}
|
||||
"run-sequence": "^1.2.2"
|
||||
"run-sequence": "^2.1.1"
|
||||
{% endif %}
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.8.0"
|
||||
},
|
||||
"scripts": {
|
||||
{% if cookiecutter.js_task_runner == 'Grunt' %}
|
||||
"dev": "grunt serve"
|
||||
{% elif cookiecutter.js_task_runner == 'Gulp' %}
|
||||
"dev": "gulp"
|
||||
{% endif %}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# Conservative Django
|
||||
django==2.0.2 # pyup: < 2.1
|
||||
django==2.0.3 # pyup: < 2.1
|
||||
|
||||
# Configuration
|
||||
django-environ==0.4.4
|
||||
|
|
|
@ -66,7 +66,7 @@ class CeleryConfig(AppConfig):
|
|||
try:
|
||||
opbeat_register_signal(opbeat_client)
|
||||
except Exception as e:
|
||||
opbeat_logger.exception('Failed installing celery hook: %s' % e)
|
||||
opbeat_logger.exception(f'Failed installing celery hook: {e}')
|
||||
|
||||
if 'opbeat.contrib.django' in settings.INSTALLED_APPS:
|
||||
opbeat_register_handlers()
|
||||
|
@ -75,7 +75,7 @@ class CeleryConfig(AppConfig):
|
|||
|
||||
@app.task(bind=True)
|
||||
def debug_task(self):
|
||||
print('Request: {0!r}'.format(self.request)) # pragma: no cover
|
||||
print(f'Request: {self.request!r}') # pragma: no cover
|
||||
{% else %}
|
||||
# Use this as a starting point for your project with celery.
|
||||
# If you are not using celery, you can remove this app
|
||||
|
|
|
@ -10,4 +10,7 @@ class UsersConfig(AppConfig):
|
|||
Users system checks
|
||||
Users signal registration
|
||||
"""
|
||||
pass
|
||||
try:
|
||||
import users.signals # noqa F401
|
||||
except ImportError:
|
||||
pass
|
||||
|
|
|
@ -2,8 +2,8 @@ import factory
|
|||
|
||||
|
||||
class UserFactory(factory.django.DjangoModelFactory):
|
||||
username = factory.Sequence(lambda n: 'user-{0}'.format(n))
|
||||
email = factory.Sequence(lambda n: 'user-{0}@example.com'.format(n))
|
||||
username = factory.Sequence(lambda n: f'user-{n}')
|
||||
email = factory.Sequence(lambda n: f'user-{n}@example.com')
|
||||
password = factory.PostGenerationMethodCall('set_password', 'password')
|
||||
|
||||
class Meta:
|
||||
|
|
Loading…
Reference in New Issue
Block a user