[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
parent
e1e89394c8
commit
65667ad6f1
|
@ -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
|
||||||
~~~~~~~~~~~~~
|
~~~~~~~~~~~~~
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue