From 4b1cb41cf7a3f936a1e6d00a2bb6a6a29e82d711 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Mon, 23 Sep 2019 13:41:18 +0000 Subject: [FIX] models, fields: cache consistency for one2many fields Issue: after many2one updates, the cache of the corresponding one2many fields was inconsistent when the latter depends on `active_test`. One of the values in cache was updated, while the other was left intact. We simplify the cache by not making the field depend on context: the cache value contains all the records in the relation (corresponding to `active_test=False`). The value of the field is automatically filtered by the `active` field when the value is accessed. This makes it easier to maintain the cache value, guarantees its consistency, and avoids queries to read the one2many field with `active_test=False`, after having set it with `active_test=True`. --- odoo/addons/test_new_api/tests/test_new_fields.py | 44 +++++++++++++++++++++++ 1 file changed, 44 insertions(+) (limited to 'odoo/addons/test_new_api/tests/test_new_fields.py') 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 845d5f4e960..7bc2ae547a3 100644 --- a/odoo/addons/test_new_api/tests/test_new_fields.py +++ b/odoo/addons/test_new_api/tests/test_new_fields.py @@ -1539,6 +1539,50 @@ class TestX2many(common.TransactionCase): record_a.unlink() self.assertFalse(record_a.exists()) + def test_12_active_test_one2many(self): + Model = self.env['test_new_api.model_active_field'] + + parent = Model.create({}) + self.assertFalse(parent.children_ids) + + # create with implicit active_test=True in context + child1, child2 = Model.create([ + {'parent_id': parent.id, 'active': True}, + {'parent_id': parent.id, 'active': False}, + ]) + act_children = child1 + all_children = child1 + child2 + 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) + + # create with active_test=False in context + child3, child4 = Model.with_context(active_test=False).create([ + {'parent_id': parent.id, 'active': True}, + {'parent_id': parent.id, 'active': False}, + ]) + act_children = child1 + child3 + all_children = child1 + child2 + child3 + child4 + 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) + + # replace active children + parent.write({'children_ids': [(6, 0, [child1.id])]}) + act_children = child1 + all_children = child1 + child2 + child4 + 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) + + # replace all children + parent.with_context(active_test=False).write({'children_ids': [(6, 0, [child1.id])]}) + act_children = child1 + all_children = child1 + 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) + def test_search_many2many(self): """ Tests search on many2many fields. """ tags = self.env['test_new_api.multi.tag'] -- cgit v1.2.3