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