[FIX] odoo: onchange load the related field data
Configurations uses an onchange to populate the fields visible to the user. However, the related fields are by default called sudo, when it is an onchange, there may be a missmatch in the cache, the cache used being empty, there is no value to return (cache fix is not currently possible). Before this fix we must use 'related_sudo=False' to use the good cache but it's an inconsistent fix because in some case we must use sudo to avoid access error. opw-1823363
This commit is contained in:
@@ -320,6 +320,10 @@ class Related(models.Model):
|
||||
related_name = fields.Char(related='name')
|
||||
related_related_name = fields.Char(related='related_name')
|
||||
|
||||
message = fields.Many2one('test_new_api.message')
|
||||
message_name = fields.Text(related="message.body", related_sudo=False, string='Message Body')
|
||||
message_currency = fields.Many2one(related="message.author", string='Message Author')
|
||||
|
||||
|
||||
class ComputeInverse(models.Model):
|
||||
_name = 'test_new_api.compute.inverse'
|
||||
|
||||
@@ -425,3 +425,32 @@ class TestOnChange(common.TransactionCase):
|
||||
'size': email.size,
|
||||
})]
|
||||
)
|
||||
|
||||
def test_onchange_related(self):
|
||||
value = {
|
||||
'message': 1,
|
||||
'message_name': False,
|
||||
'message_currency': 2,
|
||||
}
|
||||
field_onchange = {
|
||||
'message': '1',
|
||||
'message_name': None,
|
||||
'message_currency': None,
|
||||
}
|
||||
|
||||
onchange_result = {
|
||||
'message_name': 'Hey dude!',
|
||||
'message_currency': (1, 'Administrator')
|
||||
}
|
||||
|
||||
self.env.cache.invalidate()
|
||||
Message = self.env['test_new_api.related']
|
||||
result = Message.onchange(value, ['message', 'message_name', 'message_currency'], field_onchange)
|
||||
|
||||
self.assertEqual(result['value'], onchange_result)
|
||||
|
||||
self.env.cache.invalidate()
|
||||
Message = self.env(user=self.env.ref('base.user_demo').id)['test_new_api.related']
|
||||
result = Message.onchange(value, ['message', 'message_name', 'message_currency'], field_onchange)
|
||||
|
||||
self.assertEqual(result['value'], onchange_result)
|
||||
|
||||
+10
-9
@@ -4985,15 +4985,16 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
|
||||
done = set()
|
||||
|
||||
# dummy assignment: trigger invalidations on the record
|
||||
for name in todo:
|
||||
if name == 'id':
|
||||
continue
|
||||
value = record[name]
|
||||
field = self._fields[name]
|
||||
if field.type == 'many2one' and field.delegate and not value:
|
||||
# do not nullify all fields of parent record for new records
|
||||
continue
|
||||
record[name] = value
|
||||
with env.do_in_onchange():
|
||||
for name in todo:
|
||||
if name == 'id':
|
||||
continue
|
||||
value = record[name]
|
||||
field = self._fields[name]
|
||||
if field.type == 'many2one' and field.delegate and not value:
|
||||
# do not nullify all fields of parent record for new records
|
||||
continue
|
||||
record[name] = value
|
||||
|
||||
result = {}
|
||||
dirty = set()
|
||||
|
||||
Reference in New Issue
Block a user