From ba8695267ecfc8db419a4f27d05b488c84091aba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Sun, 23 Sep 2018 15:14:55 +0200 Subject: [PATCH] multitenant: add loader to get settings from theme (#26636) --- hobo/multitenant/settings_loaders.py | 64 +++++++++++++++++++--------- 1 file changed, 44 insertions(+), 20 deletions(-) diff --git a/hobo/multitenant/settings_loaders.py b/hobo/multitenant/settings_loaders.py index ec3c061..955db9c 100644 --- a/hobo/multitenant/settings_loaders.py +++ b/hobo/multitenant/settings_loaders.py @@ -7,6 +7,8 @@ from django.conf import settings from django.utils.encoding import smart_bytes from django.utils.six.moves.urllib import parse as urlparse +from hobo.theme.utils import get_theme + class FileBaseSettingsLoader(object): """ @@ -33,6 +35,28 @@ class FileBaseSettingsLoader(object): raise NotImplemented +class SettingsDictUpdateMixin(object): + def do_update(self, tenant_settings, key, value): + old_value = getattr(tenant_settings, key, {}) + new_value = old_value.copy() + new_value.update(value) + setattr(tenant_settings, key, new_value) + + def do_extend(self, tenant_settings, key, value): + new_value = list(getattr(tenant_settings, key, [])) + new_value.extend(value) + setattr(tenant_settings, key, new_value) + + def handle_settings(self, tenant_settings, new_settings): + for key in new_settings: + if '.' in key: + real_key, op = key.rsplit('.', 1) + method = getattr(self, 'do_%s' % op) + method(tenant_settings, real_key, new_settings[key]) + else: + setattr(tenant_settings, key, new_settings[key]) + + class KnownServices(FileBaseSettingsLoader): FILENAME = 'hobo.json' @@ -172,6 +196,24 @@ class CORSSettings(FileBaseSettingsLoader): tenant_settings.CORS_ORIGIN_WHITELIST = whitelist +class ThemeSettings(SettingsDictUpdateMixin): + def get_new_time(self, tenant): + return 0 + + def update_settings(self, tenant_settings, tenant): + theme_id = tenant_settings.TEMPLATE_VARS.get('theme') + if not theme_id: + return + theme = get_theme(theme_id) + if not theme: + return + module_name = settings.SETTINGS_MODULE.split('.')[0] + module_settings = theme.get('settings', {}).get(module_name) + if not module_settings: + return + self.handle_settings(tenant_settings, module_settings) + + class SharedThemeSettings(FileBaseSettingsLoader): FILENAME = 'hobo.json' @@ -297,30 +339,12 @@ class SiteBaseUrl(object): # Generic loaders (not recommended) # -class SettingsJSON(FileBaseSettingsLoader): +class SettingsJSON(FileBaseSettingsLoader, SettingsDictUpdateMixin): FILENAME = 'settings.json' - def do_update(self, tenant_settings, key, value): - old_value = getattr(tenant_settings, key, {}) - new_value = old_value.copy() - new_value.update(value) - setattr(tenant_settings, key, new_value) - - def do_extend(self, tenant_settings, key, value): - new_value = list(getattr(tenant_settings, key, [])) - new_value.extend(value) - setattr(tenant_settings, key, new_value) - def update_settings_from_path(self, tenant_settings, path): with open(path) as f: - json_settings = json.load(f) - for key in json_settings: - if '.' in key: - real_key, op = key.rsplit('.', 1) - method = getattr(self, 'do_%s' % op) - method(tenant_settings, real_key, json_settings[key]) - else: - setattr(tenant_settings, key, json_settings[key]) + self.handle_settings(tenant_settings, json.load(f)) class DictAdapter(dict): -- 2.19.0