dynamicsettings.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. from .cache import get_settings_cache, set_settings_cache
  2. from .models import Setting
  3. class DynamicSettings:
  4. _overrides = {}
  5. def __init__(self, cache_versions):
  6. self._settings = get_settings_cache(cache_versions)
  7. if self._settings is None:
  8. self._settings = get_settings_from_db()
  9. set_settings_cache(cache_versions, self._settings)
  10. def get_public_settings(self):
  11. public_settings = {}
  12. for name, setting in self._settings.items():
  13. if setting["is_public"]:
  14. public_settings[name] = setting["value"]
  15. return public_settings
  16. def get_lazy_setting_value(self, setting):
  17. try:
  18. if self._settings[setting]["is_lazy"]:
  19. if setting in self._overrides:
  20. return self._overrides[setting]
  21. if not self._settings[setting].get("real_value"):
  22. real_value = Setting.objects.get(setting=setting).value
  23. self._settings[setting]["real_value"] = real_value
  24. return self._settings[setting]["real_value"]
  25. raise ValueError("Setting %s is not lazy" % setting)
  26. except (KeyError, Setting.DoesNotExist):
  27. raise AttributeError("Setting %s is not defined" % setting)
  28. def __getattr__(self, setting):
  29. if setting in self._overrides:
  30. return self._overrides[setting]
  31. return self._settings[setting]["value"]
  32. @classmethod
  33. def override_settings(cls, overrides):
  34. cls._overrides = overrides
  35. @classmethod
  36. def remove_overrides(cls):
  37. cls._overrides = {}
  38. def get_cache_name(cache_versions):
  39. return "%s_%s" % (SETTINGS_CACHE, cache_versions[SETTINGS_CACHE])
  40. def get_settings_from_db():
  41. settings = {}
  42. for setting in Setting.objects.iterator():
  43. if setting.is_lazy:
  44. settings[setting.setting] = {
  45. 'value': True if setting.value else None,
  46. 'is_lazy': setting.is_lazy,
  47. 'is_public': setting.is_public,
  48. }
  49. else:
  50. settings[setting.setting] = {
  51. 'value': setting.value,
  52. 'is_lazy': setting.is_lazy,
  53. 'is_public': setting.is_public,
  54. }
  55. return settings