Files
mayan-edms/mayan/settings/base.py
Roberto Rosario b83ab1b528 Improve how settings are loaded from config file
Update the way settings are loaded. Instead of loading the
entire config file now settings are loaded from the config
file on demand when the cache misses.

Improve the smart settings classes tests and add another test
for the config file loading.

Add support for variable config file path.

Signed-off-by: Roberto Rosario <Roberto.Rosario@mayan-edms.com>
2018-12-15 21:00:51 -04:00

352 lines
9.7 KiB
Python

"""
Django settings for mayan10 project.
Generated by 'django-admin startproject' using Django 1.10.4.
For more information on this file, see
https://docs.djangoproject.com/en/1.10/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.10/ref/settings/
"""
from __future__ import unicode_literals
import os
import sys
from django.utils.translation import ugettext_lazy as _
from mayan.apps.smart_settings.literals import DJANGO_SETTINGS_LIST
from mayan.apps.smart_settings.utils import (
get_environment_variables, read_configuration_file, yaml_loads
)
from .literals import (
CONFIGURATION_FILENAME, CONFIGURATION_LAST_GOOD_FILENAME,
DEFAULT_SECRET_KEY, SECRET_KEY_FILENAME, SYSTEM_DIR
)
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/
MEDIA_ROOT = os.environ.get(
'MAYAN_MEDIA_ROOT', os.path.join(BASE_DIR, 'media')
)
# SECURITY WARNING: keep the secret key used in production secret!
environment_secret_key = os.environ.get('MAYAN_SECRET_KEY')
if environment_secret_key:
SECRET_KEY = environment_secret_key
else:
try:
with open(os.path.join(MEDIA_ROOT, SYSTEM_DIR, SECRET_KEY_FILENAME)) as file_object:
SECRET_KEY = file_object.read().strip()
except IOError:
SECRET_KEY = DEFAULT_SECRET_KEY
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = yaml_loads(os.environ.get('MAYAN_DEBUG', 'false'))
ALLOWED_HOSTS = ['127.0.0.1', 'localhost', '[::1]']
# Application definition
INSTALLED_APPS = (
# Placed at the top so it can override any template
'mayan.apps.appearance',
# Django
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.messages',
'django.contrib.sessions',
'django.contrib.sites',
'whitenoise.runserver_nostatic',
'django.contrib.staticfiles',
# 3rd party
'actstream',
'colorful',
'corsheaders',
'djcelery',
'formtools',
'mathfilters',
'mptt',
'pure_pagination',
'rest_framework',
'rest_framework.authtoken',
'solo',
'stronghold',
'widget_tweaks',
# Base apps
'mayan.apps.acls',
'mayan.apps.authentication',
'mayan.apps.autoadmin',
'mayan.apps.common',
'mayan.apps.converter',
'mayan.apps.django_gpg',
'mayan.apps.dynamic_search',
'mayan.apps.events',
'mayan.apps.file_caching',
'mayan.apps.lock_manager',
'mayan.apps.mimetype',
'mayan.apps.navigation',
'mayan.apps.permissions',
'mayan.apps.smart_settings',
'mayan.apps.user_management',
# Document apps
'mayan.apps.cabinets',
'mayan.apps.checkouts',
'mayan.apps.document_comments',
'mayan.apps.document_indexing',
'mayan.apps.document_parsing',
'mayan.apps.document_signatures',
'mayan.apps.document_states',
'mayan.apps.documents',
'mayan.apps.file_metadata',
'mayan.apps.linking',
'mayan.apps.mailer',
'mayan.apps.mayan_statistics',
'mayan.apps.metadata',
'mayan.apps.mirroring',
'mayan.apps.motd',
'mayan.apps.ocr',
'mayan.apps.rest_api',
'mayan.apps.sources',
'mayan.apps.storage',
'mayan.apps.tags',
'mayan.apps.task_manager',
# Placed after rest_api to allow template overriding
'drf_yasg',
)
MIDDLEWARE = (
'mayan.apps.common.middleware.error_logging.ErrorLoggingMiddleware',
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.locale.LocaleMiddleware',
'mayan.apps.common.middleware.timezone.TimezoneMiddleware',
'stronghold.middleware.LoginRequiredMiddleware',
'mayan.apps.common.middleware.ajax_redirect.AjaxRedirect',
)
ROOT_URLCONF = 'mayan.urls'
TEMPLATES = (
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'OPTIONS': {
'context_processors': [
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'django.template.context_processors.debug',
'django.template.context_processors.i18n',
'django.template.context_processors.request',
],
'loaders': [
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader'
]
},
},
)
WSGI_APPLICATION = 'mayan.wsgi.application'
# Password validation
# https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators
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',
},
]
# Internationalization
# https://docs.djangoproject.com/en/1.10/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.10/howto/static-files/
STATIC_URL = '/static/'
# ------------ Custom settings section ----------
LANGUAGES = (
('ar', _('Arabic')),
('bg', _('Bulgarian')),
('bs', _('Bosnian (Bosnia and Herzegovina)')),
('da', _('Danish')),
('de', _('German (Germany)')),
('en', _('English')),
('es', _('Spanish')),
('fa', _('Persian')),
('fr', _('French')),
('hu', _('Hungarian')),
('hr', _('Croatian')),
('id', _('Indonesian')),
('it', _('Italian')),
('nl', _('Dutch (Netherlands)')),
('pl', _('Polish')),
('pt', _('Portuguese')),
('pt-br', _('Portuguese (Brazil)')),
('ro', _('Romanian (Romania)')),
('ru', _('Russian')),
('sl', _('Slovenian')),
('tr', _('Turkish')),
('vi', _('Vietnamese (Viet Nam)')),
('zh-cn', _('Chinese (China)')),
)
SITE_ID = 1
STATIC_ROOT = os.environ.get(
'MAYAN_STATIC_ROOT', os.path.join(MEDIA_ROOT, 'static')
)
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
TEST_RUNNER = 'mayan.apps.common.tests.runner.MayanTestRunner'
# --------- Django -------------------
LOGIN_URL = yaml_loads(
os.environ.get('MAYAN_LOGIN_URL', 'authentication:login_view')
)
LOGIN_REDIRECT_URL = yaml_loads(
os.environ.get('MAYAN_LOGIN_REDIRECT_URL', 'common:root')
)
INTERNAL_IPS = ('127.0.0.1',)
# ---------- Django REST framework -----------
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.BasicAuthentication',
),
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10,
}
# --------- Pagination --------
PAGINATION_SETTINGS = {
'PAGE_RANGE_DISPLAYED': 8,
'MARGIN_PAGES_DISPLAYED': 2,
}
# ----------- Celery ----------
CELERY_ACCEPT_CONTENT = ('json',)
CELERY_BEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
CELERY_ENABLE_UTC = True
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_CREATE_MISSING_QUEUES = False
CELERY_TASK_EAGER_PROPAGATES = False
CELERY_TASK_QUEUES = []
CELERY_TASK_ROUTES = {}
CELERY_TASK_SERIALIZER = 'json'
CELERY_TIMEZONE = 'UTC'
CELERY_WORKER_DISABLE_RATE_LIMITS = True
# ------------ CORS ------------
CORS_ORIGIN_ALLOW_ALL = True
# ------ Timezone --------
TIMEZONE_COOKIE_NAME = 'django_timezone'
TIMEZONE_SESSION_KEY = 'django_timezone'
# ----- Stronghold -------
STRONGHOLD_PUBLIC_URLS = (r'^/docs/.+$',)
# ----- Swagger --------
SWAGGER_SETTINGS = {
'DEFAULT_INFO': 'rest_api.schemas.openapi_info',
'DEFAULT_MODEL_DEPTH': 1,
'DOC_EXPANSION': 'None',
}
# ----- AJAX REDIRECT -----
AJAX_REDIRECT_CODE = 278
# ----- Celery -----
CELERY_BROKER_URL = os.environ.get('MAYAN_CELERY_BROKER_URL')
CELERY_TASK_ALWAYS_EAGER = yaml_loads(
os.environ.get('MAYAN_CELERY_TASK_ALWAYS_EAGER', 'false')
)
CELERY_RESULT_BACKEND = os.environ.get('MAYAN_CELERY_RESULT_BACKEND')
# ----- Database -----
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(MEDIA_ROOT, 'db.sqlite3'),
}
}
CONFIGURATION_FILEPATH = os.environ.get(
'MAYAN_CONFIGURATION_FILEPATH', os.path.join(
MEDIA_ROOT, CONFIGURATION_FILENAME
)
)
CONFIGURATION_LAST_GOOD_FILEPATH = os.environ.get(
'MAYAN_CONFIGURATION_LAST_GOOD_FILEPATH', os.path.join(
MEDIA_ROOT, CONFIGURATION_LAST_GOOD_FILENAME
)
)
if 'revertsettings' not in sys.argv:
configuration_result = read_configuration_file(CONFIGURATION_FILEPATH)
environment_result = get_environment_variables()
for setting in DJANGO_SETTINGS_LIST:
if setting in configuration_result:
globals().update({setting: configuration_result[setting]})
elif setting in environment_result:
globals().update({setting: environment_result[setting]})