|
@@ -0,0 +1,70 @@
|
|
|
+from django.core.cache import cache
|
|
|
+
|
|
|
+from . import CACHE_NAME
|
|
|
+from .models import Setting
|
|
|
+
|
|
|
+
|
|
|
+class DatabaseSettings:
|
|
|
+ _overrides = {}
|
|
|
+
|
|
|
+ def __init__(self, cache_versions):
|
|
|
+ cache_name = get_cache_name(cache_versions)
|
|
|
+ self._settings = cache.get(cache_name)
|
|
|
+ if self._settings is None:
|
|
|
+ self._settings = get_settings_from_db()
|
|
|
+ cache.set(cache_name, self._settings)
|
|
|
+
|
|
|
+ def get_public_settings(self):
|
|
|
+ public_settings = {}
|
|
|
+ for name, setting in self._settings.items():
|
|
|
+ if setting["is_public"]:
|
|
|
+ public_settings[name] = setting["value"]
|
|
|
+ return public_settings
|
|
|
+
|
|
|
+ def get_lazy_setting_value(self, setting):
|
|
|
+ try:
|
|
|
+ if self._settings[setting]["is_lazy"]:
|
|
|
+ if setting in self._overrides:
|
|
|
+ return self._overrides[setting]
|
|
|
+ if not self._settings[setting].get("real_value"):
|
|
|
+ real_value = Setting.objects.get(setting=setting).value
|
|
|
+ self._settings[setting]["real_value"] = real_value
|
|
|
+ return self._settings[setting]["real_value"]
|
|
|
+ raise ValueError("Setting %s is not lazy" % setting)
|
|
|
+ except (KeyError, Setting.DoesNotExist):
|
|
|
+ raise AttributeError("Setting %s is not defined" % setting)
|
|
|
+
|
|
|
+ def __getattr__(self, setting):
|
|
|
+ if setting in self._overrides:
|
|
|
+ return self._overrides[setting]
|
|
|
+ return self._settings[setting]["value"]
|
|
|
+
|
|
|
+ @classmethod
|
|
|
+ def override_settings(cls, overrides):
|
|
|
+ cls._overrides = overrides
|
|
|
+
|
|
|
+ @classmethod
|
|
|
+ def remove_overrides(cls):
|
|
|
+ cls._overrides = {}
|
|
|
+
|
|
|
+
|
|
|
+def get_cache_name(cache_versions):
|
|
|
+ return "%s_%s" % (CACHE_NAME, cache_versions[CACHE_NAME])
|
|
|
+
|
|
|
+
|
|
|
+def get_settings_from_db():
|
|
|
+ settings = {}
|
|
|
+ for setting in Setting.objects.iterator():
|
|
|
+ if setting.is_lazy:
|
|
|
+ settings[setting.setting] = {
|
|
|
+ 'value': True if setting.value else None,
|
|
|
+ 'is_lazy': setting.is_lazy,
|
|
|
+ 'is_public': setting.is_public,
|
|
|
+ }
|
|
|
+ else:
|
|
|
+ settings[setting.setting] = {
|
|
|
+ 'value': setting.value,
|
|
|
+ 'is_lazy': setting.is_lazy,
|
|
|
+ 'is_public': setting.is_public,
|
|
|
+ }
|
|
|
+ return settings
|