From 9bad31d83440802cad3e4c6b146aa0855e18f4dc Mon Sep 17 00:00:00 2001 From: Simone Rubino Date: Fri, 20 Dec 2024 17:49:45 +0100 Subject: [PATCH 1/2] [FIX] onchange_helper: Do not overwrite precomputed fields --- onchange_helper/models/base.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/onchange_helper/models/base.py b/onchange_helper/models/base.py index c087ddc8c2f..a27a6dd395f 100644 --- a/onchange_helper/models/base.py +++ b/onchange_helper/models/base.py @@ -53,6 +53,15 @@ def play_onchanges(self, values, onchange_fields): if field not in all_values: all_values[field] = record_values.get(field, False) + if not self: + # Precomputed fields will be computed just before creation + # and should not be overwritten by changed values + all_values = { + field_name: all_values[field_name] + for field_name in all_values + if not self._fields[field_name].precompute + } + new_values = {} for field in onchange_fields: onchange_values = self.onchange(all_values, field, onchange_specs) From 3ed53b9b6dceeac1c1fde7e746d2b77f75b96727 Mon Sep 17 00:00:00 2001 From: Simone Rubino Date: Mon, 23 Dec 2024 15:52:20 +0100 Subject: [PATCH 2/2] [FIX] onchange_helper: Change only fields that should Only fields in the view being shown should be changed, otherwise the behavior is different than what happens in the UI --- onchange_helper/models/base.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/onchange_helper/models/base.py b/onchange_helper/models/base.py index a27a6dd395f..e7c03dd0b50 100644 --- a/onchange_helper/models/base.py +++ b/onchange_helper/models/base.py @@ -21,19 +21,19 @@ def _get_new_values(self, record, on_change_result): return new_values @api.model - def play_onchanges(self, values, onchange_fields): + def play_onchanges(self, values, onchange_fields, view_info=None): """ :param values: dict of input value that :param onchange_fields: fields for which onchange methods will be - played + played + :param view_info: view containing the fields that should change, + as returned by `get_view` + Order in onchange_fields is very important as onchanges methods will be played in that order. :return: changed values """ - # _onchange_spec() will return onchange fields from the default view - # we need all fields in the dict even the empty ones - # otherwise 'onchange()' will not apply changes to them - onchange_specs = {field_name: "1" for field_name, field in self._fields.items()} + onchange_specs = self._onchange_spec(view_info=view_info) all_values = values.copy() # If self is a record (play onchange on existing record) # we take the value of the field @@ -49,6 +49,8 @@ def play_onchanges(self, values, onchange_fields): else: # We get default values, they may be used in onchange record_values = self.default_get(self._fields.keys()) + # we need all fields in the dict even the empty ones + # otherwise 'onchange()' will not apply changes to them for field in self._fields: if field not in all_values: all_values[field] = record_values.get(field, False)