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 |
|
-
|