From fe17e91254d2230f913d5107173ecedf0517c726 Mon Sep 17 00:00:00 2001 From: Amit Mendapara Date: Thu, 18 Sep 2008 14:02:45 +0530 Subject: Process node conditions. bzr revid: ame@tinyerp.com-20080918083245-wya7jfes1s92cs9k --- addons/process/process.py | 59 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 15 deletions(-) (limited to 'addons/process/process.py') diff --git a/addons/process/process.py b/addons/process/process.py index 74b0d6fc036..2ac778df760 100644 --- a/addons/process/process.py +++ b/addons/process/process.py @@ -31,6 +31,17 @@ import pooler, tools from osv import fields, osv +class Env(dict): + + def __init__(self, parent): + self.__parent = parent + + def __getitem__(self, name): + if name == '__parent': + return super(Env, self).__getitem__(name) + + return self.__parent[name] + class process_process(osv.osv): _name = "process.process" _description = "Process" @@ -46,34 +57,40 @@ class process_process(osv.osv): 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: + 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['notes'] = node.note data['active'] = 0 - + data['gray'] = 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'] = not states or current_object.state in states - - elif node.kind == "router": - #TODO: - pass - - elif node.kind == "subflow": - #TODO: subflow - pass + try: + data['active'] = eval(node.model_states, Env(current_object)); + except Exception, e: + # waring: invalid state expression + pass + + if not data['active']: + try: + gray = False + for cond in node.condition_ids: + if cond.model_id and cond.model_id.model == res_model: + gray = gray or eval(cond.model_states, Env(current_object)) + data['gray'] = gray + except: + pass nodes[node.id] = data if node.flow_start: @@ -129,7 +146,7 @@ class process_node(osv.osv): _columns = { 'name': fields.char('Name', size=30,required=True), 'process_id': fields.many2one('process.process', 'Process', required=True), - 'kind': fields.selection([('state','State'),('router','Router'),('subflow','Subflow')],'Kind of Node', required=True), + 'kind': fields.selection([('state','State'), ('subflow','Subflow')], 'Kind of Node', required=True), 'menu_id': fields.many2one('ir.ui.menu', 'Related Menu'), 'note': fields.text('Notes'), 'model_id': fields.many2one('ir.model', 'Object', ondelete='set null'), @@ -137,6 +154,7 @@ class process_node(osv.osv): 'flow_start': fields.boolean('Starting Flow'), 'transition_in': fields.one2many('process.transition', 'target_node_id', 'Starting Transitions'), 'transition_out': fields.one2many('process.transition', 'source_node_id', 'Ending Transitions'), + 'condition_ids': fields.one2many('process.condition', 'node_id', 'Conditions') } _defaults = { 'kind': lambda *args: 'state', @@ -145,6 +163,17 @@ class process_node(osv.osv): } process_node() +class process_node_condition(osv.osv): + _name = 'process.condition' + _description = 'Condition' + _columns = { + 'name': fields.char('Name', size=30, required=True), + 'node_id': fields.many2one('process.node', 'Node', required=True), + 'model_id': fields.many2one('ir.model', 'Object', ondelete='set null'), + 'model_states': fields.char('Expression', required=True, size=128) + } +process_node_condition() + class process_transition(osv.osv): _name = 'process.transition' _description ='Process Transitions' -- cgit v1.2.3 From c3b7950df1bebcb58037e6d0ded620e56e1a4976 Mon Sep 17 00:00:00 2001 From: Amit Mendapara Date: Thu, 18 Sep 2008 14:56:33 +0530 Subject: Process expr evaluation with user and object. bzr revid: ame@tinyerp.com-20080918092633-zmknerljoio2qbd1 --- addons/process/process.py | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) (limited to 'addons/process/process.py') diff --git a/addons/process/process.py b/addons/process/process.py index 2ac778df760..ea83ba52873 100644 --- a/addons/process/process.py +++ b/addons/process/process.py @@ -32,15 +32,23 @@ import pooler, tools from osv import fields, osv class Env(dict): - - def __init__(self, parent): - self.__parent = parent - + + def __init__(self, obj, user): + self.__obj = obj + self.__usr = user + def __getitem__(self, name): - if name == '__parent': - return super(Env, self).__getitem__(name) - - return self.__parent[name] + + if name in ('__obj', '__user'): + return super(ExprContext, self).__getitem__(name) + + if name == 'user': + return self.__user + + if name == 'object': + return self.__obj + + return self.__obj[name] class process_process(osv.osv): _name = "process.process" @@ -60,6 +68,9 @@ class process_process(osv.osv): process = pool.get('process.process').browse(cr, uid, [id])[0] current_object = pool.get(res_model).browse(cr, uid, [res_id])[0] + current_user = pool.get('res.users').browse(cr, uid, [uid])[0] + + expr_context = Env(current_object, current_user) nodes = {} start = [] @@ -77,7 +88,7 @@ class process_process(osv.osv): if node.kind == "state" and node.model_id and node.model_id.model == res_model: try: - data['active'] = eval(node.model_states, Env(current_object)); + data['active'] = eval(node.model_states, expr_context); except Exception, e: # waring: invalid state expression pass @@ -87,7 +98,7 @@ class process_process(osv.osv): gray = False for cond in node.condition_ids: if cond.model_id and cond.model_id.model == res_model: - gray = gray or eval(cond.model_states, Env(current_object)) + gray = gray or eval(cond.model_states, expr_context) data['gray'] = gray except: pass -- cgit v1.2.3 From 120edf57789b9a24e9bd72881876a1091d671602 Mon Sep 17 00:00:00 2001 From: Amit Mendapara Date: Thu, 18 Sep 2008 16:50:19 +0530 Subject: Minor change bzr revid: ame@tinyerp.com-20080918112019-w975nwoneu9olhi1 --- addons/process/process.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'addons/process/process.py') diff --git a/addons/process/process.py b/addons/process/process.py index ea83ba52873..6c2b66d0de6 100644 --- a/addons/process/process.py +++ b/addons/process/process.py @@ -204,12 +204,12 @@ class process_transition_action(osv.osv): _columns = { 'name': fields.char('Name', size=32, required=True), 'state': fields.selection([('dummy','Dummy'), - ('method','Object Method'), + ('object','Object Method'), ('workflow','Workflow Trigger'), ('action','Action')], 'Type', required=True), 'action': fields.char('Action ID', size=64, states={ 'dummy':[('readonly',1)], - 'method':[('required',1)], + 'object':[('required',1)], 'workflow':[('required',1)], 'action':[('required',1)], },), -- cgit v1.2.3 From 37970fe649c163b8a7ba8afaa93846e986e3b93b Mon Sep 17 00:00:00 2001 From: Amit Mendapara Date: Thu, 18 Sep 2008 17:53:33 +0530 Subject: Minor change bzr revid: ame@tinyerp.com-20080918122333-zyj21q8npuhut1e0 --- addons/process/process.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'addons/process/process.py') diff --git a/addons/process/process.py b/addons/process/process.py index 6c2b66d0de6..c8aaf7180fc 100644 --- a/addons/process/process.py +++ b/addons/process/process.py @@ -79,12 +79,14 @@ class process_process(osv.osv): 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['notes'] = node.note data['active'] = 0 data['gray'] = 0 + + if node.menu_id: + data['menu'] = {'name': node.menu_id.complete_name, 'id': node.menu_id.id} if node.kind == "state" and node.model_id and node.model_id.model == res_model: try: -- cgit v1.2.3 From 8fa060ba9ae0de6eaefdb6b59ab727c977974e38 Mon Sep 17 00:00:00 2001 From: Amit Mendapara Date: Thu, 18 Sep 2008 18:22:36 +0530 Subject: Return record name in active attribute. bzr revid: ame@tinyerp.com-20080918125236-5inldeem0wb777aj --- addons/process/process.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'addons/process/process.py') diff --git a/addons/process/process.py b/addons/process/process.py index c8aaf7180fc..ac85fc8a15b 100644 --- a/addons/process/process.py +++ b/addons/process/process.py @@ -67,8 +67,8 @@ class process_process(osv.osv): 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] - current_user = pool.get('res.users').browse(cr, uid, [uid])[0] + current_object = pool.get(res_model).browse(cr, uid, [res_id], context)[0] + current_user = pool.get('res.users').browse(cr, uid, [uid], context)[0] expr_context = Env(current_object, current_user) @@ -90,7 +90,8 @@ class process_process(osv.osv): if node.kind == "state" and node.model_id and node.model_id.model == res_model: try: - data['active'] = eval(node.model_states, expr_context); + if eval(node.model_states, expr_context): + data['active'] = current_object.name_get(context)[0][1] except Exception, e: # waring: invalid state expression pass -- cgit v1.2.3 From 6346d5d49d3ff8dbbfe21bd28dfecc821e980825 Mon Sep 17 00:00:00 2001 From: Amit Mendapara Date: Fri, 19 Sep 2008 14:13:43 +0530 Subject: Fixed gray node calculation. bzr revid: ame@tinyerp.com-20080919084343-l67hk7qth109ri2f --- addons/process/process.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'addons/process/process.py') diff --git a/addons/process/process.py b/addons/process/process.py index ac85fc8a15b..9044a9d82a5 100644 --- a/addons/process/process.py +++ b/addons/process/process.py @@ -98,11 +98,11 @@ class process_process(osv.osv): if not data['active']: try: - gray = False + gray = True for cond in node.condition_ids: if cond.model_id and cond.model_id.model == res_model: - gray = gray or eval(cond.model_states, expr_context) - data['gray'] = gray + gray = gray and eval(cond.model_states, expr_context) + data['gray'] = not gray except: pass -- cgit v1.2.3