dbsettings.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. from misago.core import threadstore
  2. CACHE_KEY = 'misago_db_settings'
  3. class DBSettings(object):
  4. def __init__(self):
  5. self._settings = self._read_cache()
  6. def _read_cache(self):
  7. from misago.core.cache import cache
  8. data = cache.get(CACHE_KEY, 'nada')
  9. if data == 'nada':
  10. data = self._read_db()
  11. cache.set(CACHE_KEY, data)
  12. return data
  13. def _read_db(self):
  14. from misago.conf.models import Setting
  15. data = {}
  16. for setting in Setting.objects.iterator():
  17. if setting.is_lazy:
  18. data[setting.setting] = {
  19. 'value': True if setting.value else False,
  20. 'is_lazy': setting.is_lazy
  21. }
  22. else:
  23. data[setting.setting] = {
  24. 'value': setting.value,
  25. 'is_lazy': setting.is_lazy
  26. }
  27. return data
  28. def get_lazy_setting(self, setting):
  29. from misago.conf.models import Setting
  30. try:
  31. if self._settings[setting]['is_lazy']:
  32. return Setting.objects.get(setting=setting).value
  33. else:
  34. raise AttributeError("Setting %s is not lazy" % setting)
  35. except (KeyError, Setting.DoesNotExist):
  36. raise AttributeError("Setting %s is undefined" % setting)
  37. def __getattr__(self, attr):
  38. try:
  39. return self._settings[attr]['value']
  40. except KeyError:
  41. raise AttributeError("Setting %s is undefined" % attr)
  42. class _DBSettingsGateway(object):
  43. def get_db_settings(self):
  44. dbsettings = threadstore.get(CACHE_KEY)
  45. if not dbsettings:
  46. dbsettings = DBSettings()
  47. threadstore.set(CACHE_KEY, dbsettings)
  48. return dbsettings
  49. def __getattr__(self, attr):
  50. return getattr(self.get_db_settings(), attr)
  51. db_settings = _DBSettingsGateway()