Worked around an exception
[plstackapi.git] / planetstack / model_policy.py
1 from django.db.models.signals import post_save
2 from django.dispatch import receiver
3 import pdb
4 from core.models import *
5 from dependency_walker import *
6 import model_policies
7
8 modelPolicyEnabled = True
9
10 def EnableModelPolicy(x):
11     global modelPolicyEnabled
12     modelPolicyEnabled = x
13
14 def update_dep(d, o):
15         try:
16                 if (d.updated < o.updated):
17                         d.save(update_fields=['updated'])
18         except AttributeError,e:
19                 pdb.set_trace()
20                 raise e
21         
22 def delete_if_inactive(d, o):
23         #print "Deleting %s (%s)"%(d,d.__class__.__name__)
24         d.delete()      
25         return
26
27 @receiver(post_save)
28 def post_save_handler(sender, instance, **kwargs):
29         if not modelPolicyEnabled:
30             return
31
32         sender_name = sender.__name__
33         policy_name = 'model_policy_%s'%sender_name
34         
35         if (not kwargs['update_fields']):
36                 # Automatic dirtying
37                 walk_inv_deps(update_dep, instance)
38
39                 try:
40                         policy_handler = getattr(model_policies, policy_name, None)
41                         if policy_handler is not None:
42                                 policy_handler.handle(instance)
43                 except:
44                         pass
45         elif 'deleted' in kwargs['update_fields']:
46                 walk_inv_deps(delete_if_inactive, instance)
47