[FIX] audittrail : crash after imporvement in webservice

lp bug: https://launchpad.net/bugs/488754 fixed

bzr revid: hmo@tinyerp.com-20091130060741-dodpnud17vf88nsu
This commit is contained in:
Harry (Open ERP) 2009-11-30 11:37:41 +05:30
parent fe9c6b35c1
commit d8781cd0f2
1 changed files with 81 additions and 84 deletions

View File

@ -20,13 +20,14 @@
##############################################################################
import ir
from osv import fields, osv
from osv.osv import osv_pool
from tools.translate import _
import ir
import netsvc
import pooler
import string
import time, copy
from tools.translate import _
class audittrail_rule(osv.osv):
_name = 'audittrail.rule'
@ -130,16 +131,11 @@ class audittrail_log_line(osv.osv):
audittrail_log_line()
objects_proxy = netsvc.SERVICES['object'].__class__
class audittrail_objects_proxy(objects_proxy):
class audittrail_objects_proxy(osv_pool):
def get_value_text(self, cr, uid, field_name, values, object, context={}):
pool = pooler.get_pool(cr.dbname)
obj=pool.get(object.model)
object_name=obj._name
obj_ids= pool.get('ir.model').search(cr, uid,[('model','=',object_name)])
obj_ids= pool.get('ir.model').search(cr, uid, [('model', '=', object.model)])
model_object=pool.get('ir.model').browse(cr, uid, obj_ids)[0]
f_id= pool.get('ir.model.fields').search(cr, uid, [('name', '=', field_name), ('model_id', '=', object.id)])
if f_id:
@ -163,7 +159,6 @@ class audittrail_objects_proxy(objects_proxy):
return value
elif field['ttype'] == 'one2many':
if values:
value=[]
for id in values:
@ -177,10 +172,13 @@ class audittrail_objects_proxy(objects_proxy):
def create_log_line(self, cr, uid, id, object, lines=[]):
pool = pooler.get_pool(cr.dbname)
obj=pool.get(object.model)
object_name=obj._name
obj_ids= pool.get('ir.model').search(cr, uid,[('model','=',object_name)])
obj_ids= pool.get('ir.model').search(cr, uid, [('model', '=', object.model)])
model_object=pool.get('ir.model').browse(cr, uid, obj_ids)[0]
for line in lines:
if obj._inherits:
inherits_ids= pool.get('ir.model').search(cr, uid, [('model', '=', obj._inherits.keys()[0])])
f_id= pool.get('ir.model.fields').search(cr, uid, [('name', '=', line['name']), ('model_id', 'in', (object.id, inherits_ids[0]))])
else:
f_id= pool.get('ir.model.fields').search(cr, uid, [('name', '=', line['name']), ('model_id', '=', object.id)])
if len(f_id):
fields=pool.get('ir.model.fields').read(cr, uid, f_id)
@ -189,6 +187,8 @@ class audittrail_objects_proxy(objects_proxy):
old_value_text='old_value_text' in line and line['old_value_text'] or ''
new_value_text='new_value_text' in line and line['new_value_text'] or ''
if old_value_text == new_value_text:
continue
if fields[0]['ttype']== 'many2one':
if type(old_value)==tuple:
old_value=old_value[0]
@ -198,16 +198,15 @@ class audittrail_objects_proxy(objects_proxy):
cr.commit()
return True
def log_fct(self, db, uid, passwd, object, method, fct_src, *args):
def log_fct(self, db, uid, object, method, fct_src, *args):
logged_uids = []
pool = pooler.get_pool(db)
cr = pooler.get_db(db).cursor()
obj=pool.get(object)
object_name=obj._name
obj_ids= pool.get('ir.model').search(cr, uid,[('model','=',object_name)])
obj_ids= pool.get('ir.model').search(cr, uid, [('model', '=', object)])
model_object=pool.get('ir.model').browse(cr, uid, obj_ids)[0]
if method in ('create'):
res_id = fct_src( db, uid, passwd, object, method, *args)
res_id = fct_src(db, uid, object, method, *args)
cr.commit()
new_value=pool.get(model_object.model).read(cr, uid, [res_id], args[0].keys())[0]
if 'id' in new_value:
@ -237,7 +236,7 @@ class audittrail_objects_proxy(objects_proxy):
old_values_text={}
for field in args[1].keys():
old_values_text[field] = self.get_value_text(cr, uid, field, old_values[field], model_object)
res =fct_src( db, uid, passwd, object, method, *args)
res =fct_src(db, uid, object, method, *args)
cr.commit()
if res:
new_values=pool.get(model_object.model).read(cr, uid, res_ids, args[1].keys())[0]
@ -264,7 +263,7 @@ class audittrail_objects_proxy(objects_proxy):
if method in ('read'):
res_ids=args[0]
old_values={}
res =fct_src( db, uid, passwd, object, method, *args)
res =fct_src(db, uid, object, method, *args)
if type(res)==list:
for v in res:
@ -312,35 +311,33 @@ class audittrail_objects_proxy(objects_proxy):
lines.append(line)
cr.commit()
self.create_log_line(cr, uid, id, model_object, lines)
res =fct_src( db, uid, passwd, object, method, *args)
res =fct_src(db, uid, object, method, *args)
cr.close()
return res
cr.close()
def execute(self, db, uid, passwd, object, method, *args):
def execute(self, db, uid, object, method, *args, **kw):
pool = pooler.get_pool(db)
cr = pooler.get_db(db).cursor()
cr.autocommit(True)
obj=pool.get(object)
logged_uids = []
object_name=obj._name
fct_src = super(audittrail_objects_proxy, self).execute
def my_fct(db, uid, passwd, object, method, *args):
def my_fct(db, uid, object, method, *args):
field = method
rule = False
obj_ids= pool.get('ir.model').search(cr, uid,[('model','=',object_name)])
obj_ids= pool.get('ir.model').search(cr, uid, [('model', '=', object)])
for obj_name in pool.obj_list():
if obj_name == 'audittrail.rule':
rule = True
if not rule:
return fct_src(db, uid, passwd, object, method, *args)
return fct_src(db, uid, object, method, *args)
if not len(obj_ids):
return fct_src(db, uid, passwd, object, method, *args)
return fct_src(db, uid, object, method, *args)
rule_ids=pool.get('audittrail.rule').search(cr, uid, [('object_id', '=', obj_ids[0]), ('state', '=', 'subscribed')])
if not len(rule_ids):
return fct_src(db, uid, passwd, object, method, *args)
return fct_src(db, uid, object, method, *args)
for thisrule in pool.get('audittrail.rule').browse(cr, uid, rule_ids):
for user in thisrule.user_id:
@ -348,9 +345,9 @@ class audittrail_objects_proxy(objects_proxy):
if not len(logged_uids) or uid in logged_uids:
if field in ('read', 'write', 'create', 'unlink'):
if getattr(thisrule, 'log_'+field):
return self.log_fct(db, uid, passwd, object, method, fct_src, *args)
return fct_src(db, uid, passwd, object, method, *args)
res = my_fct(db, uid, passwd, object, method, *args)
return self.log_fct(db, uid, object, method, fct_src, *args)
return fct_src(db, uid, object, method, *args)
res = my_fct(db, uid, object, method, *args)
cr.close()
return res