git://git.onelab.eu
/
plstackapi.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Cascading deletions for dependent objects
[plstackapi.git]
/
planetstack
/
model_policy.py
diff --git
a/planetstack/model_policy.py
b/planetstack/model_policy.py
index
dbe8453
..
7dc6dda
100644
(file)
--- a/
planetstack/model_policy.py
+++ b/
planetstack/model_policy.py
@@
-2,16
+2,35
@@
from django.db.models.signals import post_save
from django.dispatch import receiver
import pdb
from core.models import *
from django.dispatch import receiver
import pdb
from core.models import *
+from dependency_walker import *
import model_policies
import model_policies
+def update_dep(d, o):
+ if (d.updated < o.updated):
+ d.save(update_fields=['updated'])
+
+def delete_if_inactive(d, o):
+ #print "Deleting %s (%s)"%(d,d.__class__.__name__)
+ d.delete()
+ return
+
@receiver(post_save)
@receiver(post_save)
-def post_save_handler(sender, **kwargs):
+def post_save_handler(sender,
instance,
**kwargs):
sender_name = sender.__name__
policy_name = 'model_policy_%s'%sender_name
if (not kwargs['update_fields']):
sender_name = sender.__name__
policy_name = 'model_policy_%s'%sender_name
if (not kwargs['update_fields']):
+ # Automatic dirtying
+ walk_inv_deps(update_dep, instance)
+
try:
try:
- policy_handler = getattr(model_policies, policy_name)
- policy_handler.handle(sender)
+ policy_handler = getattr(model_policies, policy_name, None)
+ if policy_handler is not None:
+ policy_handler.handle(instance)
+
+
except:
pass
except:
pass
+ elif 'deleted' in kwargs['update_fields']:
+ walk_inv_deps(delete_if_inactive, instance)
+