Source code for setman.models

from django.core.cache import cache
from django.core.exceptions import ValidationError
from django.db import models
from django.db.models import signals
from django.dispatch import receiver
from django.utils.encoding import force_unicode
from django.utils.translation import ugettext_lazy as _

from setman.fields import SettingsField
from setman.managers import CACHE_KEY, SettingsManager


__all__ = ('Settings', )


[docs]class Settings(models.Model): """ Store all custom project settings in ``data`` field as ``json`` dump. """ data = SettingsField(_('data'), blank=True, default='', editable=False) create_date = models.DateTimeField(_('created at'), auto_now_add=True) update_date = models.DateTimeField(_('updated at'), auto_now=True) objects = SettingsManager() class Meta: verbose_name = _('settings') verbose_name_plural = _('settings') def __delattr__(self, name): if name.isupper(): if name in self.data: del self.data[name] else: super(Settings, self).__delattr__(name) def __getattr__(self, name): if name.isupper(): return self.data.get(name) return super(Settings, self).__getattr__(name) def __setattr__(self, name, value): if name.isupper(): if not self.data: self.data = {} self.data[name] = value else: return super(Settings, self).__setattr__(name, value) def __unicode__(self): return force_unicode(_('Project settings'))
[docs] def validate_unique(self, exclude=None): """ Check that no else ``Settings`` insances has been created. """ lookup = {} if not self.pk else {'pk': self.pk} counter = self._default_manager.exclude(**lookup).count() if counter != 0: raise ValidationError('Only one Settings instance could be ' \ 'created.') return super(Settings, self).validate_unique(exclude)
@receiver(signals.post_save, sender=Settings) def clear_settings_cache(instance, **kwargs): """ Clear settings cache if any. """ from setman import settings settings._clear() if CACHE_KEY in cache: cache.delete(CACHE_KEY) @receiver(signals.pre_save, sender=Settings) def validate_settings(instance, **kwargs): """ Validate settings data before save to database. """ try: instance.full_clean() except ValidationError, error: # Dirty hack to ignore error messages raised by Django when trying to # re-save already existed instance (it's okay cause we didn't operate # with instance directly read from database, we got instance field data # from the cache) if hasattr(error, 'message_dict') and \ error.message_dict.keys() == ['id']: return raise