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 = [{...}]
This commit is contained in:
Benjamin Dauvergne 2018-12-18 18:42:44 +01:00
parent 605e2f4bfe
commit 8b45ce4986
5 changed files with 81 additions and 1 deletions

View File

@ -295,6 +295,7 @@ if PROJECT_NAME != 'wcs':
'hobo.multitenant.settings_loaders.SiteBaseUrl',
'hobo.multitenant.settings_loaders.CookieNames',
'hobo.multitenant.settings_loaders.SettingsJSON',
'hobo.multitenant.settings_loaders.SettingsVars',
)
# templates in <tenant>/templates

View File

@ -115,6 +115,8 @@ class KnownServices(FileBaseSettingsLoader):
tenant_settings.KNOWN_SERVICES = known_services
SETTING_PREFIX = 'SETTING_'
class TemplateVars(FileBaseSettingsLoader):
FILENAME = 'hobo.json'
@ -166,7 +168,11 @@ 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)
for key, value in variables.items():
# prevent mixing settings and template vars
if not key.startswith(SETTING_PREFIX):
tenant_settings.TEMPLATE_VARS[key] = value
if variables.get('default_from_email'):
if variables.get('global_title'):
@ -178,6 +184,30 @@ class TemplateVars(FileBaseSettingsLoader):
tenant_settings.USER_PROFILE_CONFIG = hobo_json.get('profile')
class SettingsVars(SettingsDictUpdateMixin, FileBaseSettingsLoader):
FILENAME = 'hobo.json'
@classmethod
def get_hobo_json_variables(cls, hobo_json):
variables = hobo_json.get('variables', {})
for service in hobo_json.get('services'):
if service.get('this'):
variables.update(service.get('variables') or {})
break
return variables
def update_settings_from_path(self, tenant_settings, path):
with open(path) as f:
hobo_json = json.load(f)
variables = self.get_hobo_json_variables(hobo_json)
settings_dict = {}
for key, value in variables.items():
if key.startswith(SETTING_PREFIX):
settings_dict[key[len(SETTING_PREFIX):]] = value
self.handle_settings(tenant_settings, settings_dict)
class CORSSettings(FileBaseSettingsLoader):
FILENAME = 'hobo.json'

View File

@ -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',

View File

@ -72,4 +72,13 @@ TENANT_SETTINGS_LOADERS = (
'hobo.multitenant.settings_loaders.SiteBaseUrl',
'hobo.multitenant.settings_loaders.CookieNames',
'hobo.multitenant.settings_loaders.SettingsJSON',
'hobo.multitenant.settings_loaders.SettingsVars',
)
GLOBAL1 = 0
GLOBAL2 = [1, 2, 3]
GLOBAL3 = {"z": 1}
OVERRIDE1 = 0
OVERRIDE2 = [1, 2, 3]
OVERRIDE3 = {"z": 1}

View File

@ -80,6 +80,34 @@ def test_tenant_template_vars(tenants, settings, client):
with pytest.raises(AttributeError):
django.conf.settings.TEMPLATE_VARS
def test_tenant_settings_vars(tenants, settings, client):
from hobo.multitenant.models import Tenant
django.conf.settings.clear_tenants_settings()
with utilities.patch_default_settings(settings,
TENANT_SETTINGS_LOADERS=('hobo.multitenant.settings_loaders.SettingsVars',)):
# check the setting is not defined
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):
# check it's defined when moving into the schema
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}
def test_tenant_cors_settings(tenants, settings, client):
settings.clear_tenants_settings()