dynamicsettings.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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(self, setting):
  11. return self._settings.get(setting)
  12. def get_public_settings(self):
  13. public_settings = {}
  14. for name, setting in self._settings.items():
  15. if setting["is_public"]:
  16. public_settings[name] = setting["value"]
  17. return public_settings
  18. def get_lazy_setting_value(self, setting):
  19. try:
  20. if self._settings[setting]["is_lazy"]:
  21. if setting in self._overrides:
  22. return self._overrides[setting]
  23. if not self._settings[setting].get("real_value"):
  24. real_value = Setting.objects.get(setting=setting).value
  25. self._settings[setting]["real_value"] = real_value
  26. return self._settings[setting]["real_value"]
  27. raise ValueError("Setting %s is not lazy" % setting)
  28. except (KeyError, Setting.DoesNotExist):
  29. raise AttributeError("Setting %s is not defined" % setting)
  30. def __getattr__(self, setting):
  31. if setting in self._overrides:
  32. return self._overrides[setting]
  33. if setting in self._settings:
  34. return self._settings[setting]["value"]
  35. raise AttributeError("Setting %s is not defined" % setting)
  36. @classmethod
  37. def override_settings(cls, overrides):
  38. cls._overrides = overrides
  39. @classmethod
  40. def remove_overrides(cls):
  41. cls._overrides = {}
  42. def get_settings_from_db():
  43. settings = {}
  44. for setting in Setting.objects.iterator():
  45. settings[setting.setting] = {
  46. "value": None,
  47. "is_lazy": setting.is_lazy,
  48. "is_public": setting.is_public,
  49. "width": None,
  50. "height": None,
  51. }
  52. if setting.is_lazy:
  53. settings[setting.setting]["value"] = True if setting.value else None
  54. elif setting.python_type == "image":
  55. settings[setting.setting].update(
  56. {
  57. "value": setting.value.url if setting.value else None,
  58. "width": setting.image_width,
  59. "height": setting.image_height,
  60. }
  61. )
  62. else:
  63. settings[setting.setting]["value"] = setting.value
  64. return settings