diff --git a/addons/sale/models/sale.py b/addons/sale/models/sale.py index 82a62b2bf8a..baca5d02acb 100644 --- a/addons/sale/models/sale.py +++ b/addons/sale/models/sale.py @@ -476,31 +476,23 @@ class SaleOrder(models.Model): result = super(SaleOrder, self).create(vals) return result - def _write(self, values): - """ Override of private write method in order to generate activities - based in the invoice status. As the invoice status is a computed field - triggered notably when its lines and linked invoice status changes the - flow does not necessarily goes through write if the action was not done - on the SO itself. We hence override the _write to catch the computation - of invoice_status field. """ - if self.env.context.get('mail_activity_automation_skip'): - return super(SaleOrder, self)._write(values) + def _compute_field_value(self, field): + super()._compute_field_value(field) + if field.name != 'invoice_status' or self.env.context.get('mail_activity_automation_skip'): + return - if 'invoice_status' in values: - if values['invoice_status'] == 'upselling': - filtered_self = self.search([('id', 'in', self.ids), - ('user_id', '!=', False), - ('invoice_status', '!=', 'upselling')]) - filtered_self.activity_unlink(['sale.mail_act_sale_upsell']) - for order in filtered_self: - order.activity_schedule( - 'sale.mail_act_sale_upsell', - user_id=order.user_id.id, - note=_("Upsell %s for customer %s") % ( - order._name, order.id, order.name, - order.partner_id._name, order.partner_id.id, order.partner_id.display_name)) + filtered_self = self.filtered(lambda so: so.user_id and so.invoice_status == 'upselling') + if not filtered_self: + return - return super(SaleOrder, self)._write(values) + filtered_self.activity_unlink(['sale.mail_act_sale_upsell']) + for order in filtered_self: + order.activity_schedule( + 'sale.mail_act_sale_upsell', + user_id=order.user_id.id, + note=_("Upsell %s for customer %s") % ( + order._name, order.id, order.name, + order.partner_id._name, order.partner_id.id, order.partner_id.display_name)) def copy_data(self, default=None): if default is None: