settings.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. from django.db.utils import DatabaseError
  2. from django.core.cache import cache
  3. from misago.models import Setting
  4. class DBSettings(object):
  5. """
  6. Database-stored high-level and "safe" settings controller
  7. """
  8. def __init__(self):
  9. self._settings = {}
  10. self._models = {}
  11. self.refresh()
  12. def refresh(self):
  13. self._models = cache.get('settings')
  14. if not self._models:
  15. self._models = {}
  16. try:
  17. for i in Setting.objects.all():
  18. self._models[i.pk] = i
  19. self._settings[i.pk] = i.get_value()
  20. cache.set('settings', self._models)
  21. except DatabaseError:
  22. pass
  23. else:
  24. for i, model in self._models.items():
  25. self._settings[i] = model.get_value()
  26. def __getattr__(self, key):
  27. return self._settings[key]
  28. def __contains__(self, key):
  29. return key in self._settings.keys()
  30. def __getitem__(self, key):
  31. return self._settings[key]
  32. def __setitem__(self, key, value):
  33. if key in self._settings.keys():
  34. self._models[key].set_value(value)
  35. self._models[key].save(force_update=True)
  36. self._settings[key] = value
  37. cache.set('settings', self._models)
  38. return value
  39. def __delitem__(self, key):
  40. pass
  41. def get(self, key, default=None):
  42. try:
  43. return self._settings[key]
  44. except KeyError:
  45. return None
  46. def has_key(self, key):
  47. return key in self._settings.keys()
  48. def keys(self):
  49. return self._settings.keys()
  50. def values(self):
  51. return self._settings.values()
  52. def items(self):
  53. return self._settings.items()
  54. def iterkeys(self):
  55. return self._settings.iterkeys()
  56. def itervalues(self):
  57. return self._settings.itervalues()
  58. def iteritems(self):
  59. return self._settings.iteritems()