[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.
This commit is contained in:
Raphael Collet
2018-11-30 13:34:44 +00:00
parent 95f4287b6a
commit a8f4b522a3
2 changed files with 39 additions and 12 deletions
+35 -11
View File
@@ -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):
+4 -1
View File
@@ -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))