diff --git a/odoo/addons/test_new_api/tests/test_new_fields.py b/odoo/addons/test_new_api/tests/test_new_fields.py index 4a82cb355ac..db0110199f7 100644 --- a/odoo/addons/test_new_api/tests/test_new_fields.py +++ b/odoo/addons/test_new_api/tests/test_new_fields.py @@ -1681,6 +1681,22 @@ class TestFields(TransactionCaseWithUserDemo): self.assertNotEqual(new_disc.participants, disc.participants) self.assertEqual(new_disc.participants._origin, disc.participants) + # provide many2one field as a dict of values; the value is a new record + # with the given 'id' as origin (if given, of course) + new_msg = disc.messages.new({ + 'discussion': {'name': disc.name}, + }) + self.assertTrue(new_msg.discussion) + self.assertFalse(new_msg.discussion.id) + self.assertFalse(new_msg.discussion._origin) + + new_msg = disc.messages.new({ + 'discussion': {'name': disc.name, 'id': disc.id}, + }) + self.assertTrue(new_msg.discussion) + self.assertFalse(new_msg.discussion.id) + self.assertEqual(new_msg.discussion._origin, disc) + # check convert_to_write tag = self.env['test_new_api.multi.tag'].create({'name': 'Foo'}) rec = self.env['test_new_api.multi'].create({ diff --git a/odoo/fields.py b/odoo/fields.py index 664c49e50ab..07c789847ee 100644 --- a/odoo/fields.py +++ b/odoo/fields.py @@ -2748,7 +2748,10 @@ class Many2one(_Relational): # value is either a pair (id, name), or a tuple of ids id_ = value[0] if value else None elif isinstance(value, dict): - id_ = record.env[self.comodel_name].new(value).id + # return a new record (with the given field 'id' as origin) + comodel = record.env[self.comodel_name] + origin = comodel.browse(value.get('id')) + id_ = comodel.new(value, origin=origin).id else: id_ = None