hooks/integrity.py
changeset 10936 c3606b52092c
parent 10907 9ae707db5265
equal deleted inserted replaced
10935:049209b9e9d6 10936:c3606b52092c
   109 class IntegrityHook(hook.Hook):
   109 class IntegrityHook(hook.Hook):
   110     __abstract__ = True
   110     __abstract__ = True
   111     category = 'integrity'
   111     category = 'integrity'
   112 
   112 
   113 
   113 
   114 class EnsureSymmetricRelationsAdd(hook.Hook):
   114 class _EnsureSymmetricRelationsAdd(hook.Hook):
   115     """ ensure X r Y => Y r X iff r is symmetric """
   115     """ ensure X r Y => Y r X iff r is symmetric """
   116     __regid__ = 'cw.add_ensure_symmetry'
   116     __regid__ = 'cw.add_ensure_symmetry'
       
   117     __abstract__ = True
   117     category = 'activeintegrity'
   118     category = 'activeintegrity'
   118     events = ('after_add_relation',)
   119     events = ('after_add_relation',)
   119     # __select__ is set in the registration callback
   120     # __select__ is set in the registration callback
   120 
   121 
   121     def __call__(self):
   122     def __call__(self):
   122         self._cw.repo.system_source.add_relation(self._cw, self.eidto,
   123         self._cw.repo.system_source.add_relation(self._cw, self.eidto,
   123                                                  self.rtype, self.eidfrom)
   124                                                  self.rtype, self.eidfrom)
   124 
   125 
   125 
   126 
   126 class EnsureSymmetricRelationsDelete(hook.Hook):
   127 class _EnsureSymmetricRelationsDelete(hook.Hook):
   127     """ ensure X r Y => Y r X iff r is symmetric """
   128     """ ensure X r Y => Y r X iff r is symmetric """
   128     __regid__ = 'cw.delete_ensure_symmetry'
   129     __regid__ = 'cw.delete_ensure_symmetry'
       
   130     __abstract__ = True
   129     category = 'activeintegrity'
   131     category = 'activeintegrity'
   130     events = ('after_delete_relation',)
   132     events = ('after_delete_relation',)
   131     # __select__ is set in the registration callback
   133     # __select__ is set in the registration callback
   132 
   134 
   133     def __call__(self):
   135     def __call__(self):
   335 
   337 
   336 def registration_callback(vreg):
   338 def registration_callback(vreg):
   337     vreg.register_all(globals().values(), __name__)
   339     vreg.register_all(globals().values(), __name__)
   338     symmetric_rtypes = [rschema.type for rschema in vreg.schema.relations()
   340     symmetric_rtypes = [rschema.type for rschema in vreg.schema.relations()
   339                         if rschema.symmetric]
   341                         if rschema.symmetric]
   340     EnsureSymmetricRelationsAdd.__select__ = hook.Hook.__select__ & hook.match_rtype(*symmetric_rtypes)
   342     class EnsureSymmetricRelationsAdd(_EnsureSymmetricRelationsAdd):
   341     EnsureSymmetricRelationsDelete.__select__ = hook.Hook.__select__ & hook.match_rtype(*symmetric_rtypes)
   343         __select__ = _EnsureSymmetricRelationsAdd.__select__ & hook.match_rtype(*symmetric_rtypes)
       
   344     vreg.register(EnsureSymmetricRelationsAdd)
       
   345     class EnsureSymmetricRelationsDelete(_EnsureSymmetricRelationsDelete):
       
   346         __select__ = _EnsureSymmetricRelationsDelete.__select__ & hook.match_rtype(*symmetric_rtypes)
       
   347     vreg.register(EnsureSymmetricRelationsDelete)