diff options
| author | Raphael Collet <rco@odoo.com> | 2020-12-13 15:27:27 +0000 |
|---|---|---|
| committer | Raphael Collet <rco@odoo.com> | 2020-12-18 14:00:03 +0000 |
| commit | ba4665ce8267b020f6dc81bb7d36875b60f64f66 (patch) | |
| tree | 400a10f07fe5d49be5742cb46a0cc7f4dbccd697 /odoo/addons/test_new_api/tests/test_new_fields.py | |
| parent | ea6952fd7ec881b79a7294c40427ce9966997e66 (diff) | |
[FIX] core: marking and traversing computed fields before modification
This fixes an issue that occurs when marking fields to compute in the
following situation:
- it occurs before the actual modification,
- a relational field is marked to compute,
- the same field is traversed to inverse some dependency.
When the marking occurs after the modification, the traversal of the
field should actually recompute the field. However, if the marking
occurs before the modification, the inversion of dependencies must be
based on the current value of the field. This is the case with method
unlink(): we call method modified() to mark the fields that currently
depend on the records to be deleted, and the fields must be computed
only after the deletion!
X-original-commit: 3a6ac95ddf6a8719aa714a83fc339ba838c3811d
Diffstat (limited to 'odoo/addons/test_new_api/tests/test_new_fields.py')
| -rw-r--r-- | odoo/addons/test_new_api/tests/test_new_fields.py | 52 |
1 files changed, 50 insertions, 2 deletions
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 4c9aaf00f5e..3a95a6c10f2 100644 --- a/odoo/addons/test_new_api/tests/test_new_fields.py +++ b/odoo/addons/test_new_api/tests/test_new_fields.py @@ -447,20 +447,42 @@ class TestFields(TransactionCaseWithUserDemo): b = self.env['test_new_api.recursive'].create({'name': 'B', 'parent': a.id}) c = self.env['test_new_api.recursive'].create({'name': 'C', 'parent': b.id}) d = self.env['test_new_api.recursive'].create({'name': 'D', 'parent': c.id}) + self.assertEqual(a.full_name, 'A') + self.assertEqual(b.full_name, 'A / B') + self.assertEqual(c.full_name, 'A / B / C') + self.assertEqual(d.full_name, 'A / B / C / D') self.assertEqual(a.display_name, 'A') self.assertEqual(b.display_name, 'A / B') self.assertEqual(c.display_name, 'A / B / C') self.assertEqual(d.display_name, 'A / B / C / D') + a.name = 'A1' + self.assertEqual(a.full_name, 'A1') + self.assertEqual(b.full_name, 'A1 / B') + self.assertEqual(c.full_name, 'A1 / B / C') + self.assertEqual(d.full_name, 'A1 / B / C / D') + self.assertEqual(a.display_name, 'A1') + self.assertEqual(b.display_name, 'A1 / B') + self.assertEqual(c.display_name, 'A1 / B / C') + self.assertEqual(d.display_name, 'A1 / B / C / D') + b.parent = False - self.assertEqual(a.display_name, 'A') + self.assertEqual(a.full_name, 'A1') + self.assertEqual(b.full_name, 'B') + self.assertEqual(c.full_name, 'B / C') + self.assertEqual(d.full_name, 'B / C / D') + self.assertEqual(a.display_name, 'A1') self.assertEqual(b.display_name, 'B') self.assertEqual(c.display_name, 'B / C') self.assertEqual(d.display_name, 'B / C / D') # rename several records to trigger several recomputations at once (d + c + b).write({'name': 'X'}) - self.assertEqual(a.display_name, 'A') + self.assertEqual(a.full_name, 'A1') + self.assertEqual(b.full_name, 'X') + self.assertEqual(c.full_name, 'X / X') + self.assertEqual(d.full_name, 'X / X / X') + self.assertEqual(a.display_name, 'A1') self.assertEqual(b.display_name, 'X') self.assertEqual(c.display_name, 'X / X') self.assertEqual(d.display_name, 'X / X / X') @@ -1138,6 +1160,32 @@ class TestFields(TransactionCaseWithUserDemo): self.assertEqual(bar.foo, oof) self.assertIn(bar, bar.search([('foo', 'in', oof.ids)])) + def test_25_one2many_inverse_related(self): + left = self.env['test_new_api.trigger.left'].create({}) + right = self.env['test_new_api.trigger.right'].create({}) + self.assertFalse(left.right_id) + self.assertFalse(right.left_ids) + self.assertFalse(right.left_size) + + # create middle: this should trigger left.right_id by traversing + # middle.left_id, and right.left_size by traversing left.right_id + # after its computation! + middle = self.env['test_new_api.trigger.middle'].create({ + 'left_id': left.id, + 'right_id': right.id, + }) + self.assertEqual(left.right_id, right) + self.assertEqual(right.left_ids, left) + self.assertEqual(right.left_size, 1) + + # delete middle: this should trigger left.right_id by traversing + # middle.left_id, and right.left_size by traversing left.right_id + # before its computation! + middle.unlink() + self.assertFalse(left.right_id) + self.assertFalse(right.left_ids) + self.assertFalse(right.left_size) + def test_26_inherited(self): """ test inherited fields. """ # a bunch of fields are inherited from res_partner |
