summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaphael Collet <rco@odoo.com>2020-01-06 15:03:20 +0000
committerRaphael Collet <rco@odoo.com>2020-01-07 09:37:11 +0000
commit1639b614ebea493aa24d1b0b96541960c494a8a4 (patch)
tree0a163cc86ab302871b6b8bdba75a2c315a022b5f
parent46da3ea5b9e553bbc724ce9e7981cf0dee9cc648 (diff)
[FIX] fields: x2many field with 'active_test' in own context
Consider an x2many field with `context={'active_test': False}`. The value of that field should always contain inactive records, as the field's own context overrides the context of the current record. closes odoo/odoo#42824 X-original-commit: a2fc37adc179fb8bfc11251137334f0a43c58135 Signed-off-by: Raphael Collet (rco) <rco@openerp.com>
-rw-r--r--odoo/addons/test_new_api/models/test_new_api.py4
-rw-r--r--odoo/addons/test_new_api/tests/test_new_fields.py32
-rw-r--r--odoo/fields.py5
3 files changed, 40 insertions, 1 deletions
diff --git a/odoo/addons/test_new_api/models/test_new_api.py b/odoo/addons/test_new_api/models/test_new_api.py
index 9b8719c8707..db227b1afbe 100644
--- a/odoo/addons/test_new_api/models/test_new_api.py
+++ b/odoo/addons/test_new_api/models/test_new_api.py
@@ -742,6 +742,10 @@ class ModelActiveField(models.Model):
active = fields.Boolean(default=True)
parent_id = fields.Many2one('test_new_api.model_active_field')
children_ids = fields.One2many('test_new_api.model_active_field', 'parent_id')
+ all_children_ids = fields.One2many('test_new_api.model_active_field', 'parent_id',
+ context={'active_test': False})
+ active_children_ids = fields.One2many('test_new_api.model_active_field', 'parent_id',
+ context={'active_test': True})
parent_active = fields.Boolean(string='Active Parent', related='parent_id.active', store=True)
diff --git a/odoo/addons/test_new_api/tests/test_new_fields.py b/odoo/addons/test_new_api/tests/test_new_fields.py
index 5600affc125..d476f6b843d 100644
--- a/odoo/addons/test_new_api/tests/test_new_fields.py
+++ b/odoo/addons/test_new_api/tests/test_new_fields.py
@@ -1786,6 +1786,38 @@ class TestX2many(common.TransactionCase):
parent.active = False
self.assertFalse(child4.parent_active)
+ def test_12_active_test_one2many_with_context(self):
+ Model = self.env['test_new_api.model_active_field']
+ parent = Model.create({})
+ all_children = Model.create([
+ {'parent_id': parent.id, 'active': True},
+ {'parent_id': parent.id, 'active': False},
+ ])
+ act_children = all_children[0]
+
+ self.assertEqual(parent.children_ids, act_children)
+ self.assertEqual(parent.with_context(active_test=True).children_ids, act_children)
+ self.assertEqual(parent.with_context(active_test=False).children_ids, all_children)
+
+ self.assertEqual(parent.all_children_ids, all_children)
+ self.assertEqual(parent.with_context(active_test=True).all_children_ids, all_children)
+ self.assertEqual(parent.with_context(active_test=False).all_children_ids, all_children)
+
+ self.assertEqual(parent.active_children_ids, act_children)
+ self.assertEqual(parent.with_context(active_test=True).active_children_ids, act_children)
+ self.assertEqual(parent.with_context(active_test=False).active_children_ids, act_children)
+
+ # check read()
+ self.env.cache.invalidate()
+ self.assertEqual(parent.children_ids, act_children)
+ self.assertEqual(parent.all_children_ids, all_children)
+ self.assertEqual(parent.active_children_ids, act_children)
+
+ self.env.cache.invalidate()
+ self.assertEqual(parent.with_context(active_test=False).children_ids, all_children)
+ self.assertEqual(parent.with_context(active_test=False).all_children_ids, all_children)
+ self.assertEqual(parent.with_context(active_test=False).active_children_ids, act_children)
+
def test_search_many2many(self):
""" Tests search on many2many fields. """
tags = self.env['test_new_api.multi.tag']
diff --git a/odoo/fields.py b/odoo/fields.py
index 13ea1032ad2..449544e2250 100644
--- a/odoo/fields.py
+++ b/odoo/fields.py
@@ -2715,7 +2715,10 @@ class _RelationalMulti(_Relational):
prefetch_ids = IterableGenerator(prefetch_x2many_ids, record, self)
Comodel = record.pool[self.comodel_name]
corecords = Comodel._browse(record.env, value, prefetch_ids)
- if Comodel._active_name and record.env.context.get('active_test', True):
+ if (
+ Comodel._active_name
+ and self.context.get('active_test', record.env.context.get('active_test', True))
+ ):
corecords = corecords.filtered(Comodel._active_name).with_prefetch(prefetch_ids)
return corecords