dbsettings.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. from django.core.cache import cache
  2. from misago.core import threadstore
  3. CACHE_KEY = 'misago_db_settings'
  4. class DBSettingsDeprecated(object):
  5. def __init__(self):
  6. self._settings = self._read_cache()
  7. self._overrides = {}
  8. def _read_cache(self):
  9. from misago.core.cache import cache
  10. data = cache.get(CACHE_KEY, 'nada')
  11. if data == 'nada':
  12. data = self._read_db()
  13. cache.set(CACHE_KEY, data)
  14. return data
  15. def _read_db(self):
  16. from .models import Setting
  17. data = {}
  18. for setting in Setting.objects.iterator():
  19. if setting.is_lazy:
  20. data[setting.setting] = {
  21. 'value': True if setting.value else None,
  22. 'is_lazy': setting.is_lazy,
  23. 'is_public': setting.is_public,
  24. }
  25. else:
  26. data[setting.setting] = {
  27. 'value': setting.value,
  28. 'is_lazy': setting.is_lazy,
  29. 'is_public': setting.is_public,
  30. }
  31. return data
  32. def get_public_settings(self):
  33. public_settings = {}
  34. for name, setting in self._settings.items():
  35. if setting['is_public']:
  36. public_settings[name] = setting['value']
  37. return public_settings
  38. def get_lazy_setting(self, setting):
  39. from .models import Setting
  40. try:
  41. if self._settings[setting]['is_lazy']:
  42. if not self._settings[setting].get('real_value'):
  43. real_value = Setting.objects.get(setting=setting).value
  44. self._settings[setting]['real_value'] = real_value
  45. return self._settings[setting]['real_value']
  46. else:
  47. raise ValueError("Setting %s is not lazy" % setting)
  48. except (KeyError, Setting.DoesNotExist):
  49. raise AttributeError("Setting %s is undefined" % setting)
  50. def flush_cache(self):
  51. from misago.core.cache import cache
  52. cache.delete(CACHE_KEY)
  53. def __getattr__(self, attr):
  54. try:
  55. return self._settings[attr]['value']
  56. except KeyError:
  57. raise AttributeError("Setting %s is undefined" % attr)
  58. def override_setting(self, setting, new_value):
  59. if not setting in self._overrides:
  60. self._overrides[setting] = self._settings[setting]['value']
  61. self._settings[setting]['value'] = new_value
  62. self._settings[setting]['real_value'] = new_value
  63. return new_value
  64. def reset_settings(self):
  65. for setting, original_value in self._overrides.items():
  66. self._settings[setting]['value'] = original_value
  67. self._settings[setting].pop('real_value', None)
  68. class _DBSettingsGateway(object):
  69. def get_db_settings(self):
  70. dbsettings = threadstore.get(CACHE_KEY)
  71. if not dbsettings:
  72. dbsettings = DBSettingsDeprecated()
  73. threadstore.set(CACHE_KEY, dbsettings)
  74. return dbsettings
  75. def __getattr__(self, attr):
  76. return getattr(self.get_db_settings(), attr)
  77. db_settings = _DBSettingsGateway()