[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>
* Eric Lembregts <eric@lembregts.eu>
* Alan Ramos <alan.ramos@jarsa.com.mx>
* Tom Blauwendraat <tom@sunflowerweb.nl>
Other credits
~~~~~~~~~~~~~

View File

@ -232,6 +232,19 @@ class AuditlogRule(models.Model):
self.unsubscribe()
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):
"""Instanciate a create method that log its calls."""
self.ensure_one()
@ -248,9 +261,12 @@ class AuditlogRule(models.Model):
# stored in the database only at the end of the transaction, but
# their values exist in cache.
new_values = {}
fields_list = rule_model.get_auditlog_fields(self)
for new_record in new_records:
new_values.setdefault(new_record.id, {})
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_record[fname], new_record
)
@ -332,18 +348,19 @@ class AuditlogRule(models.Model):
def write_full(self, vals, **kwargs):
self = self.with_context(auditlog_disabled=True)
rule_model = self.env["auditlog.rule"]
fields_list = rule_model.get_auditlog_fields(self)
old_values = {
d["id"]: d
for d in self.sudo()
.with_context(prefetch_fields=False)
.read(list(self._fields))
.read(fields_list)
}
result = write_full.origin(self, vals, **kwargs)
new_values = {
d["id"]: d
for d in self.sudo()
.with_context(prefetch_fields=False)
.read(list(self._fields))
.read(fields_list)
}
rule_model.sudo().create_logs(
self.env.uid,
@ -388,11 +405,12 @@ class AuditlogRule(models.Model):
def unlink_full(self, **kwargs):
self = self.with_context(auditlog_disabled=True)
rule_model = self.env["auditlog.rule"]
fields_list = rule_model.get_auditlog_fields(self)
old_values = {
d["id"]: d
for d in self.sudo()
.with_context(prefetch_fields=False)
.read(list(self._fields))
.read(fields_list)
}
rule_model.sudo().create_logs(
self.env.uid,