Completed
Push — master ( 78c434...bc49fd )
by Bertrand
01:05
created

Settings.reload()   A

Complexity

Conditions 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
from django.conf import settings
2
from django.utils.module_loading import import_string
3
4
5
SUPPORTED_DATABASE_ENGINES = {
6
    'django.db.backends.sqlite3',
7
    'django.db.backends.postgresql',
8
    'django.db.backends.mysql',
9
    # TODO: Remove when we drop Django 1.8 support.
10
    'django.db.backends.postgresql_psycopg2',
11
12
    # GeoDjango
13
    'django.contrib.gis.db.backends.spatialite',
14
    'django.contrib.gis.db.backends.postgis',
15
    'django.contrib.gis.db.backends.mysql',
16
17
    # django-transaction-hooks
18
    'transaction_hooks.backends.sqlite3',
19
    'transaction_hooks.backends.postgis',
20
    'transaction_hooks.backends.postgresql_psycopg2',
21
    'transaction_hooks.backends.mysql',
22
}
23
24
SUPPORTED_CACHE_BACKENDS = {
25
    'django.core.cache.backends.dummy.DummyCache',
26
    'django.core.cache.backends.locmem.LocMemCache',
27
    'django.core.cache.backends.filebased.FileBasedCache',
28
    'django_redis.cache.RedisCache',
29
    'django.core.cache.backends.memcached.MemcachedCache',
30
    'django.core.cache.backends.memcached.PyLibMCCache',
31
}
32
33
SUPPORTED_ONLY = 'supported_only'
34
ITERABLES = {tuple, list, frozenset, set}
35
36
37
class Settings(object):
38
    patched = False
39
    converters = {}
40
41
    CACHALOT_ENABLED = True
42
    CACHALOT_CACHE = 'default'
43
    CACHALOT_DATABASES = 'supported_only'
44
    CACHALOT_TIMEOUT = None
45
    CACHALOT_CACHE_RANDOM = False
46
    CACHALOT_INVALIDATE_RAW = True
47
    CACHALOT_ONLY_CACHABLE_TABLES = ()
48
    CACHALOT_UNCACHABLE_TABLES = ('django_migrations',)
49
    CACHALOT_QUERY_KEYGEN = 'cachalot.utils.get_query_cache_key'
50
    CACHALOT_TABLE_KEYGEN = 'cachalot.utils.get_table_cache_key'
51
52
    @classmethod
53
    def add_converter(cls, setting):
54
        def inner(func):
55
            cls.converters[setting] = func
56
57
        return inner
58
59
    @classmethod
60
    def get_names(cls):
61
        return {name for name in cls.__dict__
62
                if name[:2] != '__' and name.isupper()}
63
64
    def load(self):
65
        for name in self.get_names():
66
            value = getattr(settings, name, getattr(self.__class__, name))
67
            converter = self.converters.get(name)
68
            if converter is not None:
69
                value = converter(value)
70
            setattr(self, name, value)
71
72
        if not self.patched:
73
            from .monkey_patch import patch
74
            patch()
75
            self.patched = True
76
77
    def unload(self):
78
        if self.patched:
79
            from .monkey_patch import unpatch
80
            unpatch()
81
            self.patched = False
82
83
    def reload(self):
84
        self.unload()
85
        self.load()
86
87
88
@Settings.add_converter('CACHALOT_DATABASES')
89
def convert(value):
90
    if value == SUPPORTED_ONLY:
91
        value = {alias for alias, setting in settings.DATABASES.items()
92
                 if setting['ENGINE'] in SUPPORTED_DATABASE_ENGINES}
93
    if value.__class__ in ITERABLES:
94
        return frozenset(value)
95
    return value
96
97
98
@Settings.add_converter('CACHALOT_ONLY_CACHABLE_TABLES')
99
def convert(value):
100
    return frozenset(value)
101
102
103
@Settings.add_converter('CACHALOT_UNCACHABLE_TABLES')
104
def convert(value):
105
    return frozenset(value)
106
107
108
@Settings.add_converter('CACHALOT_QUERY_KEYGEN')
109
def convert(value):
110
    return import_string(value)
111
112
113
@Settings.add_converter('CACHALOT_TABLE_KEYGEN')
114
def convert(value):
115
    return import_string(value)
116
117
118
cachalot_settings = Settings()
119