Created
February 6, 2017 02:30
-
-
Save pszpetkowski/6a6080bd63a7ce0a3009f308c00a1838 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
import pathlib | |
import sys | |
import dj_database_url | |
class SettingsBase(type): | |
"""Class-based settings meta class""" | |
def __new__(mcs, classname, bases, classdict): | |
for key in list(classdict): | |
fail_conditions = ( | |
type(key) != str or | |
not key[0].isalnum() or | |
'__call__' in dir(classdict[key]) or | |
isinstance(classdict[key], classmethod) | |
) | |
if fail_conditions: | |
continue | |
classdict[key.upper()] = classdict[key] | |
return type.__new__(mcs, classname, bases, classdict) | |
class Settings(metaclass=SettingsBase): | |
# Django base settings | |
site_id = 1 | |
root_urlconf = 'config.urls' | |
base_dir = pathlib.Path(__file__).parents[2].resolve() | |
atomic_requests = True | |
debug = None | |
wsgi_application = 'config.wsgi.application' | |
@property | |
def secret_key(self): | |
return self.get_env_var('SECRET_KEY', 'totally-insecure') | |
# Apps / middleware / templates | |
@property | |
def installed_apps(self): | |
return [ | |
'django.contrib.admin', | |
'django.contrib.auth', | |
'django.contrib.contenttypes', | |
'django.contrib.sessions', | |
'django.contrib.messages', | |
'django.contrib.staticfiles', | |
'users.apps.UsersConfig', | |
] | |
@property | |
def middleware(self): | |
return [ | |
'django.middleware.security.SecurityMiddleware', | |
'django.contrib.sessions.middleware.SessionMiddleware', | |
'django.middleware.common.CommonMiddleware', | |
'django.middleware.csrf.CsrfViewMiddleware', | |
'django.contrib.auth.middleware.AuthenticationMiddleware', | |
'django.contrib.messages.middleware.MessageMiddleware', | |
'django.middleware.clickjacking.XFrameOptionsMiddleware', | |
] | |
@property | |
def templates(self): | |
return [ | |
{ | |
'BACKEND': 'django.template.backends.django.DjangoTemplates', | |
'DIRS': [str(self.base_dir / 'templates')], | |
'APP_DIRS': True, | |
'OPTIONS': { | |
'context_processors': [ | |
'django.template.context_processors.debug', | |
'django.template.context_processors.request', | |
'django.contrib.auth.context_processors.auth', | |
'django.contrib.messages.context_processors.messages', | |
], | |
}, | |
}, | |
] | |
# Databases / caches | |
@property | |
def databases(self): | |
return { | |
'default': dj_database_url.config( | |
default='postgres://user:pass@localhost:5432/db', | |
conn_max_age=600 | |
) | |
} | |
# Project config | |
auth_user_model = 'users.User' | |
auth_password_validators = [ | |
{ | |
'NAME': ('django.contrib.auth.password_validation.' | |
'UserAttributeSimilarityValidator'), | |
}, | |
{ | |
'NAME': ('django.contrib.auth.password_validation.' | |
'MinimumLengthValidator'), | |
}, | |
{ | |
'NAME': ('django.contrib.auth.password_validation.' | |
'CommonPasswordValidator'), | |
}, | |
{ | |
'NAME': ('django.contrib.auth.password_validation.' | |
'NumericPasswordValidator'), | |
}, | |
] | |
language_code = 'en-us' | |
time_zone = 'UTC' | |
use_i18n = True | |
use_l10n = True | |
use_tz = True | |
# static files | |
static_url = '/static/' | |
# helper classes | |
@classmethod | |
def get_env_var(cls, key, default=None): | |
try: | |
return os.environ[key] | |
except KeyError: | |
if default is not None: | |
return default | |
else: | |
raise ValueError( | |
'Undefined value for `{}` environment variable at {}' | |
' settings class.'.format(key, cls) | |
) | |
@classmethod | |
def load_settings(cls, module_name): | |
self = cls() | |
module = sys.modules[module_name] | |
for key in dir(self): | |
if key.upper() and not key.startswith('_'): | |
setattr(module, key, getattr(self, key)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment