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) |