dynamicsettings.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. from django.core.cache import cache
  2. from . import CACHE_NAME
  3. from .models import Setting
  4. class DynamicSettings:
  5. _overrides = {}
  6. def __init__(self, cache_versions):
  7. cache_name = get_cache_name(cache_versions)
  8. self._settings = cache.get(cache_name)
  9. if self._settings is None:
  10. self._settings = get_settings_from_db()
  11. cache.set(cache_name, self._settings)
  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. return self._settings[setting]["value"]
  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_cache_name(cache_versions):
  41. return "%s_%s" % (CACHE_NAME, cache_versions[CACHE_NAME])
  42. def get_settings_from_db():
  43. settings = {}
  44. for setting in Setting.objects.iterator():
  45. if setting.is_lazy:
  46. settings[setting.setting] = {
  47. 'value': True if setting.value else None,
  48. 'is_lazy': setting.is_lazy,
  49. 'is_public': setting.is_public,
  50. }
  51. else:
  52. settings[setting.setting] = {
  53. 'value': setting.value,
  54. 'is_lazy': setting.is_lazy,
  55. 'is_public': setting.is_public,
  56. }
  57. return settings