1 <?xml version="1.0" encoding="utf-8"?>
5 <record id="view_test_workflow_model" model="ir.ui.view">
6 <field name="name">Test workflow</field>
7 <field name="model">test.workflow.model</field>
8 <field name="arch" type="xml">
9 <form string="Test workflow">
10 <button name="a-b" string="a-b" type="workflow" icon="gtk-ok" colspan="1"/>
12 <button name="trigger" string="trigger" type="object" icon="gtk-ok" colspan="1"/>
13 <label string="trigger"/>
18 <record id="action_test_workflow" model="ir.actions.act_window">
19 <field name="name">Test workflow</field>
20 <field name="type">ir.actions.act_window</field>
21 <field name="res_model">test.workflow.model</field>
22 <field name="view_type">form</field>
23 <field name="view_mode">tree,form</field>
26 <menuitem icon="STOCK_PREFERENCES" id="base.menu_tests" name="Tests" sequence="1000000"/>
28 <menuitem id="menu_test_workflow" parent="base.menu_tests" name="Test workflow"/>
30 <menuitem id="menu_test_workflow_leaf"
32 action="action_test_workflow"
33 parent="menu_test_workflow"/>
36 <record id="test_workflow_trigger_1" model="test.workflow.trigger">
37 <!-- A single trigger record, with known ID 1 -->
40 <!-- A simple workflow:
42 a -signal-> b -trigger-> c
45 <record id="test_workflow" model="workflow">
46 <field name="name">test.workflow</field>
47 <field name="osv">test.workflow.model</field>
48 <field name="on_create">True</field>
51 <record id="activity_a" model="workflow.activity">
52 <field name="wkf_id" ref="test_workflow"/>
53 <field name="flow_start">True</field>
54 <field name="name">a</field>
55 <field name="kind">function</field>
56 <field name="action">print_a()</field>
58 <record id="activity_b" model="workflow.activity">
59 <field name="wkf_id" ref="test_workflow"/>
60 <field name="name">b</field>
61 <field name="kind">function</field>
62 <field name="action">print_b()</field>
64 <record id="activity_c" model="workflow.activity">
65 <field name="wkf_id" ref="test_workflow"/>
66 <field name="flow_stop">True</field>
67 <field name="name">c</field>
68 <field name="kind">function</field>
69 <field name="action">print_c()</field>
72 <record id="trans_a_b" model="workflow.transition">
73 <field name="act_from" ref="activity_a"/>
74 <field name="act_to" ref="activity_b"/>
75 <field name="signal">a-b</field>
77 <record id="trans_b_c" model="workflow.transition">
78 <field name="act_from" ref="activity_b"/>
79 <field name="act_to" ref="activity_c"/>
80 <field name="condition">condition()</field>
81 <field name="trigger_model">test.workflow.trigger</field>
82 <field name="trigger_expr_id">[1]</field>
85 <!-- Workflow A (a single activity):
90 <record id="test_workflow_a" model="workflow">
91 <field name="name">test.workflow.a</field>
92 <field name="osv">test.workflow.model.a</field>
93 <field name="on_create">True</field>
96 <record id="activity_a_a" model="workflow.activity">
97 <field name="wkf_id" ref="test_workflow_a"/>
98 <field name="flow_start">True</field>
99 <field name="flow_stop">True</field>
100 <field name="name">a</field>
101 <field name="kind">dummy</field>
104 <!-- Workflow B (a single activity):
108 The function is run when the record is created.
111 <record id="test_workflow_b" model="workflow">
112 <field name="name">test.workflow.b</field>
113 <field name="osv">test.workflow.model.b</field>
114 <field name="on_create">True</field>
117 <record id="activity_b_a" model="workflow.activity">
118 <field name="wkf_id" ref="test_workflow_b"/>
119 <field name="flow_start">True</field>
120 <field name="flow_stop">True</field>
121 <field name="name">a</field>
122 <field name="kind">function</field>
123 <field name="action">write({'value': 1})</field>
126 <!-- Workflow C (a single activity):
130 The function is not run when the kind is dummy and no action_id is provided.
132 <record id="test_workflow_c" model="workflow">
133 <field name="name">test.workflow.c</field>
134 <field name="osv">test.workflow.model.c</field>
135 <field name="on_create">True</field>
138 <record id="activity_c_a" model="workflow.activity">
139 <field name="wkf_id" ref="test_workflow_c"/>
140 <field name="flow_start">True</field>
141 <field name="flow_stop">True</field>
142 <field name="name">a</field>
143 <field name="kind">dummy</field>
144 <field name="action">write({'value': 1})</field>
147 <!-- Workflow D (a single activity):
151 The function is run when the kind is stopall and no action_id is provided.
153 <record id="test_workflow_d" model="workflow">
154 <field name="name">test.workflow.d</field>
155 <field name="osv">test.workflow.model.d</field>
156 <field name="on_create">True</field>
159 <record id="activity_d_a" model="workflow.activity">
160 <field name="wkf_id" ref="test_workflow_d"/>
161 <field name="flow_start">True</field>
162 <field name="flow_stop">True</field>
163 <field name="name">a</field>
164 <field name="kind">stopall</field>
165 <field name="action">write({'value': 1})</field>
172 Both activities are run when the workflow is instanciated.
174 <record id="test_workflow_e" model="workflow">
175 <field name="name">test.workflow.e</field>
176 <field name="osv">test.workflow.model.e</field>
177 <field name="on_create">True</field>
180 <record id="activity_e_a" model="workflow.activity">
181 <field name="wkf_id" ref="test_workflow_e"/>
182 <field name="flow_start">True</field>
183 <field name="name">a</field>
184 <field name="kind">function</field>
185 <field name="action">write({'value': 1})</field>
187 <record id="activity_e_b" model="workflow.activity">
188 <field name="wkf_id" ref="test_workflow_e"/>
189 <field name="flow_stop">True</field>
190 <field name="name">b</field>
191 <field name="kind">function</field>
192 <field name="action">write({'value': 2})</field>
195 <record id="trans_e_a_b" model="workflow.transition">
196 <field name="act_from" ref="activity_e_a"/>
197 <field name="act_to" ref="activity_e_b"/>
204 Same as E but with a signal on the transition.
206 <record id="test_workflow_f" model="workflow">
207 <field name="name">test.workflow.f</field>
208 <field name="osv">test.workflow.model.f</field>
209 <field name="on_create">True</field>
212 <record id="activity_f_a" model="workflow.activity">
213 <field name="wkf_id" ref="test_workflow_f"/>
214 <field name="flow_start">True</field>
215 <field name="name">a</field>
216 <field name="kind">function</field>
217 <field name="action">write({'value': 1})</field>
219 <record id="activity_f_b" model="workflow.activity">
220 <field name="wkf_id" ref="test_workflow_f"/>
221 <field name="flow_stop">True</field>
222 <field name="name">b</field>
223 <field name="kind">function</field>
224 <field name="action">write({'value': 2})</field>
227 <record id="trans_f_a_b" model="workflow.transition">
228 <field name="act_from" ref="activity_f_a"/>
229 <field name="act_to" ref="activity_f_b"/>
230 <field name="signal">a-b</field>
238 <record id="test_workflow_g" model="workflow">
239 <field name="name">test.workflow.g</field>
240 <field name="osv">test.workflow.model.g</field>
241 <field name="on_create">True</field>
244 <record id="activity_g_a" model="workflow.activity">
245 <field name="wkf_id" ref="test_workflow_g"/>
246 <field name="flow_start">True</field>
247 <field name="name">a</field>
248 <field name="kind">function</field>
249 <field name="action">write({'value': 1})</field>
251 <record id="activity_g_b" model="workflow.activity">
252 <field name="wkf_id" ref="test_workflow_g"/>
253 <field name="flow_stop">True</field>
254 <field name="name">b</field>
255 <field name="kind">function</field>
256 <field name="action">write({'value': 2})</field>
259 <record id="trans_g_a_b" model="workflow.transition">
260 <field name="act_from" ref="activity_g_a"/>
261 <field name="act_to" ref="activity_g_b"/>
262 <field name="condition">False</field>
267 a or -> b { value: 2 }
270 Whether the action of b or c is exectued last is non-deterministic.
273 <record id="test_workflow_h" model="workflow">
274 <field name="name">test.workflow.h</field>
275 <field name="osv">test.workflow.model.h</field>
276 <field name="on_create">True</field>
279 <record id="activity_h_a" model="workflow.activity">
280 <field name="wkf_id" ref="test_workflow_h"/>
281 <field name="flow_start">True</field>
282 <field name="name">a</field>
283 <field name="kind">function</field>
284 <field name="action">write({'value': 1})</field>
285 <field name="split_mode">OR</field>
287 <record id="activity_h_b" model="workflow.activity">
288 <field name="wkf_id" ref="test_workflow_h"/>
289 <field name="flow_stop">True</field>
290 <field name="name">b</field>
291 <field name="kind">function</field>
292 <field name="action">write({'value': 2})</field>
294 <record id="activity_h_c" model="workflow.activity">
295 <field name="wkf_id" ref="test_workflow_h"/>
296 <field name="flow_stop">True</field>
297 <field name="name">c</field>
298 <field name="kind">function</field>
299 <field name="action">write({'value': 2})</field>
302 <record id="trans_h_a_b" model="workflow.transition">
303 <field name="act_from" ref="activity_h_a"/>
304 <field name="act_to" ref="activity_h_b"/>
306 <record id="trans_h_a_c" model="workflow.transition">
307 <field name="act_from" ref="activity_h_a"/>
308 <field name="act_to" ref="activity_h_c"/>
313 a or -> b { value: 2 }
314 `false> c { value: 3 }
317 <record id="test_workflow_i" model="workflow">
318 <field name="name">test.workflow.i</field>
319 <field name="osv">test.workflow.model.i</field>
320 <field name="on_create">True</field>
323 <record id="activity_i_a" model="workflow.activity">
324 <field name="wkf_id" ref="test_workflow_i"/>
325 <field name="flow_start">True</field>
326 <field name="name">a</field>
327 <field name="kind">function</field>
328 <field name="action">write({'value': 1})</field>
329 <field name="split_mode">OR</field>
331 <record id="activity_i_b" model="workflow.activity">
332 <field name="wkf_id" ref="test_workflow_i"/>
333 <field name="flow_stop">True</field>
334 <field name="name">b</field>
335 <field name="kind">function</field>
336 <field name="action">write({'value': 2})</field>
338 <record id="activity_i_c" model="workflow.activity">
339 <field name="wkf_id" ref="test_workflow_i"/>
340 <field name="flow_stop">True</field>
341 <field name="name">c</field>
342 <field name="kind">function</field>
343 <field name="action">write({'value': 3})</field>
346 <record id="trans_i_a_b" model="workflow.transition">
347 <field name="act_from" ref="activity_i_a"/>
348 <field name="act_to" ref="activity_i_b"/>
350 <record id="trans_i_a_c" model="workflow.transition">
351 <field name="act_from" ref="activity_i_a"/>
352 <field name="act_to" ref="activity_i_c"/>
353 <field name="condition">False</field>
358 a and -> b { value: 2 }
359 `False> c { value: 3 }
361 This will stay in a because all transitions should be True at the same time.
364 <record id="test_workflow_j" model="workflow">
365 <field name="name">test.workflow.j</field>
366 <field name="osv">test.workflow.model.j</field>
367 <field name="on_create">True</field>
370 <record id="activity_j_a" model="workflow.activity">
371 <field name="wkf_id" ref="test_workflow_j"/>
372 <field name="flow_start">True</field>
373 <field name="name">a</field>
374 <field name="kind">function</field>
375 <field name="action">write({'value': 1})</field>
376 <field name="split_mode">AND</field>
378 <record id="activity_j_b" model="workflow.activity">
379 <field name="wkf_id" ref="test_workflow_j"/>
380 <field name="flow_stop">True</field>
381 <field name="name">b</field>
382 <field name="kind">function</field>
383 <field name="action">write({'value': 2})</field>
385 <record id="activity_j_c" model="workflow.activity">
386 <field name="wkf_id" ref="test_workflow_j"/>
387 <field name="flow_stop">True</field>
388 <field name="name">c</field>
389 <field name="kind">function</field>
390 <field name="action">write({'value': 3})</field>
393 <record id="trans_j_a_b" model="workflow.transition">
394 <field name="act_from" ref="activity_j_a"/>
395 <field name="act_to" ref="activity_j_b"/>
397 <record id="trans_j_a_c" model="workflow.transition">
398 <field name="act_from" ref="activity_j_a"/>
399 <field name="act_to" ref="activity_j_c"/>
400 <field name="condition">False</field>
405 a xor -> b { value: 2 }
408 Only one (truish) transition is taken with a XOR.
411 <record id="test_workflow_k" model="workflow">
412 <field name="name">test.workflow.k</field>
413 <field name="osv">test.workflow.model.k</field>
414 <field name="on_create">True</field>
417 <record id="activity_k_a" model="workflow.activity">
418 <field name="wkf_id" ref="test_workflow_k"/>
419 <field name="flow_start">True</field>
420 <field name="name">a</field>
421 <field name="kind">function</field>
422 <field name="action">write({'value': 1})</field>
423 <field name="split_mode">XOR</field>
425 <record id="activity_k_b" model="workflow.activity">
426 <field name="wkf_id" ref="test_workflow_k"/>
427 <field name="flow_stop">True</field>
428 <field name="name">b</field>
429 <field name="kind">function</field>
430 <field name="action">write({'value': 2})</field>
432 <record id="activity_k_c" model="workflow.activity">
433 <field name="wkf_id" ref="test_workflow_k"/>
434 <field name="flow_stop">True</field>
435 <field name="name">c</field>
436 <field name="kind">function</field>
437 <field name="action">write({'value': 2})</field>
440 <record id="trans_k_a_b" model="workflow.transition">
441 <field name="act_from" ref="activity_k_a"/>
442 <field name="act_to" ref="activity_k_b"/>
444 <record id="trans_k_a_c" model="workflow.transition">
445 <field name="act_from" ref="activity_k_a"/>
446 <field name="act_to" ref="activity_k_c"/>
451 a -> xor c { value: 3 }
453 a -> and d { value: 3 }
456 c is run for each incoming (and taken) transition.
457 d is run once when all its incoming transitions are taken at the same time.
460 <record id="test_workflow_l" model="workflow">
461 <field name="name">test.workflow.l</field>
462 <field name="osv">test.workflow.model.l</field>
463 <field name="on_create">True</field>
466 <record id="activity_l_a" model="workflow.activity">
467 <field name="wkf_id" ref="test_workflow_l"/>
468 <field name="flow_start">True</field>
469 <field name="name">a</field>
470 <field name="kind">function</field>
471 <field name="action">write({'value': 1})</field>
472 <field name="split_mode">OR</field>
474 <record id="activity_l_b" model="workflow.activity">
475 <field name="wkf_id" ref="test_workflow_l"/>
476 <field name="flow_start">True</field>
477 <field name="name">b</field>
478 <field name="kind">function</field>
479 <field name="action">write({'value': 2})</field>
480 <field name="split_mode">OR</field>
482 <record id="activity_l_c" model="workflow.activity">
483 <field name="wkf_id" ref="test_workflow_l"/>
484 <field name="flow_stop">True</field>
485 <field name="name">c</field>
486 <field name="kind">function</field>
487 <field name="action">write({'value': 3})</field>
488 <field name="join_mode">XOR</field>
490 <record id="activity_l_d" model="workflow.activity">
491 <field name="wkf_id" ref="test_workflow_l"/>
492 <field name="flow_stop">True</field>
493 <field name="name">d</field>
494 <field name="kind">function</field>
495 <field name="action">write({'value': 3})</field>
496 <field name="join_mode">AND</field>
499 <record id="trans_l_a_c" model="workflow.transition">
500 <field name="act_from" ref="activity_l_a"/>
501 <field name="act_to" ref="activity_l_c"/>
503 <record id="trans_l_b_c" model="workflow.transition">
504 <field name="act_from" ref="activity_l_b"/>
505 <field name="act_to" ref="activity_l_c"/>
508 <record id="trans_l_a_d" model="workflow.transition">
509 <field name="act_from" ref="activity_l_a"/>
510 <field name="act_to" ref="activity_l_d"/>
512 <record id="trans_l_b_d" model="workflow.transition">
513 <field name="act_from" ref="activity_l_b"/>
514 <field name="act_to" ref="activity_l_d"/>