diff options
| -rw-r--r-- | addons/base_automation/models/base_automation.py | 8 | ||||
| -rw-r--r-- | addons/base_automation/tests/test_models.py | 20 |
2 files changed, 20 insertions, 8 deletions
diff --git a/addons/base_automation/models/base_automation.py b/addons/base_automation/models/base_automation.py index 7703fb17f04..37a6998b670 100644 --- a/addons/base_automation/models/base_automation.py +++ b/addons/base_automation/models/base_automation.py @@ -285,9 +285,11 @@ class BaseAutomation(models.Model): # Note: This is to catch updates made by field recomputations. # def _compute_field_value(self, field): - # retrieve the action rules to possibly execute - if not field.store: + # determine fields that may trigger an action + stored_fields = [f for f in self._field_computed[field] if f.store] + if not any(stored_fields): return _compute_field_value.origin(self, field) + # retrieve the action rules to possibly execute actions = self.env['base.automation']._get_actions(self, ['on_write', 'on_create_or_write']) records = self.filtered('id').with_env(actions.env) # check preconditions on records @@ -295,7 +297,7 @@ class BaseAutomation(models.Model): # read old values before the update old_values = { old_vals.pop('id'): old_vals - for old_vals in (records.read([field.name])) + for old_vals in (records.read([f.name for f in stored_fields])) } # call original method _compute_field_value.origin(self, field) diff --git a/addons/base_automation/tests/test_models.py b/addons/base_automation/tests/test_models.py index 38640270960..b2109f3185d 100644 --- a/addons/base_automation/tests/test_models.py +++ b/addons/base_automation/tests/test_models.py @@ -17,20 +17,30 @@ class LeadTest(models.Model): active = fields.Boolean(default=True) partner_id = fields.Many2one('res.partner', string='Partner') date_action_last = fields.Datetime(string='Last Action', readonly=True) - employee = fields.Boolean(related='partner_id.employee', readonly=True, store=True) + employee = fields.Boolean(compute='_compute_employee_deadline', store=True) line_ids = fields.One2many('base.automation.line.test', 'lead_id') priority = fields.Boolean() - deadline = fields.Boolean(compute='_compute_deadline', store=True) + deadline = fields.Boolean(compute='_compute_employee_deadline', store=True) is_assigned_to_admin = fields.Boolean(string='Assigned to admin user') - @api.depends('priority') - def _compute_deadline(self): + @api.depends('partner_id.employee', 'priority') + def _compute_employee_deadline(self): + # this method computes two fields on purpose; don't split it for record in self: + record.employee = record.partner_id.employee if not record.priority: record.deadline = False else: - record.deadline = fields.Datetime.from_string(record.create_date) + relativedelta.relativedelta(days=3) + record.deadline = record.create_date + relativedelta.relativedelta(days=3) + + def write(self, vals): + result = super().write(vals) + # force recomputation of field 'deadline' via 'employee': the action + # based on 'deadline' must be triggered + self.mapped('employee') + return result + class LineTest(models.Model): _name = "base.automation.line.test" |
