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"