[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:
parent
2d2274aeed
commit
a1d0394ff4
|
@ -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, [])
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue