dbsettings.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. self._overrides = {}
  7. def _read_cache(self):
  8. from misago.core.cache import cache
  9. data = cache.get(CACHE_KEY, 'nada')
  10. if data == 'nada':
  11. data = self._read_db()
  12. cache.set(CACHE_KEY, data)
  13. return data
  14. def _read_db(self):
  15. from misago.conf.models import Setting
  16. data = {}
  17. for setting in Setting.objects.iterator():
  18. if setting.is_lazy:
  19. data[setting.setting] = {
  20. 'value': True if setting.value else None,
  21. 'is_lazy': setting.is_lazy
  22. }
  23. else:
  24. data[setting.setting] = {
  25. 'value': setting.value,
  26. 'is_lazy': setting.is_lazy
  27. }
  28. return data
  29. def get_lazy_setting(self, setting):
  30. from misago.conf.models import Setting
  31. try:
  32. if self._settings[setting]['is_lazy']:
  33. return Setting.objects.get(setting=setting).value
  34. else:
  35. raise ValueError("Setting %s is not lazy" % setting)
  36. except (KeyError, Setting.DoesNotExist):
  37. raise AttributeError("Setting %s is undefined" % setting)
  38. def flush_cache(self):
  39. from misago.core.cache import cache
  40. cache.delete(CACHE_KEY)
  41. def __getattr__(self, attr):
  42. try:
  43. return self._settings[attr]['value']
  44. except KeyError:
  45. raise AttributeError("Setting %s is undefined" % attr)
  46. def override_setting(self, setting, new_value):
  47. if not setting in self._overrides:
  48. self._overrides[setting] = self._settings[setting]['value']
  49. self._settings[setting]['value'] = new_value
  50. return new_value
  51. def reset_settings(self):
  52. for setting, original_value in self._overrides.items():
  53. self._settings[setting]['value'] = original_value
  54. class _DBSettingsGateway(object):
  55. def get_db_settings(self):
  56. dbsettings = threadstore.get(CACHE_KEY)
  57. if not dbsettings:
  58. dbsettings = DBSettings()
  59. threadstore.set(CACHE_KEY, dbsettings)
  60. return dbsettings
  61. def __getattr__(self, attr):
  62. return getattr(self.get_db_settings(), attr)
  63. db_settings = _DBSettingsGateway()