summaryrefslogtreecommitdiffstats
path: root/forum/models/conf/settings_wrapper.py
blob: abf49e5fe0b6d154a8d0741b3450f97c2f9fd55c (plain)
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
"""
Definition of a Singleton wrapper class for 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 forum.conf import settings

settings.BLAH

the value will be taken from 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

livesettings is a module developed for satchmo project
"""
from livesettings import SortedDotDict, config_register

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

    def __init__(self):
        """assigns SortedDotDict to self.__instance if not set"""
        if ConfigSettings.__instance == None:
            ConfigSettings.__instance = SortedDotDict()
        self.__dict__['_ConfigSettings__instance'] = ConfigSettings.__instance

    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 livesettings
        """
        return getattr(self.__instance, key).value

    def __setattr__(self, attr, value):
        """ settings crutch is read-only in the program """
        raise Exception('ConfigSettings cannot be changed programmatically')

    def register(self, value):
        """registers the setting
        value must be a subclass of livesettings.Value
        """
        key = value.key
        if key in self.__instance:
            raise Exception('setting %s is already registered' % key)
        else:
            self.__instance[key] = config_register(value)

#settings instance to be used elsewhere in the project
settings = ConfigSettings()