[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
This commit is contained in:
Raphael Collet 2014-08-04 11:12:39 +02:00 committed by Olivier Dony
parent 2d2274aeed
commit a1d0394ff4
3 changed files with 13 additions and 7 deletions

View File

@ -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, [])

View File

@ -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

View File

@ -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)