diff options
Diffstat (limited to 'bin/workflow/wkf_expr.py')
| -rw-r--r-- | bin/workflow/wkf_expr.py | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/bin/workflow/wkf_expr.py b/bin/workflow/wkf_expr.py new file mode 100644 index 00000000000..0245e9e0bd6 --- /dev/null +++ b/bin/workflow/wkf_expr.py @@ -0,0 +1,91 @@ +############################################################################## +# +# Copyright (c) 2004 TINY SPRL. (http://tiny.be) All Rights Reserved. +# +# $Id: wkf_expr.py 1304 2005-09-08 14:35:42Z nicoe $ +# +# WARNING: This program as such is intended to be used by professional +# programmers who take the whole responsability of assessing all potential +# consequences resulting from its eventual inadequacies and bugs +# End users who are looking for a ready-to-use solution with commercial +# garantees and support are strongly adviced to contract a Free Software +# Service Company +# +# This program is Free Software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +############################################################################## +import sys +import netsvc +import osv as base +import pooler + +def _inst_value_get(ident, field): + service = netsvc.LocalService("object_proxy") + res = service.execute(ident[0], ident[1], 'read', [ident[2]], [field]) + return res[0][field] + +# +# TODO: improve evaluation expression +# VERY SLOW !!! read all !!! +# +class _eval_call(object): + def __init__(self,wf_service,d_arg): + self.wf_service=wf_service + self.d_arg=d_arg + def __call__(self,*args): + arg=self.d_arg+args + return self.wf_service.execute_cr(*arg) + +def _eval_expr(cr, ident, workitem, action): + ret=False + for line in action.split('\n'): + uid=ident[0] + model=ident[1] + ids=[ident[2]] + if line =='True': + ret=True + elif line =='False': + ret=False + else: + wf_service = netsvc.LocalService("object_proxy") + res=wf_service.execute_cr(cr, uid, model, 'read', ids, None) + if res: + env=res[0] + if '(' in line: + pool=pooler.get_pool(cr.dbname) + obj=pool.get(model) + for i in dir(obj): + attr=getattr(obj,i) + if not i.startswith('_') and callable(attr): + env[i]=_eval_call(wf_service,(cr,uid,model,i,ids)) + ret=eval(line,env) + return ret + +def execute(cr, ident, workitem, activity): + return _eval_expr(cr, ident, workitem, activity['action']) + +def check(cr, workitem, ident, transition, signal): + ok = True + if transition['signal']: + ok = (signal==transition['signal']) + + if transition['role_id']: + uid = ident[0] + serv = netsvc.LocalService('object_proxy') + user_roles = serv.execute_cr(cr, uid, 'res.users', 'read', [uid], ['roles_id'])[0]['roles_id'] + ok = ok and serv.execute_cr(cr, uid, 'res.roles', 'check', user_roles, transition['role_id']) + ok = ok and _eval_expr(cr, ident, workitem, transition['condition']) + return ok + |
