odoo/bin/workflow/wkf_expr.py

92 lines
3.0 KiB
Python

##############################################################################
#
# 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