[FIX] core: web_read() on new records

This completes 96a98f4f4c in the case
where a many2one field has a new record as value, even when that
many2one field is not a delegate field.

Part-of: odoo/odoo#114024
This commit is contained in:
Raphael Collet
2023-07-24 20:17:49 +02:00
committed by Aaron Bohy
parent 273556d16d
commit 7bfbd75d57
3 changed files with 53 additions and 7 deletions
+17 -4
View File
@@ -104,11 +104,17 @@ class Base(models.AbstractModel):
return vals
for field_name, field_spec in specification.items():
if not field_spec:
field = self._fields.get(field_name)
if field is None:
continue
field = self._fields[field_name]
if field.type == 'many2one' and 'fields' in field_spec:
if field.type == 'many2one':
if 'fields' not in field_spec:
for values in values_list:
if isinstance(values[field_name], NewId):
values[field_name] = values[field_name].origin
continue
co_records = self[field_name]
if 'context' in field_spec:
co_records = co_records.with_context(**field_spec['context'])
@@ -128,9 +134,13 @@ class Base(models.AbstractModel):
for values in values_list:
if values[field_name] is False:
continue
values[field_name] = many2one_data[values[field_name]]
vals = many2one_data[values[field_name]]
values[field_name] = vals['id'] and vals
elif field.type in ('one2many', 'many2many'):
if not field_spec:
continue
co_records = self[field_name]
if 'order' in field_spec and field_spec['order']:
@@ -164,6 +174,9 @@ class Base(models.AbstractModel):
values[field_name] = [x2many_data.get(id_) or {'id': id_} for id_ in values[field_name]]
elif field.type in ('reference', 'many2one_reference'):
if not field_spec:
continue
values_by_id = {
vals['id']: vals
for vals in values_list
@@ -152,6 +152,41 @@ class TestUnityRead(TransactionCase):
}
}])
def test_read_many2one_with_new_record(self):
values = {'author_id': {'id': self.author.id}}
new_course = self.course.new(values, origin=self.course)
# new_course.author_id is a new record
self.assertTrue(new_course.author_id)
self.assertFalse(new_course.author_id.id)
result = new_course.web_read({
'display_name': {},
'author_id': {},
})
self.assertEqual(result, [
{
'id': new_course.id,
'display_name': 'introduction to OWL',
'author_id': self.author.id,
}
])
result = new_course.web_read({
'display_name': {},
'author_id': {'fields': {'display_name': {}}},
})
self.assertEqual(result, [
{
'id': new_course.id,
'display_name': 'introduction to OWL',
'author_id': {
'id': self.author.id,
'display_name': 'ged'
}
}
])
def test_new_record_with_inherits(self):
# virtualize a record
new_account = self.account.new(origin=self.account)
+1 -3
View File
@@ -3032,10 +3032,8 @@ class Many2one(_Relational):
except MissingError:
# Should not happen, unless the foreign key is missing.
return False
elif self.delegate:
return value.id
else:
return value._origin.id
return value.id
def convert_to_write(self, value, record):
if type(value) in IdType: