From 264ff534cfeee30d5aa8f28adc10c42ee31e239f Mon Sep 17 00:00:00 2001 From: laurentbarontini Date: Sat, 25 Jul 2026 10:39:50 +0200 Subject: [PATCH] Purchase form --- ir/model.py | 86 ++++++++++++++++--- modules/purchase_trade/view/purchase_form.xml | 15 +++- .../view/purchase_line_form.xml | 26 +++--- 3 files changed, 102 insertions(+), 25 deletions(-) diff --git a/ir/model.py b/ir/model.py index 54c552c..d380a61 100755 --- a/ir/model.py +++ b/ir/model.py @@ -1606,9 +1606,6 @@ class Log(ResourceAccessMixin, ModelSQL, ModelView): return json.dumps(value, sort_keys=True, ensure_ascii=False) if value in (None, ''): return '' - if isinstance(value, str) and re.match(r'^-?\d+(\.\d+)?$', value): - value = value.rstrip('0').rstrip('.') - return value or '0' return str(value) @staticmethod @@ -1619,14 +1616,27 @@ class Log(ResourceAccessMixin, ModelSQL, ModelView): return label[:-1] return label + def _nested_record_label(self, field, field_label, record_id): + record_label = self._singular_label(field_label) + if not self.resource: + return '%s %s' % (record_label, record_id) + records = list(getattr(self.resource, field.name, None) or []) + line_records = [ + record for record in records + if getattr(record, 'type', 'line') == 'line'] + ordered_records = line_records or records + for index, record in enumerate(ordered_records, 1): + if str(getattr(record, 'id', '')) == str(record_id): + return '%s %s' % (record_label, index) + return '%s %s' % (record_label, record_id) + def _format_nested_change_summary( - self, field_label, target_model, old_value, new_value): + self, field, field_label, target_model, old_value, new_value): pool = Pool() Field = pool.get('ir.model.field') lines = [] if not isinstance(old_value, dict) or not isinstance(new_value, dict): return lines - record_label = self._singular_label(field_label) def record_sort_key(value): try: return int(value) @@ -1645,14 +1655,63 @@ class Log(ResourceAccessMixin, ModelSQL, ModelView): if child_old == child_new: continue child_label = Field.get_name(target_model, child_field) - lines.append('%s %s %s %s => %s' % ( - record_label, - record_id, + lines.append('%s %s %s => %s' % ( + self._nested_record_label( + field, field_label, record_id), child_label, self._format_change_value(child_old), self._format_change_value(child_new))) return lines + @staticmethod + def _iter_change_commands(value): + if not isinstance(value, list): + return + for item in value: + if isinstance(item, list) and item and isinstance(item[0], str): + command = item[0] + if len(item) >= 3: + yield command, item[1], item[2] + elif len(item) >= 2: + yield command, item[1], None + if value and all(isinstance(item, list) for item in value): + return + index = 0 + while index < len(value): + command = value[index] + if not isinstance(command, str): + index += 1 + continue + if command == 'write': + if index + 2 >= len(value): + break + yield command, value[index + 1], value[index + 2] + index += 3 + continue + if index + 1 >= len(value): + break + yield command, value[index + 1], None + index += 2 + + def _format_command_change_summary( + self, field, field_label, target_model, new_value): + pool = Pool() + Field = pool.get('ir.model.field') + lines = [] + for command, record_ids, values in self._iter_change_commands( + new_value) or []: + if command != 'write' or not isinstance(values, dict): + continue + for record_id in record_ids: + for child_field, child_value in sorted(values.items()): + child_label = Field.get_name(target_model, child_field) + lines.append('%s %s => %s' % ( + self._nested_record_label( + field, field_label, record_id), + child_label, + self._format_change_value(child_value))) + return lines + def get_change_summary(self, name): if self.event != 'write': return '' @@ -1673,14 +1732,21 @@ class Log(ResourceAccessMixin, ModelSQL, ModelView): field_label = Field.get_name(model, field_name) else: field_label = field_name - field = getattr(self.resource.__class__, field_name, None) + field = ( + getattr(self.resource.__class__, field_name, None) + if self.resource else None) if field and hasattr(field, 'get_target'): target_model = field.get_target().__name__ nested_lines = self._format_nested_change_summary( - field_label, target_model, old_value, new_value) + field, field_label, target_model, old_value, new_value) if nested_lines: lines.extend(nested_lines) continue + command_lines = self._format_command_change_summary( + field, field_label, target_model, new_value) + if command_lines: + lines.extend(command_lines) + continue lines.append('%s: %s -> %s' % ( field_label, self._format_change_value(old_value), diff --git a/modules/purchase_trade/view/purchase_form.xml b/modules/purchase_trade/view/purchase_form.xml index 356e1f5..b193641 100755 --- a/modules/purchase_trade/view/purchase_form.xml +++ b/modules/purchase_trade/view/purchase_form.xml @@ -3,11 +3,12 @@ this repository contains the full copyright notices and license terms. --> + - + +