server/hooks.py
branchtls-sprint
changeset 1398 5fe84a5f7035
parent 1263 01152fffd593
child 1802 d628defebc17
equal deleted inserted replaced
1397:6cbc7bc8ea6d 1398:5fe84a5f7035
   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', '')
   360     for session_ in get_user_sessions(session.repo, eid):
   360     for session_ in get_user_sessions(session.repo, eid):
   361         DelUserOp(session, session_.id)
   361         DelUserOp(session, session_.id)
   362     
   362     
   363 def _register_usergroup_hooks(hm):
   363 def _register_usergroup_hooks(hm):
   364     """register user/group related hooks on the hooks manager"""
   364     """register user/group related hooks on the hooks manager"""
   365     hm.register_hook(after_del_user, 'after_delete_entity', 'EUser')
   365     hm.register_hook(after_del_user, 'after_delete_entity', 'CWUser')
   366     hm.register_hook(after_add_in_group, 'after_add_relation', 'in_group')
   366     hm.register_hook(after_add_in_group, 'after_add_relation', 'in_group')
   367     hm.register_hook(after_del_in_group, 'after_delete_relation', 'in_group')
   367     hm.register_hook(after_del_in_group, 'after_delete_relation', 'in_group')
   368 
   368 
   369 
   369 
   370 # workflow handling ###########################################################
   370 # workflow handling ###########################################################
   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)
   482         raise ValidationError(entity.eid, {'value': session._(str(ex))})
   482         raise ValidationError(entity.eid, {'value': session._(str(ex))})
   483     if not session.user.matching_groups('managers'):
   483     if not session.user.matching_groups('managers'):
   484         session.unsafe_execute('SET P for_user U WHERE P eid %(x)s,U eid %(u)s',
   484         session.unsafe_execute('SET P for_user U WHERE P eid %(x)s,U eid %(u)s',
   485                                {'x': entity.eid, 'u': session.user.eid}, 'x')
   485                                {'x': entity.eid, 'u': session.user.eid}, 'x')
   486     else:
   486     else:
   487         AddEPropertyOp(session, eprop=entity)
   487         AddCWPropertyOp(session, eprop=entity)
   488         
   488         
   489 def after_update_eproperty(session, entity):
   489 def after_update_eproperty(session, entity):
   490     key, value = entity.pkey, entity.value
   490     key, value = entity.pkey, entity.value
   491     try:
   491     try:
   492         value = session.vreg.typed_value(key, value)
   492         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')