e12b15cb8bc61a1c876bce2c19ee409763c347da
[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 from util.logger import logger
8
9 modelPolicyEnabled = True
10
11 def EnableModelPolicy(x):
12     global modelPolicyEnabled
13     modelPolicyEnabled = x
14
15 def update_dep(d, o):
16         try:
17                 if (d.updated < o.updated):
18                         d.save(update_fields=['updated'])
19         except AttributeError,e:
20                 pdb.set_trace()
21                 raise e
22         
23 def delete_if_inactive(d, o):
24         #print "Deleting %s (%s)"%(d,d.__class__.__name__)
25         d.delete()      
26         return
27
28 @receiver(post_save)
29 def post_save_handler(sender, instance, **kwargs):
30         if not modelPolicyEnabled:
31             return
32
33         sender_name = sender.__name__
34         policy_name = 'model_policy_%s'%sender_name
35         
36         if (not kwargs['update_fields']):
37                 # Automatic dirtying
38                 walk_inv_deps(update_dep, instance)
39
40                 try:
41                         policy_handler = getattr(model_policies, policy_name, None)
42                         if policy_handler is not None:
43                                 policy_handler.handle(instance)
44                 except:
45                         logger.log_exc("Model Policy Error:") 
46         elif 'deleted' in kwargs['update_fields']:
47                 walk_inv_deps(delete_if_inactive, instance)
48