diff --git a/odoo/addons/test_new_api/tests/test_onchange.py b/odoo/addons/test_new_api/tests/test_onchange.py index 52fc0d06170..a1b2e4edfee 100644 --- a/odoo/addons/test_new_api/tests/test_onchange.py +++ b/odoo/addons/test_new_api/tests/test_onchange.py @@ -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 """ diff --git a/odoo/models.py b/odoo/models.py index 1daef4cb6fc..a716a429f0d 100644 --- a/odoo/models.py +++ b/odoo/models.py @@ -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]