[IMP] cache model and field ids
parent
d57115fd40
commit
34111cf235
|
@ -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(
|
field = self._get_field(log.model_id, field_name)
|
||||||
[('model_id', '=', log.model_id.id),
|
|
||||||
('name', '=', 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(
|
field = self._get_field(log.model_id, field_name)
|
||||||
[('model_id', '=', log.model_id.id),
|
|
||||||
('name', '=', 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)
|
||||||
|
|
Loading…
Reference in New Issue