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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
"""
Definition of a Singleton wrapper class for askbot.deps.livesettings
with interface similar to django.conf.settings
that is each setting has unique key and is accessible
via dotted lookup.
for example to lookup value of setting BLAH you would do
from askbot.conf import settings as askbot_settings
askbot_settings.BLAH
NOTE that at the moment there is distinction between settings
(django settings) and askbot_settings (forum.deps.livesettings)
the value will be taken from askbot.deps.livesettings database or cache
note that during compilation phase database is not accessible
for the most part, so actual values are reliably available only
at run time
askbot.deps.livesettings is a module developed for satchmo project
"""
from django.core.cache import cache
from askbot.deps.livesettings import SortedDotDict, config_register
from askbot.deps.livesettings.functions import config_get
from askbot.deps.livesettings import signals
class ConfigSettings(object):
"""A very simple Singleton wrapper for settings
a limitation is that all settings names using this class
must be distinct, even though they might belong
to different settings groups
"""
__instance = None
__group_map = {}
def __init__(self):
"""assigns SortedDotDict to self.__instance if not set"""
if ConfigSettings.__instance == None:
ConfigSettings.__instance = SortedDotDict()
self.__dict__['_ConfigSettings__instance'] = ConfigSettings.__instance
self.__ordering_index = {}
def __getattr__(self, key):
"""value lookup returns the actual value of setting
not the object - this way only very minimal modifications
will be required in code to convert an app
depending on django.conf.settings to askbot.deps.livesettings
"""
return getattr(self.__instance, key).value
def get_default(self, key):
"""return the defalut value for the setting"""
return getattr(self.__instance, key).default
def reset(self, key):
"""returns setting to the default value"""
self.update(key, self.get_default(key))
def update(self, key, value):
try:
setting = config_get(self.__group_map[key], key)
setting.update(value)
except:
from askbot.deps.livesettings.models import Setting
setting = Setting.objects.get(key=key)
setting.value = value
setting.save()
#self.prime_cache()
def register(self, value):
"""registers the setting
value must be a subclass of askbot.deps.livesettings.Value
"""
key = value.key
group_key = value.group.key
ordering = self.__ordering_index.get(group_key, None)
if ordering:
ordering += 1
value.ordering = ordering
else:
ordering = 1
value.ordering = ordering
self.__ordering_index[group_key] = ordering
if key not in self.__instance:
self.__instance[key] = config_register(value)
self.__group_map[key] = group_key
def as_dict(self):
settings = cache.get('askbot-livesettings')
if settings:
return settings
else:
self.prime_cache()
return cache.get('askbot-livesettings')
@classmethod
def prime_cache(cls, **kwargs):
"""reload all settings into cache as dictionary
"""
out = dict()
for key in cls.__instance.keys():
#todo: this is odd that I could not use self.__instance.items() mapping here
out[key] = cls.__instance[key].value
cache.set('askbot-livesettings', out)
signals.configuration_value_changed.connect(ConfigSettings.prime_cache)
#settings instance to be used elsewhere in the project
settings = ConfigSettings()
|