summaryrefslogtreecommitdiff
path: root/addons/process/process.py
diff options
context:
space:
mode:
authorAmit Mendapara <ame@tinyerp.com>2008-09-25 13:18:07 +0530
committerAmit Mendapara <ame@tinyerp.com>2008-09-25 13:18:07 +0530
commitd73304e6a5e888c102dd4f88bda08f1f65623cae (patch)
tree2456738397da49eb3e21de7bd40303ccb8f54729 /addons/process/process.py
parentb347a98ee0b576e6358391a06a2c0e40a3f77775 (diff)
* Fixed process copy (duplicate) problem.
bzr revid: ame@tinyerp.com-20080925074807-jrl338k65ce9vsav
Diffstat (limited to 'addons/process/process.py')
-rw-r--r--addons/process/process.py48
1 files changed, 48 insertions, 0 deletions
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):