Do not consider as changed the reverse field of One2Many

issue8742
This commit is contained in:
Cédric Krier committed 2019-11-17 23:42:02 +01:00
1 parent 922c420fae
commit f7e5c68664
2 files changed
+50 -18

No files matched your search

+30 -18
View File
@@ -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:
+20
View File
@@ -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'