diff --git a/trytond/model/modelview.py b/trytond/model/modelview.py index 747cc43270..a242df4de8 100644 --- a/trytond/model/modelview.py +++ b/trytond/model/modelview.py @@ -782,26 +782,38 @@ class ModelView(Model): value = collections.defaultdict(list) value['remove'] = [t.id for t in init_targets if t.id] for i, target in enumerate(targets): - if target.id in value['remove']: - value['remove'].remove(target.id) - if isinstance(target, ModelView): - target_changed = target._changed_values - if target_changed: - target_changed['id'] = target.id - value['update'].append(target_changed) + if (field._type == 'one2many' + and field.field + and target._values): + t_values = target._values.copy() + # Don't look at reverse field + target._values.pop(field.field, None) else: - if isinstance(target, ModelView): - # Ensure initial values are returned because target - # was instantiated on server side. - target_init_values = target._init_values - target._init_values = None - try: - added_values = target._changed_values - finally: - target._init_values = target_init_values + t_values = None + try: + if target.id in value['remove']: + value['remove'].remove(target.id) + if isinstance(target, ModelView): + target_changed = target._changed_values + if target_changed: + target_changed['id'] = target.id + value['update'].append(target_changed) else: - added_values = target._default_values - value['add'].append((i, added_values)) + if isinstance(target, ModelView): + # Ensure initial values are returned because + # target was instantiated on server side. + target_init_values = target._init_values + target._init_values = None + try: + added_values = target._changed_values + finally: + target._init_values = target_init_values + else: + added_values = target._default_values + value['add'].append((i, added_values)) + finally: + if t_values: + target._values = t_values if not value['remove']: del value['remove'] if not value: diff --git a/trytond/tests/test_modelview.py b/trytond/tests/test_modelview.py index 1d382745c9..924970d82f 100644 --- a/trytond/tests/test_modelview.py +++ b/trytond/tests/test_modelview.py @@ -107,6 +107,26 @@ class ModelView(unittest.TestCase): }, }) + @with_transaction() + def test_changed_values_reverse_field(self): + "Test _changed_values with reverse field set" + pool = Pool() + Model = pool.get('test.modelview.changed_values') + Target = pool.get('test.modelview.changed_values.target') + + record = Model(id=1) + record.name = "Record" + target = Target() + target.name = "Target" + record.targets = [target] + + self.assertEqual(record._changed_values, { + 'name': "Record", + 'targets': { + 'add': [(0, {'name': "Target"})], + }, + }) + @with_transaction(context={'_check_access': True}) def test_button_access(self): 'Test Button Access'