Source code for setman.lazy
from django.conf import settings as django_settings
from setman.models import Settings
__all__ = ('LazySettings', )
[docs]class LazySettings(object):
"""
Simple proxy object that accessed database only when user needs to read
some setting.
"""
_custom = None
def __getattr__(self, name):
if not name.isupper():
return super(LazySettings, self).__getattr__(name)
if self._custom is None:
self._custom = self._get_custom_settings()
if name in self._custom.data:
return self._custom.data.get(name)
elif hasattr(django_settings, name):
return getattr(django_settings, name)
raise AttributeError('Settings has not attribute %r' % name)
def __setattr__(self, name, value):
if not name.isupper():
return super(LazySettings, self).__setattr__(name, value)
if hasattr(django_settings, name):
setattr(django_settings, name, value)
else:
if self._custom is None:
self._custom = self._get_custom_settings()
setattr(self._custom, name, value)
[docs] def save(self):
if self._custom is None:
self._custom = self._get_custom_settings()
self._custom.save()
[docs] def _clear(self):
self._custom = None
[docs] def _get_custom_settings(self):
try:
return Settings.objects.get()
except Settings.DoesNotExist:
return Settings.objects.create(data={})