37 information when this entity is being deleted |
37 information when this entity is being deleted |
38 """ |
38 """ |
39 if self.workflow_of: |
39 if self.workflow_of: |
40 return self.workflow_of[0].rest_path(), {'vid': 'workflow'} |
40 return self.workflow_of[0].rest_path(), {'vid': 'workflow'} |
41 return super(Workflow, self).after_deletion_path() |
41 return super(Workflow, self).after_deletion_path() |
|
42 |
|
43 def iter_workflows(self, _done=None): |
|
44 """return an iterator on actual workflows, eg this workflow and its |
|
45 subworkflows |
|
46 """ |
|
47 # infinite loop safety belt |
|
48 if _done is None: |
|
49 _done = set() |
|
50 yield self |
|
51 _done.add(self.eid) |
|
52 for tr in self.req.execute('Any T WHERE T is WorkflowTransition, ' |
|
53 'T transition_of WF, WF eid %(wf)s', |
|
54 {'wf': self.eid}).entities(): |
|
55 if tr.subwf.eid in _done: |
|
56 continue |
|
57 for subwf in tr.subwf.iter_workflows(_done): |
|
58 yield subwf |
42 |
59 |
43 # state / transitions accessors ############################################ |
60 # state / transitions accessors ############################################ |
44 |
61 |
45 def state_by_name(self, statename): |
62 def state_by_name(self, statename): |
46 rset = self.req.execute('Any S, SN WHERE S name SN, S name %(n)s, ' |
63 rset = self.req.execute('Any S, SN WHERE S name SN, S name %(n)s, ' |