0001-hobo-add-setting-loader-for-variables-28930.patch
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 |
- |