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)