-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathconf.py
82 lines (60 loc) · 2.54 KB
/
conf.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# from django.apps import apps
from django.conf import settings as django_settings
from django.test.signals import setting_changed
from django.utils.functional import LazyObject
from django.utils.module_loading import import_string
APP_NAMESPACE = "PAYTACAPOS"
class ObjDict(dict):
def __getattribute__(self, item):
try:
val = self[item]
if isinstance(val, str):
val = import_string(val)
elif isinstance(val, (list, tuple)):
val = [import_string(v) if isinstance(v, str) else v for v in val]
self[item] = val
except KeyError:
val = super(ObjDict, self).__getattribute__(item)
return val
default_settings = {
"TOTP_SECRET_KEY": None,
}
# In case you need to read settings from the main project settings
SETTINGS_TO_IMPORT = []
class Settings:
def __init__(self, default_settings, explicit_overriden_settings: dict = None):
if explicit_overriden_settings is None:
explicit_overriden_settings = {}
overriden_settings = (
getattr(django_settings, APP_NAMESPACE, {})
or explicit_overriden_settings
)
self._load_default_settings()
self._override_settings(overriden_settings)
self._init_settings_to_import()
def _load_default_settings(self):
for setting_name, setting_value in default_settings.items():
if setting_name.isupper():
setattr(self, setting_name, setting_value)
def _override_settings(self, overriden_settings: dict):
for setting_name, setting_value in overriden_settings.items():
value = setting_value
if isinstance(setting_value, dict):
value = getattr(self, setting_name, {})
value.update(ObjDict(setting_value))
setattr(self, setting_name, value)
def _init_settings_to_import(self):
for setting_name in SETTINGS_TO_IMPORT:
value = getattr(self, setting_name)
if isinstance(value, str):
setattr(self, setting_name, import_string(value))
class LazySettings(LazyObject):
def _setup(self, explicit_overriden_settings=None):
self._wrapped = Settings(default_settings, explicit_overriden_settings)
settings = LazySettings()
def reload_app_settings(*args, **kwargs):
global settings
setting, value = kwargs["setting"], kwargs["value"]
if setting == APP_NAMESPACE:
settings._setup(explicit_overriden_settings=value)
setting_changed.connect(reload_app_settings)