|
@ -119,12 +119,15 @@ class auditlog_rule(models.Model): |
|
|
def _patch_methods(self): |
|
|
def _patch_methods(self): |
|
|
"""Patch ORM methods of models defined in rules to log their calls.""" |
|
|
"""Patch ORM methods of models defined in rules to log their calls.""" |
|
|
updated = False |
|
|
updated = False |
|
|
|
|
|
self.pool._auditlog_field_cache = {} |
|
|
|
|
|
model_cache = self.pool._auditlog_model_cache = {} |
|
|
for rule in self: |
|
|
for rule in self: |
|
|
if rule.state != 'subscribed': |
|
|
if rule.state != 'subscribed': |
|
|
continue |
|
|
continue |
|
|
if not self.pool.get(rule.model_id.model): |
|
|
if not self.pool.get(rule.model_id.model): |
|
|
# ignore rules for models not loadable currently |
|
|
# ignore rules for models not loadable currently |
|
|
continue |
|
|
continue |
|
|
|
|
|
model_cache[rule.model_id.model] = rule.model_id |
|
|
model_model = self.env[rule.model_id.model] |
|
|
model_model = self.env[rule.model_id.model] |
|
|
# CRUD |
|
|
# CRUD |
|
|
# -> create |
|
|
# -> create |
|
@ -285,13 +288,12 @@ class auditlog_rule(models.Model): |
|
|
new_values = EMPTY_DICT |
|
|
new_values = EMPTY_DICT |
|
|
log_model = self.env['auditlog.log'] |
|
|
log_model = self.env['auditlog.log'] |
|
|
ir_model = self.env['ir.model'] |
|
|
ir_model = self.env['ir.model'] |
|
|
model = ir_model.search([('model', '=', res_model)]) |
|
|
|
|
|
for res_id in res_ids: |
|
|
for res_id in res_ids: |
|
|
model_model = self.env[res_model] |
|
|
model_model = self.env[res_model] |
|
|
res_name = model_model.browse(res_id).name_get() |
|
|
res_name = model_model.browse(res_id).name_get() |
|
|
vals = { |
|
|
vals = { |
|
|
'name': res_name and res_name[0] and res_name[0][1] or False, |
|
|
'name': res_name and res_name[0] and res_name[0][1] or False, |
|
|
'model_id': model.id, |
|
|
|
|
|
|
|
|
'model_id': self.pool._auditlog_model_cache[res_model].id, |
|
|
'res_id': res_id, |
|
|
'res_id': res_id, |
|
|
'method': method, |
|
|
'method': method, |
|
|
'user_id': uid, |
|
|
'user_id': uid, |
|
@ -305,17 +307,26 @@ class auditlog_rule(models.Model): |
|
|
log, diff.changed(), old_values, new_values) |
|
|
log, diff.changed(), old_values, new_values) |
|
|
self._create_log_line_on_create(log, diff.added(), new_values) |
|
|
self._create_log_line_on_create(log, diff.added(), new_values) |
|
|
|
|
|
|
|
|
|
|
|
def _get_field(self, model, field_name): |
|
|
|
|
|
cache = self.pool._auditlog_field_cache |
|
|
|
|
|
if field_name not in cache.get(model.model, {}): |
|
|
|
|
|
cache.setdefault(model.model, {}) |
|
|
|
|
|
cache[model.model][field_name] = self.env['ir.model.fields']\ |
|
|
|
|
|
.search( |
|
|
|
|
|
[ |
|
|
|
|
|
('model_id', '=', model.id), |
|
|
|
|
|
('name', '=', field_name), |
|
|
|
|
|
]) |
|
|
|
|
|
return cache[model.model][field_name] |
|
|
|
|
|
|
|
|
def _create_log_line_on_write( |
|
|
def _create_log_line_on_write( |
|
|
self, log, fields_list, old_values, new_values): |
|
|
self, log, fields_list, old_values, new_values): |
|
|
"""Log field updated on a 'write' operation.""" |
|
|
"""Log field updated on a 'write' operation.""" |
|
|
log_line_model = self.env['auditlog.log.line'] |
|
|
log_line_model = self.env['auditlog.log.line'] |
|
|
ir_model_field = self.env['ir.model.fields'] |
|
|
|
|
|
for field_name in fields_list: |
|
|
for field_name in fields_list: |
|
|
if field_name in FIELDS_BLACKLIST: |
|
|
if field_name in FIELDS_BLACKLIST: |
|
|
continue |
|
|
continue |
|
|
field = ir_model_field.search( |
|
|
|
|
|
[('model_id', '=', log.model_id.id), |
|
|
|
|
|
('name', '=', field_name)]) |
|
|
|
|
|
|
|
|
field = self._get_field(log.model_id, field_name) |
|
|
log_vals = self._prepare_log_line_vals_on_write( |
|
|
log_vals = self._prepare_log_line_vals_on_write( |
|
|
log, field, old_values, new_values) |
|
|
log, field, old_values, new_values) |
|
|
log_line_model.create(log_vals) |
|
|
log_line_model.create(log_vals) |
|
@ -349,13 +360,10 @@ class auditlog_rule(models.Model): |
|
|
self, log, fields_list, new_values): |
|
|
self, log, fields_list, new_values): |
|
|
"""Log field filled on a 'create' operation.""" |
|
|
"""Log field filled on a 'create' operation.""" |
|
|
log_line_model = self.env['auditlog.log.line'] |
|
|
log_line_model = self.env['auditlog.log.line'] |
|
|
ir_model_field = self.env['ir.model.fields'] |
|
|
|
|
|
for field_name in fields_list: |
|
|
for field_name in fields_list: |
|
|
if field_name in FIELDS_BLACKLIST: |
|
|
if field_name in FIELDS_BLACKLIST: |
|
|
continue |
|
|
continue |
|
|
field = ir_model_field.search( |
|
|
|
|
|
[('model_id', '=', log.model_id.id), |
|
|
|
|
|
('name', '=', field_name)]) |
|
|
|
|
|
|
|
|
field = self._get_field(log.model_id, field_name) |
|
|
log_vals = self._prepare_log_line_vals_on_create( |
|
|
log_vals = self._prepare_log_line_vals_on_create( |
|
|
log, field, new_values) |
|
|
log, field, new_values) |
|
|
log_line_model.create(log_vals) |
|
|
log_line_model.create(log_vals) |
|
|