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/models/test_new_api.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/models/test_new_api.py')
| -rw-r--r-- | odoo/addons/test_new_api/models/test_new_api.py | 42 |
1 files changed, 40 insertions, 2 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 e8c868f212f..bfe9b2fcee9 100644 --- a/odoo/addons/test_new_api/models/test_new_api.py +++ b/odoo/addons/test_new_api/models/test_new_api.py @@ -493,8 +493,17 @@ class ComputeRecursive(models.Model): name = fields.Char(required=True) parent = fields.Many2one('test_new_api.recursive', ondelete='cascade') + full_name = fields.Char(compute='_compute_full_name') display_name = fields.Char(compute='_compute_display_name', store=True) + @api.depends('name', 'parent.full_name') + def _compute_full_name(self): + for rec in self: + if rec.parent: + rec.full_name = rec.parent.full_name + " / " + rec.name + else: + rec.full_name = rec.name + @api.depends('name', 'parent.display_name') def _compute_display_name(self): for rec in self: @@ -787,7 +796,7 @@ class Attachment(models.Model): rec.name = self.env[rec.res_model].browse(rec.res_id).display_name # DLE P55: `test_cache_invalidation` - def modified(self, fnames, create=False): + def modified(self, fnames, *args, **kwargs): if not self: return comodel = self.env[self.res_model] @@ -796,7 +805,7 @@ class Attachment(models.Model): record = comodel.browse(self.res_id) self.env.cache.invalidate([(field, record._ids)]) record.modified(['attachment_ids']) - return super(Attachment, self).modified(fnames, create) + return super(Attachment, self).modified(fnames, *args, **kwargs) class AttachmentHost(models.Model): @@ -1184,3 +1193,32 @@ class ComputeEditableLine(models.Model): def _compute_edit(self): for line in self: line.edit = line.value + + +class TriggerLeft(models.Model): + _name = 'test_new_api.trigger.left' + _description = 'model with a related many2one' + + middle_ids = fields.One2many('test_new_api.trigger.middle', 'left_id') + right_id = fields.Many2one(related='middle_ids.right_id', store=True) + + +class TriggerMiddle(models.Model): + _name = 'test_new_api.trigger.middle' + _description = 'model linking test_new_api.trigger.left and test_new_api.trigger.right' + + left_id = fields.Many2one('test_new_api.trigger.left', required=True) + right_id = fields.Many2one('test_new_api.trigger.right', required=True) + + +class TriggerRight(models.Model): + _name = 'test_new_api.trigger.right' + _description = 'model with a dependency on the inverse of the related many2one' + + left_ids = fields.One2many('test_new_api.trigger.left', 'right_id') + left_size = fields.Integer(compute='_compute_left_size', store=True) + + @api.depends('left_ids') + def _compute_left_size(self): + for record in self: + record.left_size = len(record.left_ids) |
