From 0d437d341c38d292b440ea5907d8555a9fa34d95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Fri, 15 Dec 2023 18:09:30 +0100 Subject: [PATCH] Use empty value Function xxx2Many fields without initial value Since d142b33fa3ab the on_change_with relies on _changed_value. But for Function xxx2Many fields if their value is not in the initial value, we should not retrieve it from the database because the result will be the same as the one set by on_change_with. Closes #12836 --- trytond/trytond/model/modelview.py | 2 ++ trytond/trytond/tests/modelview.py | 6 ++++++ trytond/trytond/tests/test_modelview.py | 16 ++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/trytond/trytond/model/modelview.py b/trytond/trytond/model/modelview.py index 17740144d9..1950299203 100644 --- a/trytond/trytond/model/modelview.py +++ b/trytond/trytond/model/modelview.py @@ -863,6 +863,8 @@ class ModelView(Model): targets = value if fname in init_values: init_targets = init_values._get(fname) + elif isinstance(field, fields.Function): + init_targets = [] else: init_targets = getattr(init_record, fname, []) value = collections.defaultdict(list) diff --git a/trytond/trytond/tests/modelview.py b/trytond/trytond/tests/modelview.py index 9b57187099..236071ab24 100644 --- a/trytond/trytond/tests/modelview.py +++ b/trytond/trytond/tests/modelview.py @@ -25,6 +25,12 @@ class ModelViewChangedValues(ModelView): ], "MultiSelection") dictionary = fields.Dict( 'test.modelview.changed_values.dictionary', "Dictionary") + m2m_function = fields.Function(fields.Many2Many( + 'test.modelview.changed_values.target', None, None, "Targets"), + 'on_change_with_m2m_function') + + def on_change_with_m2m_function(self, name=None): + return class ModelViewChangedValuesDictSchema(DictSchemaMixin, ModelSQL): diff --git a/trytond/trytond/tests/test_modelview.py b/trytond/trytond/tests/test_modelview.py index 4a0d5dad48..d11e2aa5d9 100644 --- a/trytond/trytond/tests/test_modelview.py +++ b/trytond/trytond/tests/test_modelview.py @@ -109,6 +109,22 @@ class ModelView(unittest.TestCase): }, }) + @with_transaction() + def test_changed_values_2many_function(self): + "Test changed values for xxx2many function field" + pool = Pool() + Model = pool.get('test.modelview.changed_values') + + with patch.object( + Model, 'on_change_with_m2m_function') as on_change_with: + on_change_with.return_value = [42] + record = Model() + record.m2m_function = record.on_change_with_m2m_function() + + self.assertEqual(record._changed_values, { + 'm2m_function': {'add': [(0, {'id': 42})]}, + }) + @with_transaction() def test_changed_values_stored(self): "Test stored changed values"