/
models.py
56 lines (44 loc) · 1.75 KB
/
models.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
from django.conf import settings
from django.db import models
import caching.base
# Our apps should subclass ManagerBase instead of models.Manager or
# caching.base.CachingManager directly.
ManagerBase = caching.base.CachingManager
class ModelBase(caching.base.CachingMixin, models.Model):
"""
Base class for SUMO models to abstract some common features.
* Caching.
"""
objects = ManagerBase()
uncached = models.Manager()
class Meta:
abstract = True
def update(self, **kw):
"""
Shortcut for doing an UPDATE on this object.
If _signal=False is in ``kw`` the post_save signal won't be sent.
"""
signal = kw.pop('_signal', True)
cls = self.__class__
for k, v in kw.items():
setattr(self, k, v)
if signal:
# Detect any attribute changes during pre_save and add those to the
# update kwargs.
attrs = dict(self.__dict__)
models.signals.pre_save.send(sender=cls, instance=self)
for k, v in self.__dict__.items():
if attrs[k] != v:
kw[k] = v
setattr(self, k, v)
cls.objects.filter(pk=self.pk).update(**kw)
if signal:
models.signals.post_save.send(sender=cls, instance=self,
created=False)
class LocaleField(models.CharField):
"""CharField with locale settings specific to SUMO defaults."""
def __init__(self, max_length=7, default=settings.LANGUAGE_CODE,
choices=settings.LANGUAGE_CHOICES, *args, **kwargs):
return super(LocaleField, self).__init__(
max_length=max_length, default=default, choices=choices,
*args, **kwargs)