conf.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. from django.conf import settings as dj_settings
  2. from django.core.cache import cache
  3. from misago.thread import local
  4. _thread_local = local()
  5. def load_settings():
  6. settings = cache.get('settings', {})
  7. if not settings:
  8. from misago.models import Setting
  9. for i in Setting.objects.all():
  10. settings[i.pk] = i.value
  11. cache.set('settings', settings)
  12. return settings
  13. class MisagoSettings(object):
  14. def __init__(self, local, safe):
  15. self.thread = local
  16. self.is_safe = safe
  17. def settings(self):
  18. try:
  19. return self.thread.settings
  20. except AttributeError:
  21. self.thread.settings = load_settings()
  22. return self.thread.settings
  23. def setting(self, key):
  24. try:
  25. try:
  26. if self.is_safe:
  27. return getattr(dj_settings, key)
  28. else:
  29. raise AttributeError()
  30. except AttributeError:
  31. try:
  32. return self.settings()[key]
  33. except KeyError:
  34. raise AttributeError()
  35. except AttributeError:
  36. raise Exception(u"Requested setting \"%s\" could not be found." % key)
  37. def __contains__(self, key):
  38. return key in self.settings()
  39. def __getitem__(self, key):
  40. return self.setting(key)
  41. def __getattr__(self, key):
  42. return self.setting(key)
  43. def __setitem__(self, key, value):
  44. from misago.models import Setting
  45. setting = Setting.objects.get(pk=key)
  46. setting.value = value
  47. setting.save(force_update=True)
  48. settings = MisagoSettings(_thread_local, True)
  49. def SafeSettings():
  50. """
  51. Safe settings factory for MisagoSettings
  52. """
  53. return MisagoSettings(_thread_local, False)