dynamicsettings.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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_settings_from_db():
  39. settings = {}
  40. for setting in Setting.objects.iterator():
  41. if setting.is_lazy:
  42. settings[setting.setting] = {
  43. 'value': True if setting.value else None,
  44. 'is_lazy': setting.is_lazy,
  45. 'is_public': setting.is_public,
  46. }
  47. else:
  48. settings[setting.setting] = {
  49. 'value': setting.value,
  50. 'is_lazy': setting.is_lazy,
  51. 'is_public': setting.is_public,
  52. }
  53. return settings