# -*- encoding: utf-8 -*-
##############################################################################
#
-# OpenERP, Open Source Management Solution
+# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
# $Id$
#
import ir
-from osv import fields,osv
+from osv import fields, osv
import netsvc
import pooler
import time
from tools.translate import _
+
class audittrail_rule(osv.osv):
_name = 'audittrail.rule'
_columns = {
"res_model":'audittrail.log',
"src_model":thisrule.object_id.model,
"domain":"[('object_id','=',"+str(thisrule.object_id.id)+"),('res_id', '=', active_id)]"
-
+
}
id=self.pool.get('ir.actions.act_window').create(cr, uid, val)
self.write(cr, uid, [thisrule.id], {"state": "subscribed","action_id":id})
res=self.pool.get('ir.model.data').ir_set(cr, uid, 'action', keyword,'View_log_'+thisrule.object_id.model, [thisrule.object_id.model], value, replace=True, isobject=True, xml_id=False)
return True
-
-
def unsubscribe(self, cr, uid, ids, *args):
for thisrule in self.browse(cr, uid, ids):
if thisrule.id in self.__functions :
audittrail_log()
+
class audittrail_log_line(osv.osv):
_name='audittrail.log.line'
_columns={
objects_proxy = netsvc.SERVICES['object'].__class__
+
class audittrail_objects_proxy(objects_proxy):
+ def get_value_text(self, cr, uid, field_name, values, object, context=None):
+ if context is None:
+ context = {}
- 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)])
- 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:
- field=pool.get('ir.model.fields').read(cr, uid,f_id)[0]
- model=field['relation']
-
- if field['ttype']=='many2one':
- if values:
- if type(values)==tuple:
- values=values[0]
- val=pool.get(model).read(cr,uid,[values],[pool.get(model)._rec_name])
+ 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)])
+ 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:
+ field=pool.get('ir.model.fields').read(cr, uid,f_id)[0]
+ model=field['relation']
+
+ if field['ttype']=='many2one':
+ if values:
+ if type(values)==tuple:
+ values=values[0]
+ val=pool.get(model).read(cr,uid,[values],[pool.get(model)._rec_name])
+ if len(val):
+ return val[0][pool.get(model)._rec_name]
+ elif field['ttype'] == 'many2many':
+ value=[]
+ if values:
+ for id in values:
+ val=pool.get(model).read(cr,uid,[id],[pool.get(model)._rec_name])
if len(val):
- return val[0][pool.get(model)._rec_name]
- elif field['ttype'] == 'many2many':
- value=[]
- if values:
- for id in values:
- val=pool.get(model).read(cr,uid,[id],[pool.get(model)._rec_name])
- if len(val):
- value.append(val[0][pool.get(model)._rec_name])
- return value
+ value.append(val[0][pool.get(model)._rec_name])
+ return value
- elif field['ttype'] == 'one2many':
+ elif field['ttype'] == 'one2many':
- if values:
- value=[]
- for id in values:
- val=pool.get(model).read(cr,uid,[id],[pool.get(model)._rec_name])
+ if values:
+ value=[]
+ for id in values:
+ val=pool.get(model).read(cr,uid,[id],[pool.get(model)._rec_name])
+
+ if len(val):
+ value.append(val[0][pool.get(model)._rec_name])
+ return value
+ return values
- if len(val):
- value.append(val[0][pool.get(model)._rec_name])
- return value
- return values
-
def create_log_line(self, cr, uid, id, object, lines=[]):
pool = pooler.get_pool(cr.dbname)
obj=pool.get(object.model)
new_value='new_value' in line and line['new_value'] or ''
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 fields[0]['ttype']== 'many2one':
if type(old_value)==tuple:
old_value=old_value[0]
return True
def log_fct(self, db, uid, passwd, 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)])
- 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)
- cr.commit()
- new_value=pool.get(model_object.model).read(cr,uid,[res_id],args[0].keys())[0]
- if 'id' in new_value:
- del new_value['id']
- if not len(logged_uids) or uid in logged_uids:
- id=pool.get('audittrail.log').create(cr, uid, {"method": method , "object_id": model_object.id, "user_id": uid, "res_id": res_id,"name": "%s %s %s" % (method , model_object.id, time.strftime("%Y-%m-%d %H:%M:%S"))})
- lines=[]
- for field in new_value:
- if new_value[field]:
- line={
- 'name':field,
- 'new_value':new_value[field],
- 'new_value_text': self.get_value_text(cr,uid,field,new_value[field],model_object)
- }
- lines.append(line)
- self.create_log_line(cr,uid,id,model_object,lines)
- cr.commit()
- cr.close()
- return res_id
-
- if method in ('write'):
- res_ids=args[0]
- for res_id in res_ids:
- old_values=pool.get(model_object.model).read(cr,uid,res_id,args[1].keys())
- 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)
- cr.commit()
- if res:
- new_values=pool.get(model_object.model).read(cr,uid,res_ids,args[1].keys())[0]
- if not len(logged_uids) or uid in logged_uids:
- id=pool.get('audittrail.log').create(cr, uid, {"method": method, "object_id": model_object.id, "user_id": uid, "res_id": res_id,"name": "%s %s %s" % (method , model_object.id, time.strftime("%Y-%m-%d %H:%M:%S"))})
- lines=[]
- for field in args[1].keys():
- if args[1].keys():
- line={
- 'name':field,
- 'new_value':field in new_values and new_values[field] or '',
- 'old_value':field in old_values and old_values[field] or '',
- 'new_value_text': self.get_value_text(cr,uid,field,new_values[field],model_object),
- 'old_value_text':old_values_text[field]
- }
- lines.append(line)
- cr.commit()
- self.create_log_line(cr,uid,id,model_object,lines)
- cr.close()
- return res
-
- if method in ('read'):
- res_ids=args[0]
- old_values={}
+ 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)])
+ 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)
+ cr.commit()
+ new_value=pool.get(model_object.model).read(cr,uid,[res_id],args[0].keys())[0]
+ if 'id' in new_value:
+ del new_value['id']
+ if not len(logged_uids) or uid in logged_uids:
+ id=pool.get('audittrail.log').create(cr, uid, {"method": method , "object_id": model_object.id, "user_id": uid, "res_id": res_id,"name": "%s %s %s" % (method , model_object.id, time.strftime("%Y-%m-%d %H:%M:%S"))})
+ lines=[]
+ for field in new_value:
+ if new_value[field]:
+ line={
+ 'name':field,
+ 'new_value':new_value[field],
+ 'new_value_text': self.get_value_text(cr,uid,field,new_value[field],model_object)
+ }
+ lines.append(line)
+ self.create_log_line(cr,uid,id,model_object,lines)
+ cr.commit()
+ cr.close()
+ return res_id
+
+ if method in ('write'):
+ res_ids=args[0]
+ for res_id in res_ids:
+ old_values=pool.get(model_object.model).read(cr,uid,res_id,args[1].keys())
+ 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)
- if type(res)==list:
-
- for v in res:
- old_values[v['id']]=v
- else:
- old_values[res['id']]=res
- for res_id in old_values:
- if not len(logged_uids) or uid in logged_uids:
- id=pool.get('audittrail.log').create(cr, uid, {"method": method , "object_id": model_object.id, "user_id": uid, "res_id": res_id,"name": "%s %s %s" % (method , model_object.id, time.strftime("%Y-%m-%d %H:%M:%S"))})
- lines=[]
- for field in old_values[res_id]:
- if old_values[res_id][field]:
- line={
- 'name':field,
- 'old_value':old_values[res_id][field],
- 'old_value_text': self.get_value_text(cr,uid,field,old_values[res_id][field],model_object)
- }
- lines.append(line)
- cr.commit()
- self.create_log_line(cr,uid,id,model_object,lines)
- cr.close()
- return res
-
- if method in ('unlink'):
- res_ids=args[0]
- old_values={}
- for res_id in res_ids:
- old_values[res_id]=pool.get(model_object.model).read(cr,uid,res_id,[])
-
- for res_id in res_ids:
+ cr.commit()
+ if res:
+ new_values=pool.get(model_object.model).read(cr,uid,res_ids,args[1].keys())[0]
if not len(logged_uids) or uid in logged_uids:
- id=pool.get('audittrail.log').create(cr, uid, {"method": method , "object_id": model_object.id, "user_id": uid, "res_id": res_id,"name": "%s %s %s" % (method, model_object, time.strftime("%Y-%m-%d %H:%M:%S"))})
+ id=pool.get('audittrail.log').create(cr, uid, {"method": method, "object_id": model_object.id, "user_id": uid, "res_id": res_id,"name": "%s %s %s" % (method , model_object.id, time.strftime("%Y-%m-%d %H:%M:%S"))})
lines=[]
- for field in old_values[res_id]:
- if old_values[res_id][field]:
+ for field in args[1].keys():
+ if args[1].keys():
line={
'name':field,
- 'old_value':old_values[res_id][field],
- 'old_value_text': self.get_value_text(cr,uid,field,old_values[res_id][field],model_object)
+ 'new_value':field in new_values and new_values[field] or '',
+ 'old_value':field in old_values and old_values[field] or '',
+ 'new_value_text': self.get_value_text(cr,uid,field,new_values[field],model_object),
+ 'old_value_text':old_values_text[field]
}
lines.append(line)
cr.commit()
self.create_log_line(cr,uid,id,model_object,lines)
- res =fct_src( db, uid, passwd, object, method, *args)
cr.close()
return res
+
+ if method in ('read'):
+ res_ids=args[0]
+ old_values={}
+ res =fct_src( db, uid, passwd, object, method, *args)
+ if type(res)==list:
+
+ for v in res:
+ old_values[v['id']]=v
+ else:
+ old_values[res['id']]=res
+ for res_id in old_values:
+ if not len(logged_uids) or uid in logged_uids:
+ id=pool.get('audittrail.log').create(cr, uid, {"method": method , "object_id": model_object.id, "user_id": uid, "res_id": res_id,"name": "%s %s %s" % (method , model_object.id, time.strftime("%Y-%m-%d %H:%M:%S"))})
+ lines=[]
+ for field in old_values[res_id]:
+ if old_values[res_id][field]:
+ line={
+ 'name':field,
+ 'old_value':old_values[res_id][field],
+ 'old_value_text': self.get_value_text(cr,uid,field,old_values[res_id][field],model_object)
+ }
+ lines.append(line)
+ cr.commit()
+ self.create_log_line(cr,uid,id,model_object,lines)
+ cr.close()
+ return res
+
+ if method in ('unlink'):
+ res_ids=args[0]
+ old_values={}
+ for res_id in res_ids:
+ old_values[res_id]=pool.get(model_object.model).read(cr,uid,res_id,[])
+
+ for res_id in res_ids:
+ if not len(logged_uids) or uid in logged_uids:
+ id=pool.get('audittrail.log').create(cr, uid, {"method": method , "object_id": model_object.id, "user_id": uid, "res_id": res_id,"name": "%s %s %s" % (method, model_object, time.strftime("%Y-%m-%d %H:%M:%S"))})
+ lines=[]
+ for field in old_values[res_id]:
+ if old_values[res_id][field]:
+ line={
+ 'name':field,
+ 'old_value':old_values[res_id][field],
+ 'old_value_text': self.get_value_text(cr,uid,field,old_values[res_id][field],model_object)
+ }
+ lines.append(line)
+ cr.commit()
+ self.create_log_line(cr,uid,id,model_object,lines)
+ res =fct_src( db, uid, passwd, object, method, *args)
cr.close()
+ return res
+ cr.close()
def execute(self, db, uid, passwd, model, method, *args):
pool = pooler.get_pool(db)
return fct_src(db, uid, passwd, model, method, *args)
finally:
cr.close()
- pass
audittrail_objects_proxy()