summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaphael Collet <rco@odoo.com>2019-04-18 15:19:02 +0000
committerRaphael Collet <rco@odoo.com>2019-04-30 07:54:49 +0000
commit63bc6013ab30acfee7fdedcd396ad3984543b99e (patch)
tree0ec0a0d92b8c87d8eff2313a9a2c8e87c844d4ae
parent0d21735a92c8d0b60babaac6d62dbc8eda7c11ea (diff)
[IMP] fields: relational fields automatically behave as mapped
In other words, `recs.foo_id == recs.mapped('foo_id')`.
-rw-r--r--odoo/addons/base/tests/test_api.py8
-rw-r--r--odoo/fields.py11
2 files changed, 17 insertions, 2 deletions
diff --git a/odoo/addons/base/tests/test_api.py b/odoo/addons/base/tests/test_api.py
index 663b2f15312..57a33fc3e45 100644
--- a/odoo/addons/base/tests/test_api.py
+++ b/odoo/addons/base/tests/test_api.py
@@ -491,11 +491,13 @@ class TestAPI(common.TransactionCase):
""" Check map on recordsets. """
ps = self.env['res.partner'].search([])
parents = ps.browse()
- for p in ps: parents |= p.parent_id
+ for p in ps:
+ parents |= p.parent_id
# map a single field
self.assertEqual(ps.mapped(lambda p: p.parent_id), parents)
self.assertEqual(ps.mapped('parent_id'), parents)
+ self.assertEqual(ps.parent_id, parents)
# map a sequence of fields
self.assertEqual(
@@ -506,6 +508,10 @@ class TestAPI(common.TransactionCase):
ps.mapped('parent_id.name'),
[p.name for p in parents]
)
+ self.assertEqual(
+ ps.parent_id.mapped('name'),
+ [p.name for p in parents]
+ )
# map an empty sequence of fields
self.assertEqual(ps.mapped(''), ps)
diff --git a/odoo/fields.py b/odoo/fields.py
index 5d0cf903232..6017f12f271 100644
--- a/odoo/fields.py
+++ b/odoo/fields.py
@@ -989,7 +989,7 @@ class Field(MetaField('DummyField', (object,), {})):
if record is None:
return self # the field is accessed through the owner class
- if record:
+ if record._ids:
# only a single record may be accessed
record.ensure_one()
try:
@@ -2033,6 +2033,15 @@ class _Relational(Field):
'context': {}, # context for searching values
}
+ def __get__(self, records, owner):
+ # base case: do the regular access
+ if records is None or len(records._ids) <= 1:
+ return super().__get__(records, owner)
+ # multirecord case: return the union of the values of 'self' on records
+ get = super().__get__
+ comodel = records.env[self.comodel_name]
+ return comodel.union(*[get(record, owner) for record in records])
+
def _setup_regular_base(self, model):
super(_Relational, self)._setup_regular_base(model)
if self.comodel_name not in model.pool: