dynamicsettings.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. if setting in self._settings:
  32. return self._settings[setting]["value"]
  33. raise AttributeError("Setting %s is not defined" % setting)
  34. @classmethod
  35. def override_settings(cls, overrides):
  36. cls._overrides = overrides
  37. @classmethod
  38. def remove_overrides(cls):
  39. cls._overrides = {}
  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. elif setting.python_type == "image":
  50. settings[setting.setting] = {
  51. "value": setting.value.url if setting.value else None,
  52. "is_lazy": setting.is_lazy,
  53. "is_public": setting.is_public,
  54. }
  55. else:
  56. settings[setting.setting] = {
  57. "value": setting.value,
  58. "is_lazy": setting.is_lazy,
  59. "is_public": setting.is_public,
  60. }
  61. return settings