diff --git a/ir/model.py b/ir/model.py index 2fea691..2287a4a 100755 --- a/ir/model.py +++ b/ir/model.py @@ -1538,6 +1538,10 @@ class Log(ResourceAccessMixin, ModelSQL, ModelView): }) action = fields.Function( fields.Char("Action"), 'get_action', searcher='search_action') + old_values = fields.Text("Old Values", readonly=True) + new_values = fields.Text("New Values", readonly=True) + change_summary = fields.Function( + fields.Text("Changes"), 'get_change_summary') @classmethod def __setup__(cls): @@ -1583,6 +1587,53 @@ class Log(ResourceAccessMixin, ModelSQL, ModelView): return f'{field_name} : {state}' return self.target + @staticmethod + def _load_change_values(value): + if not value: + return {} + try: + return json.loads(value) + except (TypeError, ValueError): + return {} + + @staticmethod + def _format_change_value(value): + if isinstance(value, list): + if len(value) > 6: + return '[%s items]' % len(value) + return ', '.join(Log._format_change_value(v) for v in value) + if isinstance(value, dict): + return json.dumps(value, sort_keys=True, ensure_ascii=False) + if value in (None, ''): + return '' + return str(value) + + def get_change_summary(self, name): + if self.event != 'write': + return '' + old_values = self._load_change_values(self.old_values) + new_values = self._load_change_values(self.new_values) + if not old_values and not new_values: + return '' + pool = Pool() + Field = pool.get('ir.model.field') + model = self.resource.__name__ if self.resource else None + lines = [] + for field_name in sorted(set(old_values) | set(new_values)): + old_value = old_values.get(field_name) + new_value = new_values.get(field_name) + if old_value == new_value: + continue + if model: + field_label = Field.get_name(model, field_name) + else: + field_label = field_name + lines.append('%s: %s -> %s' % ( + field_label, + self._format_change_value(old_value), + self._format_change_value(new_value))) + return '\n'.join(lines) + @classmethod def search_action(cls, name, clause): return [('target', *clause[1:])] diff --git a/ir/view/model_log_form.xml b/ir/view/model_log_form.xml index f404813..0916088 100755 --- a/ir/view/model_log_form.xml +++ b/ir/view/model_log_form.xml @@ -13,4 +13,10 @@ this repository contains the full copyright notices and license terms. --> +