dbsettings.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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 . import ENABLE_GLOBAL_STATE
  40. if not ENABLE_GLOBAL_STATE:
  41. raise Exception("Trying to access lazy dynamic setting: %s" % name)
  42. from .models import Setting
  43. try:
  44. if self._settings[setting]['is_lazy']:
  45. if not self._settings[setting].get('real_value'):
  46. real_value = Setting.objects.get(setting=setting).value
  47. self._settings[setting]['real_value'] = real_value
  48. return self._settings[setting]['real_value']
  49. else:
  50. raise ValueError("Setting %s is not lazy" % setting)
  51. except (KeyError, Setting.DoesNotExist):
  52. raise AttributeError("Setting %s is undefined" % setting)
  53. def flush_cache(self):
  54. from misago.core.cache import cache
  55. cache.delete(CACHE_KEY)
  56. def __getattr__(self, attr):
  57. from . import ENABLE_GLOBAL_STATE
  58. if not ENABLE_GLOBAL_STATE:
  59. raise Exception("Trying to access dynamic setting: %s" % name)
  60. try:
  61. return self._settings[attr]['value']
  62. except KeyError:
  63. raise AttributeError("Setting %s is undefined" % attr)
  64. def override_setting(self, setting, new_value):
  65. if not setting in self._overrides:
  66. self._overrides[setting] = self._settings[setting]['value']
  67. self._settings[setting]['value'] = new_value
  68. self._settings[setting]['real_value'] = new_value
  69. return new_value
  70. def reset_settings(self):
  71. for setting, original_value in self._overrides.items():
  72. self._settings[setting]['value'] = original_value
  73. self._settings[setting].pop('real_value', None)
  74. class _DBSettingsGateway(object):
  75. def get_db_settings(self):
  76. dbsettings = threadstore.get(CACHE_KEY)
  77. if not dbsettings:
  78. dbsettings = DBSettingsDeprecated()
  79. threadstore.set(CACHE_KEY, dbsettings)
  80. return dbsettings
  81. def __getattr__(self, attr):
  82. return getattr(self.get_db_settings(), attr)
  83. db_settings = _DBSettingsGateway()