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>
This commit is contained in:
@@ -13,6 +13,8 @@ from django.conf import settings
|
||||
from django.utils.functional import Promise
|
||||
from django.utils.encoding import force_text, python_2_unicode_compatible
|
||||
|
||||
from .utils import read_configuration_file
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@@ -173,7 +175,13 @@ class Setting(object):
|
||||
)
|
||||
)
|
||||
else:
|
||||
self.raw_value = getattr(settings, self.global_name, self.default)
|
||||
self.raw_value = read_configuration_file(
|
||||
path=settings.CONFIGURATION_FILEPATH
|
||||
).get(
|
||||
self.global_name, getattr(
|
||||
settings, self.global_name, self.default
|
||||
)
|
||||
)
|
||||
|
||||
self.yaml = Setting.serialize_value(self.raw_value)
|
||||
self.loaded = True
|
||||
|
||||
12
mayan/apps/smart_settings/literals.py
Normal file
12
mayan/apps/smart_settings/literals.py
Normal file
@@ -0,0 +1,12 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
DJANGO_SETTINGS_LIST = (
|
||||
'ALLOWED_HOSTS', 'APPEND_SLASH', 'AUTH_PASSWORD_VALIDATORS',
|
||||
'DATA_UPLOAD_MAX_MEMORY_SIZE', 'DATABASES', 'DEBUG', 'DEFAULT_FROM_EMAIL',
|
||||
'DISALLOWED_USER_AGENTS', 'EMAIL_BACKEND', 'EMAIL_HOST',
|
||||
'EMAIL_HOST_PASSWORD', 'EMAIL_HOST_USER', 'EMAIL_PORT', 'EMAIL_TIMEOUT',
|
||||
'EMAIL_USE_SSL', 'EMAIL_USE_TLS', 'FILE_UPLOAD_MAX_MEMORY_SIZE',
|
||||
'HOME_VIEW', 'INSTALLED_APPS', 'INTERNAL_IPS', 'LANGUAGES',
|
||||
'LANGUAGE_CODE', 'LOGIN_REDIRECT_URL', 'LOGIN_URL', 'STATIC_URL',
|
||||
'STATICFILES_STORAGE', 'TIME_ZONE', 'WSGI_APPLICATION',
|
||||
)
|
||||
@@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
ENVIRONMENT_TEST_NAME = 'PAGINATE_BY'
|
||||
ENVIRONMENT_TEST_VALUE = '999999'
|
||||
TEST_SETTING_NAME = 'COMMON_PAGINATE_BY'
|
||||
TEST_SETTING_VALUE = 999999
|
||||
|
||||
@@ -2,15 +2,39 @@ from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import os
|
||||
|
||||
import yaml
|
||||
|
||||
from django.conf import settings
|
||||
|
||||
from mayan.apps.common.settings import setting_paginate_by
|
||||
from mayan.apps.common.tests import BaseTestCase
|
||||
from mayan.apps.common.utils import fs_cleanup, mkstemp
|
||||
|
||||
from .literals import ENVIRONMENT_TEST_NAME, ENVIRONMENT_TEST_VALUE
|
||||
from .literals import TEST_SETTING_NAME, TEST_SETTING_VALUE
|
||||
|
||||
|
||||
class ClassesTestCase(BaseTestCase):
|
||||
def test_config_file(self):
|
||||
test_config_file_descriptor, test_config_filename = mkstemp()
|
||||
with open(test_config_filename, mode='w') as file_object:
|
||||
file_object.write(
|
||||
yaml.safe_dump(
|
||||
{TEST_SETTING_NAME: TEST_SETTING_VALUE}
|
||||
)
|
||||
)
|
||||
|
||||
settings.CONFIGURATION_FILEPATH = test_config_filename
|
||||
setting_value = setting_paginate_by.value
|
||||
fs_cleanup(filename=test_config_filename)
|
||||
|
||||
self.assertEqual(setting_value, TEST_SETTING_VALUE)
|
||||
|
||||
def test_environment_variable(self):
|
||||
os.environ[
|
||||
'MAYAN_{}'.format(ENVIRONMENT_TEST_NAME)
|
||||
] = ENVIRONMENT_TEST_VALUE
|
||||
self.assertTrue(setting_paginate_by.value, ENVIRONMENT_TEST_VALUE)
|
||||
os.environ['MAYAN_{}'.format(TEST_SETTING_NAME)] = '{}'.format(
|
||||
TEST_SETTING_VALUE
|
||||
)
|
||||
|
||||
setting_value = setting_paginate_by.value
|
||||
os.environ.pop('MAYAN_{}'.format(TEST_SETTING_NAME))
|
||||
self.assertEqual(setting_value, TEST_SETTING_VALUE)
|
||||
|
||||
|
||||
@@ -16,12 +16,14 @@ 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, DJANGO_SETTINGS_LIST, SECRET_KEY_FILENAME, SYSTEM_DIR
|
||||
)
|
||||
from .utils import (
|
||||
get_environment_variables, read_configuration_file, yaml_loads
|
||||
DEFAULT_SECRET_KEY, SECRET_KEY_FILENAME, SYSTEM_DIR
|
||||
)
|
||||
|
||||
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
||||
@@ -327,9 +329,15 @@ DATABASES = {
|
||||
}
|
||||
}
|
||||
|
||||
CONFIGURATION_FILEPATH = os.path.join(MEDIA_ROOT, CONFIGURATION_FILENAME)
|
||||
CONFIGURATION_LAST_GOOD_FILEPATH = os.path.join(
|
||||
MEDIA_ROOT, CONFIGURATION_LAST_GOOD_FILENAME
|
||||
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:
|
||||
|
||||
@@ -1,16 +1,5 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
DJANGO_SETTINGS_LIST = (
|
||||
'ALLOWED_HOSTS', 'APPEND_SLASH', 'AUTH_PASSWORD_VALIDATORS',
|
||||
'DATA_UPLOAD_MAX_MEMORY_SIZE', 'DATABASES', 'DEBUG', 'DEFAULT_FROM_EMAIL',
|
||||
'DISALLOWED_USER_AGENTS', 'EMAIL_BACKEND', 'EMAIL_HOST',
|
||||
'EMAIL_HOST_PASSWORD', 'EMAIL_HOST_USER', 'EMAIL_PORT', 'EMAIL_TIMEOUT',
|
||||
'EMAIL_USE_SSL', 'EMAIL_USE_TLS', 'FILE_UPLOAD_MAX_MEMORY_SIZE',
|
||||
'HOME_VIEW', 'INSTALLED_APPS', 'INTERNAL_IPS', 'LANGUAGES',
|
||||
'LANGUAGE_CODE', 'LOGIN_REDIRECT_URL', 'LOGIN_URL', 'STATIC_URL',
|
||||
'STATICFILES_STORAGE', 'TIME_ZONE', 'WSGI_APPLICATION',
|
||||
)
|
||||
|
||||
DEFAULT_SECRET_KEY = 'secret-key-missing!'
|
||||
SECRET_KEY_FILENAME = 'SECRET_KEY'
|
||||
SYSTEM_DIR = 'system'
|
||||
|
||||
Reference in New Issue
Block a user