diff --git a/mail_tracking/__manifest__.py b/mail_tracking/__manifest__.py index 7ea169ad..80f71809 100644 --- a/mail_tracking/__manifest__.py +++ b/mail_tracking/__manifest__.py @@ -1,12 +1,13 @@ # Copyright 2016 Antonio Espinosa - # Copyright 2018 David Vidal - # Copyright 2018 Tecnativa - Ernesto Tejeda +# Copyright 2019 Tecnativa - Pedro M. Baeza # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { "name": "Email tracking", "summary": "Email tracking system for all mails sent", - "version": "12.0.1.0.0", + "version": "12.0.1.0.1", "category": "Social Network", "website": "http://github.com/OCA/social", "author": "Tecnativa, " diff --git a/mail_tracking/models/mail_bounced_mixin.py b/mail_tracking/models/mail_bounced_mixin.py index d84069cd..9f26507b 100644 --- a/mail_tracking/models/mail_bounced_mixin.py +++ b/mail_tracking/models/mail_bounced_mixin.py @@ -24,20 +24,25 @@ class MailBouncedMixin(models.AbstractModel): def email_bounced_set(self, tracking_emails, reason, event=None): """Inherit this method to make any other actions to the model that inherit the mixin""" + if self.env.context.get('write_loop'): + # We avoid with the context an infinite recursion calling write + # method from other write method. + return True partners = self.filtered(lambda r: not r.email_bounced) return partners.write({'email_bounced': True}) def write(self, vals): [email_field] = self._primary_email if email_field not in vals: - return super(MailBouncedMixin, self).write(vals) + return super().write(vals) email = vals[email_field].lower() if vals[email_field] else False mte_obj = self.env['mail.tracking.email'] - if not mte_obj.email_is_bounced(email): - vals['email_bounced'] = False - return super(MailBouncedMixin, self).write(vals) - res = mte_obj._email_last_tracking_state(email) - tracking = mte_obj.browse(res[0].get('id')) - event = tracking.tracking_event_ids[:1] - self.email_bounced_set(tracking, event.error_details, event) - return super(MailBouncedMixin, self).write(vals) + vals['email_bounced'] = mte_obj.email_is_bounced(email) + if vals['email_bounced']: + res = mte_obj._email_last_tracking_state(email) + tracking = mte_obj.browse(res[0].get('id')) + event = tracking.tracking_event_ids[:1] + self.with_context( + write_loop=True, + ).email_bounced_set(tracking, event.error_details, event) + return super().write(vals)