From 026ea65ebbd100debd393e95ad068f8d8f158391 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Tue, 18 Dec 2018 18:42:44 +0100 Subject: [PATCH] hobo: add setting loader for variables (#28930) Variables must be prefixed with SETTING_, suffix .extend and .update are supported. Ex.: SETTING_LDAP_AUTH_SETTINGS.extend = [{...}] --- hobo/multitenant/settings_loaders.py | 12 ++++++++++-- tests_multitenant/conftest.py | 12 ++++++++++++ tests_multitenant/settings.py | 8 ++++++++ tests_multitenant/test_settings.py | 15 +++++++++++++++ 4 files changed, 45 insertions(+), 2 deletions(-) diff --git a/hobo/multitenant/settings_loaders.py b/hobo/multitenant/settings_loaders.py index 46f3ffe..13d6c79 100644 --- a/hobo/multitenant/settings_loaders.py +++ b/hobo/multitenant/settings_loaders.py @@ -116,7 +116,7 @@ class KnownServices(FileBaseSettingsLoader): tenant_settings.KNOWN_SERVICES = known_services -class TemplateVars(FileBaseSettingsLoader): +class TemplateVars(SettingsDictUpdateMixin, FileBaseSettingsLoader): FILENAME = 'hobo.json' @classmethod @@ -166,7 +166,14 @@ class TemplateVars(FileBaseSettingsLoader): tenant_settings.TEMPLATE_VARS = tenant_settings.default_settings.TEMPLATE_VARS.copy() else: tenant_settings.TEMPLATE_VARS = {} - tenant_settings.TEMPLATE_VARS.update(variables) + + settings_dict = {} + setting_prefix = 'SETTING_' + for key, value in variables.items(): + if key.startswith(setting_prefix): + settings_dict[key[len(setting_prefix):]] = value + else: + tenant_settings.TEMPLATE_VARS[key] = value if variables.get('default_from_email'): if variables.get('global_title'): @@ -176,6 +183,7 @@ class TemplateVars(FileBaseSettingsLoader): tenant_settings.DEFAULT_FROM_EMAIL = variables['default_from_email'] tenant_settings.USER_PROFILE_CONFIG = hobo_json.get('profile') + self.handle_settings(tenant_settings, settings_dict) class CORSSettings(FileBaseSettingsLoader): diff --git a/tests_multitenant/conftest.py b/tests_multitenant/conftest.py index 6ae101d..07bc0c9 100644 --- a/tests_multitenant/conftest.py +++ b/tests_multitenant/conftest.py @@ -30,6 +30,12 @@ def tenants(transactional_db, request, settings): 'hobo_test_variable': True, 'other_variable': 'foo', 'theme': 'publik', + 'SETTING_GLOBAL1': True, + 'SETTING_GLOBAL2.extend': [2, 3, 4], + 'SETTING_GLOBAL3.update': {"x": 1, "y": 2}, + 'SETTING_OVERRIDE1': False, + 'SETTING_OVERRIDE2.extend': [6, 7, 8], + 'SETTING_OVERRIDE3.update': {"a": 1, "b": 2}, }, 'services': [ {'slug': 'test', @@ -41,6 +47,12 @@ def tenants(transactional_db, request, settings): 'saml-sp-metadata-url': 'http://%s/saml/metadata' % name, 'variables': { 'other_variable': 'bar', + 'SETTING_OVERRIDE1': True, + 'SETTING_OVERRIDE2.extend': [name, 7, 8], + 'SETTING_OVERRIDE3.update': {"a": name, "b": 2}, + 'SETTING_LOCAL1': False, + 'SETTING_LOCAL2.extend': [name, 7, 8], + 'SETTING_LOCAL3.update': {"a": name, "b": 2}, } }, {'slug': 'slug-with-hyphen', diff --git a/tests_multitenant/settings.py b/tests_multitenant/settings.py index 6a43a32..ff60a6b 100644 --- a/tests_multitenant/settings.py +++ b/tests_multitenant/settings.py @@ -73,3 +73,11 @@ TENANT_SETTINGS_LOADERS = ( 'hobo.multitenant.settings_loaders.CookieNames', 'hobo.multitenant.settings_loaders.SettingsJSON', ) + +GLOBAL1 = 0 +GLOBAL2 = [1, 2, 3] +GLOBAL3 = {"z": 1} + +OVERRIDE1 = 0 +OVERRIDE2 = [1, 2, 3] +OVERRIDE3 = {"z": 1} diff --git a/tests_multitenant/test_settings.py b/tests_multitenant/test_settings.py index f01880f..78fa52c 100644 --- a/tests_multitenant/test_settings.py +++ b/tests_multitenant/test_settings.py @@ -64,6 +64,12 @@ def test_tenant_template_vars(tenants, settings, client): # check the setting is not defined with pytest.raises(AttributeError): django.conf.settings.TEMPLATE_VARS + with pytest.raises(AttributeError): + django.conf.settings.LOCAL1 + with pytest.raises(AttributeError): + django.conf.settings.LOCAL2 + with pytest.raises(AttributeError): + django.conf.settings.LOCAL3 for tenant in tenants: with tenant_context(tenant): @@ -74,6 +80,15 @@ def test_tenant_template_vars(tenants, settings, client): assert django.conf.settings.TEMPLATE_VARS['other_url'] == 'http://other.example.net' assert django.conf.settings.TEMPLATE_VARS['site_title'] == 'Test' assert django.conf.settings.TEMPLATE_VARS['other_variable'] == 'bar' + assert django.conf.settings.GLOBAL1 is True + assert django.conf.settings.GLOBAL2 == [1, 2, 3, 2, 3, 4] + assert django.conf.settings.GLOBAL3 == {'x': 1, 'y': 2, 'z': 1} + assert django.conf.settings.OVERRIDE1 is True + assert django.conf.settings.OVERRIDE2 == [1, 2, 3, tenant.domain_url, 7, 8] + assert django.conf.settings.OVERRIDE3 == {'a': tenant.domain_url, 'b': 2, 'z': 1} + assert django.conf.settings.LOCAL1 is False + assert django.conf.settings.LOCAL2 == [tenant.domain_url, 7, 8] + assert django.conf.settings.LOCAL3 == {'a': tenant.domain_url, 'b': 2} # check it's no longer defined after going back to the public schema with pytest.raises(AttributeError): -- 2.18.0