hooks/syncschema.py
changeset 9548 be001628edad
parent 9469 032825bbacab
child 9621 202c4797e365
--- a/hooks/syncschema.py	Fri Jan 24 13:08:53 2014 +0100
+++ b/hooks/syncschema.py	Tue Jan 21 18:30:16 2014 +0100
@@ -1123,20 +1123,20 @@
             self._cw.transaction_data.setdefault(self.eidfrom, []).append(self.eidto)
 
 
-class BeforeDeleteConstrainedByHook(SyncSchemaHook):
-    __regid__ = 'syncdelconstrainedby'
-    __select__ = SyncSchemaHook.__select__ & hook.match_rtype('constrained_by')
-    events = ('before_delete_relation',)
+class BeforeDeleteCWConstraintHook(SyncSchemaHook):
+    __regid__ = 'syncdelcwconstraint'
+    __select__ = SyncSchemaHook.__select__ & is_instance('CWConstraint')
+    events = ('before_delete_entity',)
 
     def __call__(self):
-        if self._cw.deleted_in_transaction(self.eidfrom):
-            return
+        entity = self.entity
         schema = self._cw.vreg.schema
-        entity = self._cw.entity_from_eid(self.eidto)
-        rdef = schema.schema_by_eid(self.eidfrom)
         try:
+            # KeyError, e.g. composite chain deletion
+            rdef = schema.schema_by_eid(entity.reverse_constrained_by[0].eid)
+            # IndexError
             cstr = rdef.constraint_by_type(entity.type)
-        except IndexError:
+        except (IndexError, KeyError):
             self._cw.critical('constraint type no more accessible')
         else:
             CWConstraintDelOp(self._cw, rdef=rdef, oldcstr=cstr)