[IMP] Dont query non-stored related or computed fields on full auditlog, this can slow down the system a lot and gives no useful info

pull/2755/head
Tom Blauwendraat 2020-12-15 00:48:23 +01:00 committed by Raf Ven
parent e1e89394c8
commit 65667ad6f1
2 changed files with 22 additions and 3 deletions

View File

@ -90,6 +90,7 @@ Contributors
* Holden Rehg <holdenrehg@gmail.com> * Holden Rehg <holdenrehg@gmail.com>
* Eric Lembregts <eric@lembregts.eu> * Eric Lembregts <eric@lembregts.eu>
* Alan Ramos <alan.ramos@jarsa.com.mx> * Alan Ramos <alan.ramos@jarsa.com.mx>
* Tom Blauwendraat <tom@sunflowerweb.nl>
Other credits Other credits
~~~~~~~~~~~~~ ~~~~~~~~~~~~~

View File

@ -232,6 +232,19 @@ class AuditlogRule(models.Model):
self.unsubscribe() self.unsubscribe()
return super(AuditlogRule, self).unlink() return super(AuditlogRule, self).unlink()
@api.model
def get_auditlog_fields(self, model):
"""
Get the list of auditlog fields for a model
By default it is all stored fields only, but you can
override this.
"""
return list(
n
for n, f in model._fields.items()
if (not f.compute and not f.related) or f.store
)
def _make_create(self): def _make_create(self):
"""Instanciate a create method that log its calls.""" """Instanciate a create method that log its calls."""
self.ensure_one() self.ensure_one()
@ -248,9 +261,12 @@ class AuditlogRule(models.Model):
# stored in the database only at the end of the transaction, but # stored in the database only at the end of the transaction, but
# their values exist in cache. # their values exist in cache.
new_values = {} new_values = {}
fields_list = rule_model.get_auditlog_fields(self)
for new_record in new_records: for new_record in new_records:
new_values.setdefault(new_record.id, {}) new_values.setdefault(new_record.id, {})
for fname, field in new_record._fields.items(): for fname, field in new_record._fields.items():
if fname not in fields_list:
continue
new_values[new_record.id][fname] = field.convert_to_read( new_values[new_record.id][fname] = field.convert_to_read(
new_record[fname], new_record new_record[fname], new_record
) )
@ -332,18 +348,19 @@ class AuditlogRule(models.Model):
def write_full(self, vals, **kwargs): def write_full(self, vals, **kwargs):
self = self.with_context(auditlog_disabled=True) self = self.with_context(auditlog_disabled=True)
rule_model = self.env["auditlog.rule"] rule_model = self.env["auditlog.rule"]
fields_list = rule_model.get_auditlog_fields(self)
old_values = { old_values = {
d["id"]: d d["id"]: d
for d in self.sudo() for d in self.sudo()
.with_context(prefetch_fields=False) .with_context(prefetch_fields=False)
.read(list(self._fields)) .read(fields_list)
} }
result = write_full.origin(self, vals, **kwargs) result = write_full.origin(self, vals, **kwargs)
new_values = { new_values = {
d["id"]: d d["id"]: d
for d in self.sudo() for d in self.sudo()
.with_context(prefetch_fields=False) .with_context(prefetch_fields=False)
.read(list(self._fields)) .read(fields_list)
} }
rule_model.sudo().create_logs( rule_model.sudo().create_logs(
self.env.uid, self.env.uid,
@ -388,11 +405,12 @@ class AuditlogRule(models.Model):
def unlink_full(self, **kwargs): def unlink_full(self, **kwargs):
self = self.with_context(auditlog_disabled=True) self = self.with_context(auditlog_disabled=True)
rule_model = self.env["auditlog.rule"] rule_model = self.env["auditlog.rule"]
fields_list = rule_model.get_auditlog_fields(self)
old_values = { old_values = {
d["id"]: d d["id"]: d
for d in self.sudo() for d in self.sudo()
.with_context(prefetch_fields=False) .with_context(prefetch_fields=False)
.read(list(self._fields)) .read(fields_list)
} }
rule_model.sudo().create_logs( rule_model.sudo().create_logs(
self.env.uid, self.env.uid,