summaryrefslogtreecommitdiff
path: root/bin/addons/base/ir/workflow/workflow_print.py
diff options
context:
space:
mode:
authorpinky <>2006-12-07 13:41:40 +0000
committerpinky <>2006-12-07 13:41:40 +0000
commit004a0b996ff8f269451e07346f71a129a1f3fbaf (patch)
tree48f43c1fc2ca4c1f4d5648e7e73553d3f4ccae06 /bin/addons/base/ir/workflow/workflow_print.py
New trunk
bzr revid: pinky-3f10ee12cea3c4c75cef44ab04ad33ef47432907
Diffstat (limited to 'bin/addons/base/ir/workflow/workflow_print.py')
-rw-r--r--bin/addons/base/ir/workflow/workflow_print.py68
1 files changed, 68 insertions, 0 deletions
diff --git a/bin/addons/base/ir/workflow/workflow_print.py b/bin/addons/base/ir/workflow/workflow_print.py
new file mode 100644
index 00000000000..ba525cc63a8
--- /dev/null
+++ b/bin/addons/base/ir/workflow/workflow_print.py
@@ -0,0 +1,68 @@
+import psycopg
+import pydot
+
+wkf_id = 193
+
+db = psycopg.connect('dbname=terp', serialize=0)
+cr=db.cursor()
+
+def graph_get(cr, graph, wkf_id, nested=True):
+ cr.execute('select * from wkf_activity where wkf_id=%d', (wkf_id,))
+ nodes = cr.dictfetchall()
+ activities = {}
+ actfrom = {}
+ actto = {}
+ for n in nodes:
+ activities[n['id']] = n
+ if n['subflow_id'] and nested:
+ cr.execute('select * from wkf where id=%d', (n['subflow_id'],))
+ wkfinfo = cr.dictfetchone()
+ graph2 = pydot.Cluster('subflow'+str(n['subflow_id']), fontsize=10, label = "Subflow: "+n['name']+'\\nOSV: '+wkfinfo['osv'])
+ (s1,s2) = graph_get(cr, graph2, n['subflow_id'], nested)
+ graph.add_subgraph(graph2)
+ actfrom[n['id']] = s2
+ actto[n['id']] = s1
+ else:
+ args = {}
+ if n['flow_start'] or n['flow_stop']:
+ args['style']='filled'
+ args['color']='lightgrey'
+ args['label']=n['name']
+ if n['action']:
+ args['label']+='\\n'+n['action']
+ if n['subflow_id']:
+ args['shape'] = 'box'
+ graph.add_node(pydot.Node(n['id'], **args))
+ actfrom[n['id']] = n['id']
+ actto[n['id']] = n['id']
+ cr.execute('select * from wkf_transition where act_from in ('+','.join(map(lambda x: str(x['id']),nodes))+')')
+ transitions = cr.dictfetchall()
+ for t in transitions:
+ args = {}
+ args['label'] = str(t['condition'])
+ if t['signal']:
+ args['label'] += '\\n'+str(t['signal'])
+ args['style'] = 'bold'
+
+ if activities[t['act_from']]['split_mode']=='AND':
+ args['arrowtail']='box'
+ elif str(activities[t['act_from']]['split_mode'])=='OR ':
+ args['arrowtail']='inv'
+
+ if activities[t['act_to']]['join_mode']=='AND':
+ args['arrowhead']='crow'
+
+ graph.add_edge(pydot.Edge(actfrom[t['act_from']],actto[t['act_to']], fontsize=8, **args))
+ nodes = cr.dictfetchall()
+ cr.execute('select id from wkf_activity where flow_start=True limit 1')
+ start = cr.fetchone()[0]
+ cr.execute('select id from wkf_activity where flow_stop=True limit 1')
+ stop = cr.fetchone()[0]
+ return (start,stop)
+
+cr.execute('select * from wkf where id=%d', (wkf_id,))
+wkfinfo = cr.dictfetchone()
+graph = pydot.Dot(fontsize = 16, label = "\\n\\nWorkflow: %s\\n OSV: %s"% (wkfinfo['name'],wkfinfo['osv']))
+graph_get(cr, graph, wkf_id, True)
+graph.write_ps('/tmp/a.ps', prog='dot')
+