Projet

Général

Profil

0001-multitenant-add-loader-to-get-settings-from-theme-26.patch

Frédéric Péters, 09 octobre 2018 09:27

Télécharger (4,52 ko)

Voir les différences:

Subject: [PATCH] multitenant: add loader to get settings from theme (#26636)

 debian/debian_config_common.py       |  1 +
 hobo/multitenant/settings_loaders.py | 64 +++++++++++++++++++---------
 2 files changed, 45 insertions(+), 20 deletions(-)
debian/debian_config_common.py
263 263
    TENANT_SETTINGS_LOADERS = (
264 264
        'hobo.multitenant.settings_loaders.TemplateVars',
265 265
        'hobo.multitenant.settings_loaders.KnownServices',
266
        'hobo.multitenant.settings_loaders.ThemeSettings',
266 267
        'hobo.multitenant.settings_loaders.CORSSettings',
267 268
        'hobo.multitenant.settings_loaders.SharedThemeSettings',
268 269
        'hobo.multitenant.settings_loaders.Mellon',
hobo/multitenant/settings_loaders.py
7 7
from django.utils.encoding import smart_bytes
8 8
from django.utils.six.moves.urllib import parse as urlparse
9 9

  
10
from hobo.theme.utils import get_theme
11

  
10 12

  
11 13
class FileBaseSettingsLoader(object):
12 14
    """
......
33 35
        raise NotImplemented
34 36

  
35 37

  
38
class SettingsDictUpdateMixin(object):
39
    def do_update(self, tenant_settings, key, value):
40
        old_value = getattr(tenant_settings, key, {})
41
        new_value = old_value.copy()
42
        new_value.update(value)
43
        setattr(tenant_settings, key, new_value)
44

  
45
    def do_extend(self, tenant_settings, key, value):
46
        new_value = list(getattr(tenant_settings, key, []))
47
        new_value.extend(value)
48
        setattr(tenant_settings, key, new_value)
49

  
50
    def handle_settings(self, tenant_settings, new_settings):
51
        for key in new_settings:
52
            if '.' in key:
53
                real_key, op = key.rsplit('.', 1)
54
                method = getattr(self, 'do_%s' % op)
55
                method(tenant_settings, real_key, new_settings[key])
56
            else:
57
                setattr(tenant_settings, key, new_settings[key])
58

  
59

  
36 60
class KnownServices(FileBaseSettingsLoader):
37 61
    FILENAME = 'hobo.json'
38 62

  
......
172 196
        tenant_settings.CORS_ORIGIN_WHITELIST = whitelist
173 197

  
174 198

  
199
class ThemeSettings(SettingsDictUpdateMixin):
200
    def get_new_time(self, tenant):
201
        return 0
202

  
203
    def update_settings(self, tenant_settings, tenant):
204
        theme_id = tenant_settings.TEMPLATE_VARS.get('theme')
205
        if not theme_id:
206
            return
207
        theme = get_theme(theme_id)
208
        if not theme:
209
            return
210
        module_name = settings.SETTINGS_MODULE.split('.')[0]
211
        module_settings = theme.get('settings', {}).get(module_name)
212
        if not module_settings:
213
            return
214
        self.handle_settings(tenant_settings, module_settings)
215

  
216

  
175 217
class SharedThemeSettings(FileBaseSettingsLoader):
176 218
    FILENAME = 'hobo.json'
177 219

  
......
297 339
# Generic loaders (not recommended)
298 340
#
299 341

  
300
class SettingsJSON(FileBaseSettingsLoader):
342
class SettingsJSON(FileBaseSettingsLoader, SettingsDictUpdateMixin):
301 343
    FILENAME = 'settings.json'
302 344

  
303
    def do_update(self, tenant_settings, key, value):
304
        old_value = getattr(tenant_settings, key, {})
305
        new_value = old_value.copy()
306
        new_value.update(value)
307
        setattr(tenant_settings, key, new_value)
308

  
309
    def do_extend(self, tenant_settings, key, value):
310
        new_value = list(getattr(tenant_settings, key, []))
311
        new_value.extend(value)
312
        setattr(tenant_settings, key, new_value)
313

  
314 345
    def update_settings_from_path(self, tenant_settings, path):
315 346
        with open(path) as f:
316
            json_settings = json.load(f)
317
            for key in json_settings:
318
                if '.' in key:
319
                    real_key, op = key.rsplit('.', 1)
320
                    method = getattr(self, 'do_%s' % op)
321
                    method(tenant_settings, real_key, json_settings[key])
322
                else:
323
                    setattr(tenant_settings, key, json_settings[key])
347
            self.handle_settings(tenant_settings, json.load(f))
324 348

  
325 349

  
326 350
class DictAdapter(dict):
327
-