From b83ab1b528e9644333584639d0a259d58eeea608 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Sat, 15 Dec 2018 21:00:51 -0400 Subject: [PATCH] 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 --- mayan/apps/smart_settings/classes.py | 10 +++++- mayan/apps/smart_settings/literals.py | 12 +++++++ mayan/apps/smart_settings/tests/literals.py | 4 +-- .../apps/smart_settings/tests/test_classes.py | 34 ++++++++++++++++--- .../smart_settings}/utils.py | 0 mayan/settings/base.py | 22 ++++++++---- mayan/settings/literals.py | 11 ------ 7 files changed, 67 insertions(+), 26 deletions(-) create mode 100644 mayan/apps/smart_settings/literals.py rename mayan/{settings => apps/smart_settings}/utils.py (100%) diff --git a/mayan/apps/smart_settings/classes.py b/mayan/apps/smart_settings/classes.py index e0615818a3..81a9700b7e 100644 --- a/mayan/apps/smart_settings/classes.py +++ b/mayan/apps/smart_settings/classes.py @@ -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 diff --git a/mayan/apps/smart_settings/literals.py b/mayan/apps/smart_settings/literals.py new file mode 100644 index 0000000000..b8ba171ff9 --- /dev/null +++ b/mayan/apps/smart_settings/literals.py @@ -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', +) diff --git a/mayan/apps/smart_settings/tests/literals.py b/mayan/apps/smart_settings/tests/literals.py index 381ddaaef2..5c0b0db1a1 100644 --- a/mayan/apps/smart_settings/tests/literals.py +++ b/mayan/apps/smart_settings/tests/literals.py @@ -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 diff --git a/mayan/apps/smart_settings/tests/test_classes.py b/mayan/apps/smart_settings/tests/test_classes.py index 517fccacdc..3ec0bbd2ba 100644 --- a/mayan/apps/smart_settings/tests/test_classes.py +++ b/mayan/apps/smart_settings/tests/test_classes.py @@ -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) + diff --git a/mayan/settings/utils.py b/mayan/apps/smart_settings/utils.py similarity index 100% rename from mayan/settings/utils.py rename to mayan/apps/smart_settings/utils.py diff --git a/mayan/settings/base.py b/mayan/settings/base.py index 9104a74664..6d3034930e 100644 --- a/mayan/settings/base.py +++ b/mayan/settings/base.py @@ -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: diff --git a/mayan/settings/literals.py b/mayan/settings/literals.py index 7cd0108d68..b30b20544b 100644 --- a/mayan/settings/literals.py +++ b/mayan/settings/literals.py @@ -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'