Merge branch 'master' of ssh://git.planet-lab.org/git/plstackapi
[plstackapi.git] / planetstack / core / models / plcorebase.py
1 import os
2 from django.db import models
3 from django.forms.models import model_to_dict
4 from observer.event_manager import EventSender
5
6
7 class PlCoreBase(models.Model):
8
9         created = models.DateTimeField(auto_now_add=True)
10         updated = models.DateTimeField(auto_now=True)
11
12         class Meta:
13                 abstract = True
14                 app_label = "core"
15
16         def __init__(self, *args, **kwargs):
17                 super(PlCoreBase, self).__init__(*args, **kwargs)
18                 self.__initial = self._dict
19
20         @property
21         def diff(self):
22                 d1 = self.__initial
23                 d2 = self._dict
24                 diffs = [(k, (v, d2[k])) for k, v in d1.items() if v != d2[k]]
25                 return dict(diffs)
26
27         @property
28         def has_changed(self):
29                 return bool(self.diff)
30
31         @property
32         def changed_fields(self):
33                 return self.diff.keys()
34
35         def get_field_diff(self, field_name):
36                 return self.diff.get(field_name, None)
37
38         def delete(self, *args, **kwds):
39                 super(PlCoreBase, self).delete(*args, **kwds)
40
41                 EventSender().fire({'delete_flag':True,'model':self.__name__})
42
43         def save(self, *args, **kwargs):
44                 super(PlCoreBase, self).save(*args, **kwargs)
45                 
46                 # Tell the observer that the source database has been updated
47                 EventSender().fire()
48
49                 self.__initial = self._dict
50
51         @property
52         def _dict(self):
53                 return model_to_dict(self, fields=[field.name for field in
54                                                          self._meta.fields])
55
56
57