From a1d0394ff4c5301fd1cb4393a55fd9e1b7ac710d Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Mon, 4 Aug 2014 11:12:39 +0200 Subject: [PATCH] [FIX] models: default_get() shall not return a dict as a many2one value When a new record is returned as the value for a many2one on a new record, the method Many2one.convert_to_write() now returns a NewID, and default_get() then discards that value from its result. This makes it consistent with its former behavior. Manual rebase of #1547 --- openerp/addons/base/tests/test_orm.py | 6 ++++++ openerp/fields.py | 2 +- openerp/models.py | 12 ++++++------ 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/openerp/addons/base/tests/test_orm.py b/openerp/addons/base/tests/test_orm.py index eb239fd6c76..39fbeb4fb0a 100644 --- a/openerp/addons/base/tests/test_orm.py +++ b/openerp/addons/base/tests/test_orm.py @@ -166,6 +166,12 @@ class TestInherits(common.TransactionCase): self.partner = self.registry('res.partner') self.user = self.registry('res.users') + def test_default(self): + """ `default_get` cannot return a dictionary or a new id """ + defaults = self.user.default_get(self.cr, UID, ['partner_id']) + if 'partner_id' in defaults: + self.assertIsInstance(defaults['partner_id'], (bool, int, long)) + def test_create(self): """ creating a user should automatically create a new partner """ partners_before = self.partner.search(self.cr, UID, []) diff --git a/openerp/fields.py b/openerp/fields.py index 0aaddad4f6c..31d1b2e678d 100644 --- a/openerp/fields.py +++ b/openerp/fields.py @@ -1322,7 +1322,7 @@ class Many2one(_Relational): return value.id def convert_to_write(self, value, target=None, fnames=None): - return bool(value) and (value.id or value._convert_to_write(value._cache)) + return value.id def convert_to_onchange(self, value): return value.id diff --git a/openerp/models.py b/openerp/models.py index c199a7dab73..af55db1f1cb 100644 --- a/openerp/models.py +++ b/openerp/models.py @@ -1299,7 +1299,12 @@ class BaseModel(object): record[name] # force evaluation of defaults # retrieve defaults from record's cache - return self._convert_to_write(record._cache) + result = self._convert_to_write(record._cache) + for key, val in result.items(): + if isinstance(val, NewId): + del result[key] # ignore new records in defaults + + return result def add_default_value(self, field): """ Set the default value of `field` to the new record `self`. @@ -3951,11 +3956,6 @@ class BaseModel(object): record_id = tocreate[table].pop('id', None) - if isinstance(record_id, dict): - # Shit happens: this possibly comes from a new record - tocreate[table] = dict(record_id, **tocreate[table]) - record_id = None - # When linking/creating parent records, force context without 'no_store_function' key that # defers stored functions computing, as these won't be computed in batch at the end of create(). parent_context = dict(context)