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

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=base.osv.osv_pools
					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

