summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaphael Collet <rco@odoo.com>2018-11-30 09:45:08 +0000
committerRaphael Collet <rco@odoo.com>2018-11-30 09:57:11 +0000
commit6a71a680465916b97fd6f759491eb455de58af69 (patch)
treea2eed4d1c21c28168a87c7e94f14e9d7a0647e07
parenta226723e5255fa9344244dab536c0d9b320758a7 (diff)
[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. closes odoo/odoo#29177
-rw-r--r--odoo/addons/test_new_api/tests/test_onchange.py46
-rw-r--r--odoo/models.py5
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 0c58844bb09..ef196bf0e61 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 b2aab1d5f36..8275cde54e7 100644
--- a/odoo/models.py
+++ b/odoo/models.py
@@ -5361,10 +5361,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))