From 7bfbd75d57ebf6d9c1a3023208bf2d340b56c0e9 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Thu, 20 Jul 2023 08:58:54 +0000 Subject: [PATCH] [FIX] core: web_read() on new records This completes 96a98f4f4c9885ced0d44829341a951ca4a963c5 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 --- addons/web/models/models.py | 21 ++++++++--- .../test_new_api/tests/test_unity_read.py | 35 +++++++++++++++++++ odoo/fields.py | 4 +-- 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/addons/web/models/models.py b/addons/web/models/models.py index 240eddf7b9c..b5c1e30e51d 100644 --- a/addons/web/models/models.py +++ b/addons/web/models/models.py @@ -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 diff --git a/odoo/addons/test_new_api/tests/test_unity_read.py b/odoo/addons/test_new_api/tests/test_unity_read.py index 3fe3f3c67a2..b9c97d495b0 100644 --- a/odoo/addons/test_new_api/tests/test_unity_read.py +++ b/odoo/addons/test_new_api/tests/test_unity_read.py @@ -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) diff --git a/odoo/fields.py b/odoo/fields.py index 53a361e93f5..8b7b110a0f4 100644 --- a/odoo/fields.py +++ b/odoo/fields.py @@ -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: