From 51680426a6811ea5f227e295fdfa43ff599f3011 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Tue, 15 Nov 2016 14:45:46 +0100 Subject: [PATCH] [FIX] fields: convert_to_cache() on cached values for relational fields (#14328) --- openerp/addons/base/tests/test_api.py | 7 +++++++ openerp/fields.py | 7 ++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/openerp/addons/base/tests/test_api.py b/openerp/addons/base/tests/test_api.py index 645c5d4ad9b..bdd6bed3162 100644 --- a/openerp/addons/base/tests/test_api.py +++ b/openerp/addons/base/tests/test_api.py @@ -323,6 +323,13 @@ class TestAPI(common.TransactionCase): self.assertEqual(set(partner2.child_ids), set(children2)) self.env.check_cache() + # convert from the cache format to the write format + partner = partner1 + partner.country_id, partner.child_ids + data = partner._convert_to_write(partner._cache) + self.assertEqual(data['country_id'], partner.country_id.id) + self.assertEqual(data['child_ids'], [(6, 0, partner.child_ids.ids)]) + @mute_logger('openerp.models') def test_60_prefetch(self): """ Check the record cache prefetching """ diff --git a/openerp/fields.py b/openerp/fields.py index 99345d67148..ed536c82ff6 100644 --- a/openerp/fields.py +++ b/openerp/fields.py @@ -1723,7 +1723,8 @@ class Many2one(_Relational): return process(value._ids) raise ValueError("Wrong value for %s: %r" % (self, value)) elif isinstance(value, tuple): - return process((value[0],)) + # value is either a pair (id, name), or a tuple of ids + return process(value[:1]) elif isinstance(value, dict): return process(record.env[self.comodel_name].new(value)._ids) else: @@ -1797,8 +1798,8 @@ class _RelationalMulti(_Relational): if isinstance(value, BaseModel): if not validate or (value._name == self.comodel_name): return process(value._ids) - elif isinstance(value, list): - # value is a list of record ids or commands + elif isinstance(value, (list, tuple)): + # value is a list/tuple of commands, dicts or record ids comodel = record.env[self.comodel_name] # determine the value ids; by convention empty on new records ids = OrderedSet(record[self.name].ids if record.id else ())