diff --git a/auditlog/README.rst b/auditlog/README.rst index 22b9aefb3..099e6cf37 100644 --- a/auditlog/README.rst +++ b/auditlog/README.rst @@ -90,6 +90,7 @@ Contributors * Holden Rehg * Eric Lembregts * Alan Ramos +* Tom Blauwendraat Other credits ~~~~~~~~~~~~~ diff --git a/auditlog/models/rule.py b/auditlog/models/rule.py index b852c674d..069ef7927 100644 --- a/auditlog/models/rule.py +++ b/auditlog/models/rule.py @@ -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,