X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=planetstack%2Fmodel_policy.py;h=de6f73d49cf84db4a751a2e3d9eb65855c2511aa;hb=d9d0b026284fa0f783826231b0348a951c22ca7b;hp=fa558175b8658aa01af64a09b9912f454560c410;hpb=ba5379b74bdf94a4e52363a1d6031d64a2184036;p=plstackapi.git diff --git a/planetstack/model_policy.py b/planetstack/model_policy.py index fa55817..de6f73d 100644 --- a/planetstack/model_policy.py +++ b/planetstack/model_policy.py @@ -2,14 +2,46 @@ from django.db.models.signals import post_save from django.dispatch import receiver import pdb from core.models import * +from dependency_walker import * import model_policies +modelPolicyEnabled = True + +def EnableModelPolicy(x): + global modelPolicyEnabled + modelPolicyEnabled = x + +def update_dep(d, o): + try: + if (d.updated < o.updated): + d.save(update_fields=['updated']) + except AttributeError,e: + pdb.set_trace() + raise e + +def delete_if_inactive(d, o): + #print "Deleting %s (%s)"%(d,d.__class__.__name__) + d.delete() + return + @receiver(post_save) -def post_save_handler(sender, **kwargs): +def post_save_handler(sender, instance, **kwargs): + if not modelPolicyEnabled: + return + sender_name = sender.__name__ policy_name = 'model_policy_%s'%sender_name - try: - policy_handler = getattr(model_policies, policy_name) - policy_handler.handle(sender) - except: - pass + + if (not kwargs['update_fields']): + # Automatic dirtying + walk_inv_deps(update_dep, instance) + + try: + policy_handler = getattr(model_policies, policy_name, None) + if policy_handler is not None: + policy_handler.handle(instance) + except: + pass + elif 'deleted' in kwargs['update_fields']: + walk_inv_deps(delete_if_inactive, instance) +