remove Dashboard Views from user admin
[plstackapi.git] / planetstack / model_policy.py
index 38caf01..8ddb82e 100644 (file)
@@ -1,14 +1,72 @@
 from django.db.models.signals import post_save
 from django.dispatch import receiver
 import pdb
-from model_policies import *
+from dependency_walker import *
+import model_policies
+from util.logger import logger
+from datetime import datetime
+import time
+from core.models import *
+from django.db.transaction import atomic
+from django.db.models import F, Q
 
-@receiver(post_save)
-def post_save_handler(sender, **kwargs):
-       sender_name = sender.__name__
-       policy_name = 'model_policy_%s'%sender_name
+modelPolicyEnabled = True
+
+def EnableModelPolicy(x):
+    global modelPolicyEnabled
+    modelPolicyEnabled = x
+
+def update_dep(d, o):
        try:
-               policy_handler = globals[policy_name]
-               policy_handler(sender)
-       except:
-               pass
+               if (d.updated < o.updated):
+                       d.save(update_fields=['updated'])
+       except AttributeError,e:
+               raise e
+       
+def delete_if_inactive(d, o):
+       #print "Deleting %s (%s)"%(d,d.__class__.__name__)
+       # d.delete()    
+       return
+
+@atomic
+def execute_model_policy(instance, deleted):
+       # Automatic dirtying
+       walk_inv_deps(update_dep, instance)
+
+       sender_name = instance.__class__.__name__
+       policy_name = 'model_policy_%s'%sender_name
+       noargs = False
+
+       if deleted:
+               walk_inv_deps(delete_if_inactive, instance)
+       else:
+               try:
+                       policy_handler = getattr(model_policies, policy_name, None)
+                       logger.error("POLICY HANDLER: %s %s" % (policy_name, policy_handler))                       
+                       if policy_handler is not None:
+                               policy_handler.handle(instance)
+               except:
+                       logger.log_exc("Model Policy Error:") 
+                       print "Policy Exceution Error"
+
+       instance.policed=datetime.now()
+        instance.save(update_fields=['policed'])
+
+def run_policy():
+        from core.models import Slice,Controller,Network,User,SlicePrivilege,Site,SitePrivilege,Image,ControllerSlice
+       while (True):
+               start = time.time()
+               models = [Slice, Controller, Network, User, SlicePrivilege, Site, SitePrivilege, Image, ControllerSlice]
+               objects = []
+               
+               for m in models:
+                       res = m.objects.filter(Q(policed__lt=F('updated')) | Q(policed=None))
+                       objects.extend(res)     
+
+               for o in objects:
+                       print "Working on %r"%o
+                       execute_model_policy(o, False)
+               
+               
+               if (time.time()-start<1):
+                       time.sleep(1)