diff options
| author | Raphael Collet <rco@odoo.com> | 2020-01-06 15:03:20 +0000 |
|---|---|---|
| committer | Raphael Collet <rco@odoo.com> | 2020-01-07 09:37:11 +0000 |
| commit | 1639b614ebea493aa24d1b0b96541960c494a8a4 (patch) | |
| tree | 0a163cc86ab302871b6b8bdba75a2c315a022b5f | |
| parent | 46da3ea5b9e553bbc724ce9e7981cf0dee9cc648 (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.py | 4 | ||||
| -rw-r--r-- | odoo/addons/test_new_api/tests/test_new_fields.py | 32 | ||||
| -rw-r--r-- | odoo/fields.py | 5 |
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 |
