[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:
committed by
Aaron Bohy
parent
273556d16d
commit
7bfbd75d57
@@ -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
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user