From a8f4b522a324c7756626c9191eb1357db688812e Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Fri, 30 Nov 2018 09:45:08 +0000 Subject: [PATCH] [FIX] models: onchange sends all fields upon change in x2many On a record with a large x2many, the web client does not load all the data of the lines (because of paging). If a line is modified by an onchange, at some point the client will determine whether lines are valid (all required fields are provided). It is possible that the client cannot evaluate the validity of the modified line because of missing fields. In order to avoid this situaion, the server sends all fields on modified lines. --- .../test_new_api/tests/test_onchange.py | 46 ++++++++++++++----- odoo/models.py | 5 +- 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/odoo/addons/test_new_api/tests/test_onchange.py b/odoo/addons/test_new_api/tests/test_onchange.py index 16144c266fc..fc72c500e50 100644 --- a/odoo/addons/test_new_api/tests/test_onchange.py +++ b/odoo/addons/test_new_api/tests/test_onchange.py @@ -149,10 +149,17 @@ class TestOnChange(common.TransactionCase): (5,), (1, message1.id, { 'name': "[%s] %s" % ("Foo", USER.name), + 'body': "ABC", + 'author': USER.name_get()[0], + 'size': 3, + 'important': False, }), (1, message2.id, { 'name': "[%s] %s" % ("Foo", USER.name), 'body': "XYZ", # this must be sent back + 'author': USER.name_get()[0], + 'size': 3, + 'important': False, }), (0, 0, { 'name': "[%s] %s" % ("Foo", USER.name), @@ -262,11 +269,16 @@ class TestOnChange(common.TransactionCase): '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,)]}), + (1, line1.id, { + 'name': partner2.name, + 'partner': (partner2.id, partner2.name), + 'tags': [(5,)], + }), + (0, 0, { + 'name': partner2.name, + 'partner': (partner2.id, partner2.name), + 'tags': [(5,)], + }), ], }) @@ -286,11 +298,16 @@ class TestOnChange(common.TransactionCase): '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'})]}), + (1, line1.id, { + 'name': partner2.name, + 'partner': (partner2.id, partner2.name), + 'tags': [(5,)], + }), + (0, 0, { + 'name': partner2.name, + 'partner': (partner2.id, partner2.name), + 'tags': [(5,), (0, 0, {'name': 'Tag'})], + }), ], } self.assertEqual(result['value'], expected_value) @@ -439,7 +456,14 @@ class TestOnChange(common.TransactionCase): self.assertEqual( result['value']['important_emails'], - [(5,), (1, email.id, {'name': u'[Foo Bar] %s' % USER.name})], + [(5,), (1, email.id, { + 'name': u'[Foo Bar] %s' % USER.name, + 'body': BODY, + 'author': USER.name_get()[0], + 'size': len(BODY), + 'important': True, + 'email_to': demo.email, + })], ) def test_onchange_related(self): diff --git a/odoo/models.py b/odoo/models.py index dc1a4b4f427..3266a763977 100644 --- a/odoo/models.py +++ b/odoo/models.py @@ -5100,10 +5100,13 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})): line_diff = line_snapshot.diff({}) commands.append((0, line.id.ref or 0, line_diff)) else: - # existing line: send diff from database + # existing line: check diff from database # (requires a clean record cache!) line_diff = line_snapshot.diff(Snapshot(line, subnames)) if line_diff: + # send all fields because the web client + # might need them to evaluate modifiers + line_diff = line_snapshot.diff({}) commands.append((1, line.id, line_diff)) else: commands.append((4, line.id))