hooks/workflow.py
changeset 7294 2af1a4cecda5
parent 6757 bc878ec35794
child 7879 9aae456abab5
equal deleted inserted replaced
7293:97505b798975 7294:2af1a4cecda5
   146 
   146 
   147 # hooks ########################################################################
   147 # hooks ########################################################################
   148 
   148 
   149 class WorkflowHook(hook.Hook):
   149 class WorkflowHook(hook.Hook):
   150     __abstract__ = True
   150     __abstract__ = True
   151     category = 'workflow'
   151     category = 'metadata'
   152 
   152 
   153 
   153 
   154 class SetInitialStateHook(WorkflowHook):
   154 class SetInitialStateHook(WorkflowHook):
   155     __regid__ = 'wfsetinitial'
   155     __regid__ = 'wfsetinitial'
   156     __select__ = WorkflowHook.__select__ & adaptable('IWorkflowable')
   156     __select__ = WorkflowHook.__select__ & adaptable('IWorkflowable')
   158 
   158 
   159     def __call__(self):
   159     def __call__(self):
   160         _SetInitialStateOp(self._cw, entity=self.entity)
   160         _SetInitialStateOp(self._cw, entity=self.entity)
   161 
   161 
   162 
   162 
   163 class PrepareStateChangeHook(WorkflowHook):
       
   164     """record previous state information"""
       
   165     __regid__ = 'cwdelstate'
       
   166     __select__ = WorkflowHook.__select__ & hook.match_rtype('in_state')
       
   167     events = ('before_delete_relation',)
       
   168 
       
   169     def __call__(self):
       
   170         self._cw.transaction_data.setdefault('pendingrelations', []).append(
       
   171             (self.eidfrom, self.rtype, self.eidto))
       
   172 
       
   173 
       
   174 class FireTransitionHook(WorkflowHook):
   163 class FireTransitionHook(WorkflowHook):
   175     """check the transition is allowed, add missing information. Expect that:
   164     """check the transition is allowed and add missing information into the
       
   165     TrInfo entity.
       
   166 
       
   167     Expect that:
   176     * wf_info_for inlined relation is set
   168     * wf_info_for inlined relation is set
   177     * by_transition or to_state (managers only) inlined relation is set
   169     * by_transition or to_state (managers only) inlined relation is set
       
   170 
       
   171     Check for automatic transition to be fired at the end
   178     """
   172     """
   179     __regid__ = 'wffiretransition'
   173     __regid__ = 'wffiretransition'
   180     __select__ = WorkflowHook.__select__ & is_instance('TrInfo')
   174     __select__ = WorkflowHook.__select__ & is_instance('TrInfo')
   181     events = ('before_add_entity',)
   175     events = ('before_add_entity',)
   182 
   176 
   271         nocheck.add((entity.eid, 'to_state', deststateeid))
   265         nocheck.add((entity.eid, 'to_state', deststateeid))
   272         _FireAutotransitionOp(session, entity=forentity)
   266         _FireAutotransitionOp(session, entity=forentity)
   273 
   267 
   274 
   268 
   275 class FiredTransitionHook(WorkflowHook):
   269 class FiredTransitionHook(WorkflowHook):
   276     """change related entity state"""
   270     """change related entity state and handle exit of subworkflow"""
   277     __regid__ = 'wffiretransition'
   271     __regid__ = 'wffiretransition'
   278     __select__ = WorkflowHook.__select__ & is_instance('TrInfo')
   272     __select__ = WorkflowHook.__select__ & is_instance('TrInfo')
   279     events = ('after_add_entity',)
   273     events = ('after_add_entity',)
   280 
   274 
   281     def __call__(self):
   275     def __call__(self):
   294     """check state apply, in case of direct in_state change using unsafe execute
   288     """check state apply, in case of direct in_state change using unsafe execute
   295     """
   289     """
   296     __regid__ = 'wfcheckinstate'
   290     __regid__ = 'wfcheckinstate'
   297     __select__ = WorkflowHook.__select__ & hook.match_rtype('in_state')
   291     __select__ = WorkflowHook.__select__ & hook.match_rtype('in_state')
   298     events = ('before_add_relation',)
   292     events = ('before_add_relation',)
       
   293     category = 'integrity'
   299 
   294 
   300     def __call__(self):
   295     def __call__(self):
   301         session = self._cw
   296         session = self._cw
   302         nocheck = session.transaction_data.get('skip-security', ())
   297         nocheck = session.transaction_data.get('skip-security', ())
   303         if (self.eidfrom, 'in_state', self.eidto) in nocheck:
   298         if (self.eidfrom, 'in_state', self.eidto) in nocheck: