Added a type to backend_status
[plstackapi.git] / planetstack / core / models / plcorebase.py
index 000e77e..4b63062 100644 (file)
@@ -7,6 +7,7 @@ from django.forms.models import model_to_dict
 from django.utils import timezone
 from django.core.exceptions import PermissionDenied
 import model_policy
+from model_autodeletion import ephemeral_models
 
 try:
     # This is a no-op if observer_disabled is set to 1 in the config file
@@ -82,17 +83,84 @@ class DiffModelMixIn:
     def get_field_diff(self, field_name):
         return self.diff.get(field_name, None)
 
-class PlCoreBase(models.Model, DiffModelMixIn):
+    #classmethod
+    def getValidators(cls):
+        """ primarily for REST API, return a dictionary of field names mapped
+            to lists of the type of validations that need to be applied to
+            those fields.
+        """
+        validators = {}
+        for field in cls._meta.fields:
+            l = []
+            if field.blank==False:
+                l.append("notBlank")
+            if field.__class__.__name__=="URLField":
+                l.append("url")
+            validators[field.name] = l
+        return validators
+
+class PlCoreBase(models.Model): # , DiffModelMixIn):
     objects = PlCoreBaseManager()
     deleted_objects = PlCoreBaseDeletionManager()
 
+    # ---- copy stuff from DiffModelMixin ----
+
+    # XXX Django fails miserably when trying to create initial migrations when
+    #    DiffModelMixin is used. So, until we figure out what's wrong,
+    #    just copied the guts of DiffModelMixIn here.
+
+    @property
+    def _dict(self):
+        return model_to_dict(self, fields=[field.name for field in
+                             self._meta.fields])
+
+    @property
+    def diff(self):
+        d1 = self._initial
+        d2 = self._dict
+        diffs = [(k, (v, d2[k])) for k, v in d1.items() if v != d2[k]]
+        return dict(diffs)
+
+    @property
+    def has_changed(self):
+        return bool(self.diff)
+
+    @property
+    def changed_fields(self):
+        return self.diff.keys()
+
+    def has_field_changed(self, field_name):
+        return field_name in self.diff.keys()
+
+    def get_field_diff(self, field_name):
+        return self.diff.get(field_name, None)
+
+    #classmethod
+    def getValidators(cls):
+        """ primarily for REST API, return a dictionary of field names mapped
+            to lists of the type of validations that need to be applied to
+            those fields.
+        """
+        validators = {}
+        for field in cls._meta.fields:
+            l = []
+            if field.blank==False:
+                l.append("notBlank")
+            if field.__class__.__name__=="URLField":
+                l.append("url")
+            validators[field.name] = l
+        return validators
+
+    # ---- end copy stuff from DiffModelMixin ----
+
     # default values for created and updated are only there to keep evolution
     # from failing.
     created = models.DateTimeField(auto_now_add=True, default=timezone.now)
     updated = models.DateTimeField(auto_now=True, default=timezone.now)
-    enacted = models.DateTimeField(null=True, default=None)
+    enacted = models.DateTimeField(null=True, blank=True, default=None)
+    policed = models.DateTimeField(null=True, blank=True, default=None)
     backend_status = models.CharField(max_length=140,
-                                      default="Provisioning in progress")
+                                      default="0 - Provisioning in progress")
     deleted = models.BooleanField(default=False)
 
     class Meta:
@@ -117,14 +185,17 @@ class PlCoreBase(models.Model, DiffModelMixIn):
     def delete(self, *args, **kwds):
         # so we have something to give the observer
         purge = kwds.get('purge',False)
+        if purge:
+            del kwds['purge']
         silent = kwds.get('silent',False)
+        if silent:
+            del kwds['silent']
         try:
             purge = purge or observer_disabled
         except NameError:
             pass
 
         if (purge):
-            del kwds['purge']
             super(PlCoreBase, self).delete(*args, **kwds)
         else:
             self.deleted = True
@@ -165,6 +236,12 @@ class PlCoreBase(models.Model, DiffModelMixIn):
         # filtering of visible objects by user.
         return cls.objects.all()
 
+    @classmethod
+    def is_ephemeral(cls):
+       return cls in ephemeral_models
+
+
+