bugfix process
[odoo/odoo.git] / addons / process / process.py
index d489b5f..9ad6a02 100644 (file)
@@ -27,8 +27,9 @@
 ##############################################################################
 
 import netsvc
-from osv import fields, osv
+import pooler, tools
 
+from osv import fields, osv
 
 class process_process(osv.osv):
     _name = "process.process"
@@ -42,6 +43,94 @@ class process_process(osv.osv):
     _defaults = {
         'active' : lambda *a: True,
     }
+
+    def graph_get(self, cr, uid, id, res_model, res_id, scale, context):
+        
+        pool = pooler.get_pool(cr.dbname)
+
+        process = pool.get('process.process').browse(cr, uid, [id])[0]
+        current_object = pool.get(res_model).browse(cr, uid, [res_id])[0]
+
+        nodes = {}
+        start = []
+        transitions = {}
+        for node in process.node_ids:
+
+            data = {}
+
+            data['name'] = node.name
+            data['menu'] = (node.menu_id or None) and node.menu_id.name
+            data['model'] = (node.model_id or None) and node.model_id.model
+            data['kind'] = node.kind
+            data['active'] = 0
+
+            if node.kind == "state" and node.model_id and node.model_id.model == res_model:
+                states = node.model_states
+                states = (states or []) and states.split(',')
+                data['active'] = (states and current_object.state in states) or not states
+
+            elif node.kind == "router":
+                #TODO:
+                pass
+
+            elif node.kind == "subflow":
+                #TODO: subflow
+                pass
+
+            nodes[node.id] = data
+
+            if node.flow_start:
+                start.append(node.id)
+
+            for tr in node.transition_ids:
+                data = {}
+                
+                data['name'] = tr.name
+                data['source'] = tr.source_node_id.id
+                data['target'] = tr.target_node_id.id
+
+                data['buttons'] = buttons = []
+                for b in tr.action_ids:
+                    button = {}
+                    button['name'] = b.name
+                    buttons.append(button)
+
+                data['roles'] = roles = []
+                for r in tr.role_ids:
+                    role = {}
+                    role['name'] = r.name
+                    roles.append(role)
+                    
+                transitions[tr.id] = data
+
+        g = tools.graph(nodes.keys(), map(lambda x: (x['source'], x['target']), transitions.values()))
+        g.process(start)
+        #g.scale(100, 100, 180, 120)
+        g.scale(*scale)
+
+        graph = g.result_get()
+
+        miny = -1
+
+        for k,v in nodes.items():
+
+            x = graph[k]['y']
+            y = graph[k]['x']
+
+            if miny == -1:
+                miny = y
+
+            miny = min(y, miny)
+
+            v['x'] = x
+            v['y'] = y
+
+        for k, v in nodes.items():
+            y = v['y']
+            v['y'] = min(y - miny + 10, y)
+
+        return dict(nodes=nodes, transitions=transitions)
+
 process_process()
 
 class process_node(osv.osv):
@@ -56,8 +145,7 @@ class process_node(osv.osv):
         'model_id': fields.many2one('ir.model', 'Object', ondelete='set null'),
         'model_states': fields.char('States Expression', size=128),
         'flow_start': fields.boolean('Starting Flow'),
-        'transition_in': fields.one2many('process.transition', 'node_to_id', 'Starting Transitions'),
-        'transition_out': fields.one2many('process.transition', 'node_from_id', 'Ending Transitions'),
+        'transition_ids': fields.one2many('process.transition', 'source_node_id', 'Transitions'),
     }
     _defaults = {
         'kind': lambda *args: 'state',
@@ -71,11 +159,11 @@ class process_transition(osv.osv):
     _description ='Process Transitions'
     _columns = {
         'name': fields.char('Name', size=32, required=True),
-        'node_from_id': fields.many2one('process.node', 'Origin Node', required=True, ondelete='cascade'),
-        'node_to_id': fields.many2one('process.node', 'Destination Node', required=True, ondelete='cascade'),
-        'transition_ids': fields.many2many('workflow.transition', 'process_transition_ids', 'trans1_id', 'trans2_id', 'Workflow Transitions'),
+        'source_node_id': fields.many2one('process.node', 'Source Node', required=True, ondelete='cascade'),
+        'target_node_id': fields.many2one('process.node', 'Target Node', required=True, ondelete='cascade'),        
+        'action_ids': fields.one2many('process.transition.action', 'transition_id', 'Buttons'),
+        'role_ids': fields.many2many('res.roles', 'process_transition_roles_rel', 'process_transition_id', 'role_id', 'Roles Required'),
         'note': fields.text('Description'),
-        'action_ids': fields.one2many('process.transition.action', 'transition_id', 'Buttons')
     }
     _defaults = {
     }
@@ -86,7 +174,10 @@ class process_transition_action(osv.osv):
     _description ='Process Transitions Actions'
     _columns = {
         'name': fields.char('Name', size=32, required=True),
-        'state': fields.selection([('dummy','Dummy'),('method','Object Method'),('workflow','Workflow Trigger'),('action','Action')], 'Type', required=True),
+        'state': fields.selection([('dummy','Dummy'),
+                                   ('method','Object Method'),
+                                   ('workflow','Workflow Trigger'),
+                                   ('action','Action')], 'Type', required=True),
         'action': fields.char('Action ID', size=64, states={
             'dummy':[('readonly',1)],
             'method':[('required',1)],