dbsettings.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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 .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. 'is_public': setting.is_public,
  23. }
  24. else:
  25. data[setting.setting] = {
  26. 'value': setting.value,
  27. 'is_lazy': setting.is_lazy,
  28. 'is_public': setting.is_public,
  29. }
  30. return data
  31. def get_public_settings(self):
  32. public_settings = {}
  33. for name, setting in self._settings.items():
  34. if setting['is_public']:
  35. public_settings[name] = setting['value']
  36. return public_settings
  37. def get_lazy_setting(self, setting):
  38. from .models import Setting
  39. try:
  40. if self._settings[setting]['is_lazy']:
  41. if not self._settings[setting].get('real_value'):
  42. real_value = Setting.objects.get(setting=setting).value
  43. self._settings[setting]['real_value'] = real_value
  44. return self._settings[setting]['real_value']
  45. else:
  46. raise ValueError("Setting %s is not lazy" % setting)
  47. except (KeyError, Setting.DoesNotExist):
  48. raise AttributeError("Setting %s is undefined" % setting)
  49. def flush_cache(self):
  50. from misago.core.cache import cache
  51. cache.delete(CACHE_KEY)
  52. def __getattr__(self, attr):
  53. try:
  54. return self._settings[attr]['value']
  55. except KeyError:
  56. raise AttributeError("Setting %s is undefined" % attr)
  57. def override_setting(self, setting, new_value):
  58. if not setting in self._overrides:
  59. self._overrides[setting] = self._settings[setting]['value']
  60. self._settings[setting]['value'] = new_value
  61. self._settings[setting]['real_value'] = new_value
  62. return new_value
  63. def reset_settings(self):
  64. for setting, original_value in self._overrides.items():
  65. self._settings[setting]['value'] = original_value
  66. self._settings[setting].pop('real_value', None)
  67. class _DBSettingsGateway(object):
  68. def get_db_settings(self):
  69. dbsettings = threadstore.get(CACHE_KEY)
  70. if not dbsettings:
  71. dbsettings = DBSettings()
  72. threadstore.set(CACHE_KEY, dbsettings)
  73. return dbsettings
  74. def __getattr__(self, attr):
  75. return getattr(self.get_db_settings(), attr)
  76. db_settings = _DBSettingsGateway()