From d73304e6a5e888c102dd4f88bda08f1f65623cae Mon Sep 17 00:00:00 2001 From: Amit Mendapara Date: Thu, 25 Sep 2008 13:18:07 +0530 Subject: [PATCH] * Fixed process copy (duplicate) problem. bzr revid: ame@tinyerp.com-20080925074807-jrl338k65ce9vsav --- addons/process/process.py | 48 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/addons/process/process.py b/addons/process/process.py index 1a0024af4b1..9417f927786 100644 --- a/addons/process/process.py +++ b/addons/process/process.py @@ -231,6 +231,44 @@ class process_process(osv.osv): return dict(title=title, perm=perm, notes=notes, nodes=nodes, transitions=transitions) + def copy(self, cr, uid, id, default=None, context={}): + """ Deep copy the entire process. + """ + + if not default: + default = {} + + pool = pooler.get_pool(cr.dbname) + process = pool.get('process.process').browse(cr, uid, [id], context)[0] + + nodes = {} + transitions = {} + + # first copy all nodes and and map the new nodes with original for later use in transitions + for node in process.node_ids: + for t in node.transition_in: + tr = transitions.setdefault(t.id, {}) + tr['target'] = node.id + for t in node.transition_out: + tr = transitions.setdefault(t.id, {}) + tr['source'] = node.id + nodes[node.id] = pool.get('process.node').copy(cr, uid, node.id, context=context) + + # then copy transitions with new nodes + for tid, tr in transitions.items(): + vals = { + 'source_node_id': nodes[tr['source']], + 'target_node_id': nodes[tr['target']] + } + tr = pool.get('process.transition').copy(cr, uid, tid, default=vals, context=context) + + # and finally copy the process itself with new nodes + default.update({ + 'active': True, + 'node_ids': [(6, 0, nodes.values())] + }) + return super(process_process, self).copy(cr, uid, id, default, context) + process_process() class process_node(osv.osv): @@ -256,6 +294,16 @@ class process_node(osv.osv): 'model_states': lambda *args: False, 'flow_start': lambda *args: False, } + + def copy(self, cr, uid, id, default=None, context={}): + if not default: + default = {} + default.update({ + 'transition_in': [], + 'transition_out': [] + }) + return super(process_node, self).copy(cr, uid, id, default, context) + process_node() class process_node_condition(osv.osv):