From 07023137cd17d8917673fd6ba7809b2870bd8cc0 Mon Sep 17 00:00:00 2001 From: Nicolas Lempereur Date: Thu, 26 Jul 2018 11:44:02 +0200 Subject: [PATCH] [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 --- .../test_new_api/tests/test_onchange.py | 40 ++++++++++++++----- odoo/models.py | 2 + 2 files changed, 31 insertions(+), 11 deletions(-) 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]