[FIX] models.py: onchange creating m2m => no NewId

Since 2054b59 if we created a record in a many2many relationship of an
onchange, we would also possibly erreneously return the NewId.

The logic of convert_to_onchange of _RelationalMulti doesn't send back
the ID field (if the ID is needed, it is part of the command, not the
update/create dictionary values of a command) and this commit does the
same for the code changed in 2054b59.

This commit also adds a test for this fix, and a test for the regression
corrected with cd2ccc4110 reported in #25969

fix for https://github.com/odoo/odoo/commit/2054b5928#commitcomment-29837226
closes #25984
This commit is contained in:
Nicolas Lempereur
2018-07-26 15:26:27 +02:00
committed by nle-odoo
parent 82da221b1f
commit 07023137cd
2 changed files with 31 additions and 11 deletions
+29 -11
View File
@@ -153,6 +153,17 @@ class TestOnChange(common.TransactionCase):
}),
])
# ensure onchange changing one2many without subfield works
one_level_fields = {k: v for k, v in field_onchange.items() if k.count('.') < 1}
values = dict(values, name='{generate_dummy_message}')
result = self.Discussion.with_context(generate_dummy_message=True).onchange(values, 'name', one_level_fields)
self.assertEqual(result['value']['messages'], [
(5,),
(4, message.id),
(0, 0, {}),
(0, 0, {}),
])
def test_onchange_one2many_reference(self):
""" test the effect of onchange() on one2many fields with line references """
BODY = "What a beautiful day!"
@@ -249,6 +260,17 @@ class TestOnChange(common.TransactionCase):
})
# do it again, but this time with a new tag on the second line
expected_new_tag_result = {
'name': partner2.name,
'lines': [
(5,),
(1, line1.id, {'name': partner2.name,
'partner': (partner2.id, partner2.name)}),
(0, 0, {'name': partner2.name,
'partner': (partner2.id, partner2.name),
'tags': [(5,), (0, 0, {'name': 'Tag'})]}),
],
}
values = {
'name': partner1.name,
'partner': partner2.id, # this one just changed
@@ -260,17 +282,13 @@ class TestOnChange(common.TransactionCase):
self.env.cache.invalidate()
result = multi.onchange(values, 'partner', field_onchange)
self.assertEqual(result['value'], {
'name': partner2.name,
'lines': [
(5,),
(1, line1.id, {'name': partner2.name,
'partner': (partner2.id, partner2.name)}),
(0, 0, {'name': partner2.name,
'partner': (partner2.id, partner2.name),
'tags': [(5,), (0, 0, {'name': 'Tag'})]}),
],
})
self.assertEqual(result['value'], expected_new_tag_result)
# ensure ID is not returned when asked and a many2many record is set to be created
self.env.cache.invalidate()
result = multi.onchange(values, 'partner', dict(field_onchange, **{'lines.tags.id': None}))
self.assertEqual(result['value'], expected_new_tag_result)
def test_onchange_specific(self):
""" test the effect of field-specific onchange method """
+2
View File
@@ -5103,6 +5103,8 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
"""
result = {}
for name, subnames in tree.items():
if name == 'id':
continue
if old and old[name] == new[name]:
continue
field = record._fields[name]