Projet

Général

Profil

0001-hobo-add-setting-loader-for-variables-28930.patch

Benjamin Dauvergne, 07 janvier 2019 14:52

Télécharger (7,25 ko)

Voir les différences:

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 = [{...}]
 debian/debian_config_common.py       |  1 +
 hobo/multitenant/settings_loaders.py | 32 +++++++++++++++++++++++++++-
 tests_multitenant/conftest.py        | 12 +++++++++++
 tests_multitenant/settings.py        |  9 ++++++++
 tests_multitenant/test_settings.py   | 28 ++++++++++++++++++++++++
 5 files changed, 81 insertions(+), 1 deletion(-)
debian/debian_config_common.py
289 289
        'hobo.multitenant.settings_loaders.SiteBaseUrl',
290 290
        'hobo.multitenant.settings_loaders.CookieNames',
291 291
        'hobo.multitenant.settings_loaders.SettingsJSON',
292
        'hobo.multitenant.settings_loaders.SettingsVars',
292 293
    )
293 294

  
294 295
    # templates in <tenant>/templates
hobo/multitenant/settings_loaders.py
115 115

  
116 116
        tenant_settings.KNOWN_SERVICES = known_services
117 117

  
118
SETTING_PREFIX = 'SETTING_'
119

  
118 120

  
119 121
class TemplateVars(FileBaseSettingsLoader):
120 122
    FILENAME = 'hobo.json'
......
166 168
            tenant_settings.TEMPLATE_VARS = tenant_settings.default_settings.TEMPLATE_VARS.copy()
167 169
        else:
168 170
            tenant_settings.TEMPLATE_VARS = {}
169
        tenant_settings.TEMPLATE_VARS.update(variables)
171

  
172
        for key, value in variables.items():
173
            # prevent mixing settings and template vars
174
            if not key.startswith(SETTING_PREFIX):
175
                tenant_settings.TEMPLATE_VARS[key] = value
170 176

  
171 177
        if variables.get('default_from_email'):
172 178
            if variables.get('global_title'):
......
178 184
        tenant_settings.USER_PROFILE_CONFIG = hobo_json.get('profile')
179 185

  
180 186

  
187
class SettingsVars(SettingsDictUpdateMixin, FileBaseSettingsLoader):
188
    FILENAME = 'hobo.json'
189

  
190
    @classmethod
191
    def get_hobo_json_variables(cls, hobo_json):
192
        variables = hobo_json.get('variables', {})
193
        for service in hobo_json.get('services'):
194
            if service.get('this'):
195
                variables.update(service.get('variables') or {})
196
                break
197
        return variables
198

  
199
    def update_settings_from_path(self, tenant_settings, path):
200
        with open(path) as f:
201
            hobo_json = json.load(f)
202
        variables = self.get_hobo_json_variables(hobo_json)
203

  
204
        settings_dict = {}
205
        for key, value in variables.items():
206
            if key.startswith(SETTING_PREFIX):
207
                settings_dict[key[len(SETTING_PREFIX):]] = value
208
        self.handle_settings(tenant_settings, settings_dict)
209

  
210

  
181 211
class CORSSettings(FileBaseSettingsLoader):
182 212
    FILENAME = 'hobo.json'
183 213

  
tests_multitenant/conftest.py
30 30
                    'hobo_test_variable': True,
31 31
                    'other_variable': 'foo',
32 32
                    'theme': 'publik',
33
                    'SETTING_GLOBAL1': True,
34
                    'SETTING_GLOBAL2.extend': [2, 3, 4],
35
                    'SETTING_GLOBAL3.update': {"x": 1, "y": 2},
36
                    'SETTING_OVERRIDE1': False,
37
                    'SETTING_OVERRIDE2.extend': [6, 7, 8],
38
                    'SETTING_OVERRIDE3.update': {"a": 1, "b": 2},
33 39
                },
34 40
                'services': [
35 41
                    {'slug': 'test',
......
41 47
                     'saml-sp-metadata-url': 'http://%s/saml/metadata' % name,
42 48
                     'variables': {
43 49
                         'other_variable': 'bar',
50
                         'SETTING_OVERRIDE1': True,
51
                         'SETTING_OVERRIDE2.extend': [name, 7, 8],
52
                         'SETTING_OVERRIDE3.update': {"a": name, "b": 2},
53
                         'SETTING_LOCAL1': False,
54
                         'SETTING_LOCAL2.extend': [name, 7, 8],
55
                         'SETTING_LOCAL3.update': {"a": name, "b": 2},
44 56
                     }
45 57
                    },
46 58
                    {'slug': 'slug-with-hyphen',
tests_multitenant/settings.py
72 72
        'hobo.multitenant.settings_loaders.SiteBaseUrl',
73 73
        'hobo.multitenant.settings_loaders.CookieNames',
74 74
        'hobo.multitenant.settings_loaders.SettingsJSON',
75
        'hobo.multitenant.settings_loaders.SettingsVars',
75 76
)
77

  
78
GLOBAL1 = 0
79
GLOBAL2 = [1, 2, 3]
80
GLOBAL3 = {"z": 1}
81

  
82
OVERRIDE1 = 0
83
OVERRIDE2 = [1, 2, 3]
84
OVERRIDE3 = {"z": 1}
tests_multitenant/test_settings.py
79 79
        with pytest.raises(AttributeError):
80 80
            django.conf.settings.TEMPLATE_VARS
81 81

  
82
def test_tenant_settings_vars(tenants, settings, client):
83
    from hobo.multitenant.models import Tenant
84

  
85
    django.conf.settings.clear_tenants_settings()
86

  
87
    with utilities.patch_default_settings(settings,
88
                                          TENANT_SETTINGS_LOADERS=('hobo.multitenant.settings_loaders.SettingsVars',)):
89
        # check the setting is not defined
90
        with pytest.raises(AttributeError):
91
            django.conf.settings.LOCAL1
92
        with pytest.raises(AttributeError):
93
            django.conf.settings.LOCAL2
94
        with pytest.raises(AttributeError):
95
            django.conf.settings.LOCAL3
96

  
97
        for tenant in tenants:
98
            with tenant_context(tenant):
99
                # check it's defined when moving into the schema
100
                assert django.conf.settings.GLOBAL1 is True
101
                assert django.conf.settings.GLOBAL2 == [1, 2, 3, 2, 3, 4]
102
                assert django.conf.settings.GLOBAL3 == {'x': 1, 'y': 2, 'z': 1}
103
                assert django.conf.settings.OVERRIDE1 is True
104
                assert django.conf.settings.OVERRIDE2 == [1, 2, 3, tenant.domain_url, 7, 8]
105
                assert django.conf.settings.OVERRIDE3 == {'a': tenant.domain_url, 'b': 2, 'z': 1}
106
                assert django.conf.settings.LOCAL1 is False
107
                assert django.conf.settings.LOCAL2 == [tenant.domain_url, 7, 8]
108
                assert django.conf.settings.LOCAL3 == {'a': tenant.domain_url, 'b': 2}
109

  
82 110
def test_tenant_cors_settings(tenants, settings, client):
83 111
    settings.clear_tenants_settings()
84 112

  
85
-