3 from django.db import models
4 from django.forms.models import model_to_dict
5 from django.core.urlresolvers import reverse
6 from django.forms.models import model_to_dict
7 from django.utils import timezone
11 # This is a no-op if observer_disabled is set to 1 in the config file
12 from observer import *
14 print >> sys.stderr, "import of observer failed! printing traceback and disabling observer:"
18 # guard against something failing
19 def notify_observer(*args, **kwargs):
22 # This manager will be inherited by all subclasses because
23 # the core model is abstract.
24 class PlCoreBaseDeletionManager(models.Manager):
25 def get_queryset(self):
26 parent=super(PlCoreBaseDeletionManager, self)
27 if hasattr(parent, "get_queryset"):
28 return parent.get_queryset().filter(deleted=True)
30 return parent.get_query_set().filter(deleted=True)
32 # deprecated in django 1.7 in favor of get_queryset().
33 def get_query_set(self):
34 return self.get_queryset()
36 # This manager will be inherited by all subclasses because
37 # the core model is abstract.
38 class PlCoreBaseManager(models.Manager):
39 def get_queryset(self):
40 parent=super(PlCoreBaseManager, self)
41 if hasattr(parent, "get_queryset"):
42 return parent.get_queryset().filter(deleted=False)
44 return parent.get_query_set().filter(deleted=False)
46 # deprecated in django 1.7 in favor of get_queryset().
47 def get_query_set(self):
48 return self.get_queryset()
50 class PlCoreBase(models.Model):
51 objects = PlCoreBaseManager()
52 deleted_objects = PlCoreBaseDeletionManager()
54 # default values for created and updated are only there to keep evolution
56 created = models.DateTimeField(auto_now_add=True, default=timezone.now)
57 updated = models.DateTimeField(auto_now=True, default=timezone.now)
58 enacted = models.DateTimeField(null=True, default=None)
59 backend_status = models.CharField(max_length=140,
60 default="Provisioning in progress")
61 deleted = models.BooleanField(default=False)
64 # Changing abstract to False would require the managers of subclasses of
65 # PlCoreBase to be customized individually.
69 def __init__(self, *args, **kwargs):
70 super(PlCoreBase, self).__init__(*args, **kwargs)
71 self.__initial = self._dict
77 diffs = [(k, (v, d2[k])) for k, v in d1.items() if v != d2[k]]
81 def has_changed(self):
82 return bool(self.diff)
85 def changed_fields(self):
86 return self.diff.keys()
88 def get_field_diff(self, field_name):
89 return self.diff.get(field_name, None)
91 def can_update(self, user):
98 def delete(self, *args, **kwds):
99 # so we have something to give the observer
100 purge = kwds.get('purge',False)
101 silent = kwds.get('silent',False)
103 purge = purge or observer_disabled
109 super(PlCoreBase, self).delete(*args, **kwds)
113 self.save(update_fields=['enacted','deleted'], silent=silent)
115 def save(self, *args, **kwargs):
116 if "silent" in kwargs:
117 silent=kwargs.pop("silent")
121 super(PlCoreBase, self).save(*args, **kwargs)
123 # This is a no-op if observer_disabled is set
127 self.__initial = self._dict
129 def save_by_user(self, user, *args, **kwds):
130 if self.can_update(user):
131 self.save(*args, **kwds)
133 def delete_by_user(self, user, *args, **kwds):
134 if self.can_update(user):
135 self.delete(*args, **kwds)
139 return model_to_dict(self, fields=[field.name for field in