123 hm.register_hook(sync_owner_after_add_composite_relation, 'after_add_relation', '') |
123 hm.register_hook(sync_owner_after_add_composite_relation, 'after_add_relation', '') |
124 hm.register_hook(fti_update_after_add_relation, 'after_add_relation', '') |
124 hm.register_hook(fti_update_after_add_relation, 'after_add_relation', '') |
125 hm.register_hook(fti_update_after_delete_relation, 'after_delete_relation', '') |
125 hm.register_hook(fti_update_after_delete_relation, 'after_delete_relation', '') |
126 if 'is' in hm.schema: |
126 if 'is' in hm.schema: |
127 hm.register_hook(setis_after_add_entity, 'after_add_entity', '') |
127 hm.register_hook(setis_after_add_entity, 'after_add_entity', '') |
128 if 'EUser' in hm.schema: |
128 if 'CWUser' in hm.schema: |
129 hm.register_hook(setowner_after_add_user, 'after_add_entity', 'EUser') |
129 hm.register_hook(setowner_after_add_user, 'after_add_entity', 'CWUser') |
130 |
130 |
131 # core hooks ################################################################## |
131 # core hooks ################################################################## |
132 |
132 |
133 class DelayedDeleteOp(PreCommitOperation): |
133 class DelayedDeleteOp(PreCommitOperation): |
134 """delete the object of composite relation except if the relation |
134 """delete the object of composite relation except if the relation |
280 checkrel_if_necessary(session, CheckORelationOp, rtype, eidto) |
280 checkrel_if_necessary(session, CheckORelationOp, rtype, eidto) |
281 |
281 |
282 |
282 |
283 def _register_core_hooks(hm): |
283 def _register_core_hooks(hm): |
284 hm.register_hook(handle_composite_before_del_relation, 'before_delete_relation', '') |
284 hm.register_hook(handle_composite_before_del_relation, 'before_delete_relation', '') |
285 hm.register_hook(before_del_group, 'before_delete_entity', 'EGroup') |
285 hm.register_hook(before_del_group, 'before_delete_entity', 'CWGroup') |
286 |
286 |
287 #hm.register_hook(cstrcheck_before_update_entity, 'before_update_entity', '') |
287 #hm.register_hook(cstrcheck_before_update_entity, 'before_update_entity', '') |
288 hm.register_hook(cardinalitycheck_after_add_entity, 'after_add_entity', '') |
288 hm.register_hook(cardinalitycheck_after_add_entity, 'after_add_entity', '') |
289 hm.register_hook(cardinalitycheck_before_del_relation, 'before_delete_relation', '') |
289 hm.register_hook(cardinalitycheck_before_del_relation, 'before_delete_relation', '') |
290 hm.register_hook(cstrcheck_after_add_relation, 'after_add_relation', '') |
290 hm.register_hook(cstrcheck_after_add_relation, 'after_add_relation', '') |
440 if 'in_state' in eschema.subject_relations(): |
440 if 'in_state' in eschema.subject_relations(): |
441 hm.register_hook(set_initial_state_after_add, 'after_add_entity', |
441 hm.register_hook(set_initial_state_after_add, 'after_add_entity', |
442 str(eschema)) |
442 str(eschema)) |
443 |
443 |
444 |
444 |
445 # EProperty hooks ############################################################# |
445 # CWProperty hooks ############################################################# |
446 |
446 |
447 |
447 |
448 class DelEPropertyOp(Operation): |
448 class DelCWPropertyOp(Operation): |
449 """a user's custom properties has been deleted""" |
449 """a user's custom properties has been deleted""" |
450 |
450 |
451 def commit_event(self): |
451 def commit_event(self): |
452 """the observed connections pool has been commited""" |
452 """the observed connections pool has been commited""" |
453 try: |
453 try: |
454 del self.epropdict[self.key] |
454 del self.epropdict[self.key] |
455 except KeyError: |
455 except KeyError: |
456 self.error('%s has no associated value', self.key) |
456 self.error('%s has no associated value', self.key) |
457 |
457 |
458 class ChangeEPropertyOp(Operation): |
458 class ChangeCWPropertyOp(Operation): |
459 """a user's custom properties has been added/changed""" |
459 """a user's custom properties has been added/changed""" |
460 |
460 |
461 def commit_event(self): |
461 def commit_event(self): |
462 """the observed connections pool has been commited""" |
462 """the observed connections pool has been commited""" |
463 self.epropdict[self.key] = self.value |
463 self.epropdict[self.key] = self.value |
464 |
464 |
465 class AddEPropertyOp(Operation): |
465 class AddCWPropertyOp(Operation): |
466 """a user's custom properties has been added/changed""" |
466 """a user's custom properties has been added/changed""" |
467 |
467 |
468 def commit_event(self): |
468 def commit_event(self): |
469 """the observed connections pool has been commited""" |
469 """the observed connections pool has been commited""" |
470 eprop = self.eprop |
470 eprop = self.eprop |
471 if not eprop.for_user: |
471 if not eprop.for_user: |
472 self.repo.vreg.eprop_values[eprop.pkey] = eprop.value |
472 self.repo.vreg.eprop_values[eprop.pkey] = eprop.value |
473 # if for_user is set, update is handled by a ChangeEPropertyOp operation |
473 # if for_user is set, update is handled by a ChangeCWPropertyOp operation |
474 |
474 |
475 def after_add_eproperty(session, entity): |
475 def after_add_eproperty(session, entity): |
476 key, value = entity.pkey, entity.value |
476 key, value = entity.pkey, entity.value |
477 try: |
477 try: |
478 value = session.vreg.typed_value(key, value) |
478 value = session.vreg.typed_value(key, value) |
494 return |
494 return |
495 except ValueError, ex: |
495 except ValueError, ex: |
496 raise ValidationError(entity.eid, {'value': session._(str(ex))}) |
496 raise ValidationError(entity.eid, {'value': session._(str(ex))}) |
497 if entity.for_user: |
497 if entity.for_user: |
498 for session_ in get_user_sessions(session.repo, entity.for_user[0].eid): |
498 for session_ in get_user_sessions(session.repo, entity.for_user[0].eid): |
499 ChangeEPropertyOp(session, epropdict=session_.user.properties, |
499 ChangeCWPropertyOp(session, epropdict=session_.user.properties, |
500 key=key, value=value) |
500 key=key, value=value) |
501 else: |
501 else: |
502 # site wide properties |
502 # site wide properties |
503 ChangeEPropertyOp(session, epropdict=session.vreg.eprop_values, |
503 ChangeCWPropertyOp(session, epropdict=session.vreg.eprop_values, |
504 key=key, value=value) |
504 key=key, value=value) |
505 |
505 |
506 def before_del_eproperty(session, eid): |
506 def before_del_eproperty(session, eid): |
507 for eidfrom, rtype, eidto in session.query_data('pendingrelations', ()): |
507 for eidfrom, rtype, eidto in session.query_data('pendingrelations', ()): |
508 if rtype == 'for_user' and eidfrom == eid: |
508 if rtype == 'for_user' and eidfrom == eid: |
509 # if for_user was set, delete has already been handled |
509 # if for_user was set, delete has already been handled |
510 break |
510 break |
511 else: |
511 else: |
512 key = session.execute('Any K WHERE P eid %(x)s, P pkey K', |
512 key = session.execute('Any K WHERE P eid %(x)s, P pkey K', |
513 {'x': eid}, 'x')[0][0] |
513 {'x': eid}, 'x')[0][0] |
514 DelEPropertyOp(session, epropdict=session.vreg.eprop_values, key=key) |
514 DelCWPropertyOp(session, epropdict=session.vreg.eprop_values, key=key) |
515 |
515 |
516 def after_add_for_user(session, fromeid, rtype, toeid): |
516 def after_add_for_user(session, fromeid, rtype, toeid): |
517 if not session.describe(fromeid)[0] == 'EProperty': |
517 if not session.describe(fromeid)[0] == 'CWProperty': |
518 return |
518 return |
519 key, value = session.execute('Any K,V WHERE P eid %(x)s,P pkey K,P value V', |
519 key, value = session.execute('Any K,V WHERE P eid %(x)s,P pkey K,P value V', |
520 {'x': fromeid}, 'x')[0] |
520 {'x': fromeid}, 'x')[0] |
521 if session.vreg.property_info(key)['sitewide']: |
521 if session.vreg.property_info(key)['sitewide']: |
522 raise ValidationError(fromeid, |
522 raise ValidationError(fromeid, |
523 {'for_user': session._("site-wide property can't be set for user")}) |
523 {'for_user': session._("site-wide property can't be set for user")}) |
524 for session_ in get_user_sessions(session.repo, toeid): |
524 for session_ in get_user_sessions(session.repo, toeid): |
525 ChangeEPropertyOp(session, epropdict=session_.user.properties, |
525 ChangeCWPropertyOp(session, epropdict=session_.user.properties, |
526 key=key, value=value) |
526 key=key, value=value) |
527 |
527 |
528 def before_del_for_user(session, fromeid, rtype, toeid): |
528 def before_del_for_user(session, fromeid, rtype, toeid): |
529 key = session.execute('Any K WHERE P eid %(x)s, P pkey K', |
529 key = session.execute('Any K WHERE P eid %(x)s, P pkey K', |
530 {'x': fromeid}, 'x')[0][0] |
530 {'x': fromeid}, 'x')[0][0] |
531 relation_deleted(session, fromeid, rtype, toeid) |
531 relation_deleted(session, fromeid, rtype, toeid) |
532 for session_ in get_user_sessions(session.repo, toeid): |
532 for session_ in get_user_sessions(session.repo, toeid): |
533 DelEPropertyOp(session, epropdict=session_.user.properties, key=key) |
533 DelCWPropertyOp(session, epropdict=session_.user.properties, key=key) |
534 |
534 |
535 def _register_eproperty_hooks(hm): |
535 def _register_eproperty_hooks(hm): |
536 """register workflow related hooks on the hooks manager""" |
536 """register workflow related hooks on the hooks manager""" |
537 hm.register_hook(after_add_eproperty, 'after_add_entity', 'EProperty') |
537 hm.register_hook(after_add_eproperty, 'after_add_entity', 'CWProperty') |
538 hm.register_hook(after_update_eproperty, 'after_update_entity', 'EProperty') |
538 hm.register_hook(after_update_eproperty, 'after_update_entity', 'CWProperty') |
539 hm.register_hook(before_del_eproperty, 'before_delete_entity', 'EProperty') |
539 hm.register_hook(before_del_eproperty, 'before_delete_entity', 'CWProperty') |
540 hm.register_hook(after_add_for_user, 'after_add_relation', 'for_user') |
540 hm.register_hook(after_add_for_user, 'after_add_relation', 'for_user') |
541 hm.register_hook(before_del_for_user, 'before_delete_relation', 'for_user') |
541 hm.register_hook(before_del_for_user, 'before_delete_relation', 'for_user') |