diff --git a/mail_tracking_mailgun/models/mail_tracking_email.py b/mail_tracking_mailgun/models/mail_tracking_email.py index 77ec2db053..a81503a3d7 100644 --- a/mail_tracking_mailgun/models/mail_tracking_email.py +++ b/mail_tracking_mailgun/models/mail_tracking_email.py @@ -32,10 +32,16 @@ def _mailgun_mandatory_fields(self): return ('event', 'timestamp', 'token', 'signature', 'tracking_email_id', 'odoo_db') - @property - def _mailgun_event_type_mapping(self): - return { - # Mailgun event type: tracking event type + @api.model + def _mailgun_event2state(self, event, default="UNKNOWN"): + """Return the ``mail_tracking`` equivalent event + + Args: + event: Mailgun event response from API. + default: Value to return when not found. + """ + # Mailgun event type: tracking event type + equivalents = { 'delivered': 'delivered', 'opened': 'open', 'clicked': 'click', @@ -44,14 +50,17 @@ def _mailgun_event_type_mapping(self): 'bounced': 'hard_bounce', 'dropped': 'reject', 'accepted': 'sent', - 'failed': 'error', - 'rejected': 'error', + "failed": ( + "hard_bounce" if event.get("severity") == "permanent" else "soft_bounce" + ), + "rejected": "reject", } + return equivalents.get(event.get("event"), default) def _mailgun_event_type_verify(self, event): event = event or {} mailgun_event_type = event.get('event') - if mailgun_event_type not in self._mailgun_event_type_mapping: + if self._mailgun_event2state(event) == "UNKNOWN": _logger.error("Mailgun: event type '%s' not supported", mailgun_event_type) return False @@ -194,8 +203,7 @@ def event_process(self, request, post, metadata, event_type=None): res = 'OK' if res == 'OK': mailgun_event_type = post.get('event') - mapped_event_type = self._mailgun_event_type_mapping.get( - mailgun_event_type) or event_type + mapped_event_type = self._mailgun_event2state(post, event_type) if not mapped_event_type: # pragma: no cover res = 'ERROR: Bad event' tracking = self._mailgun_tracking_get(post) @@ -251,8 +259,9 @@ def action_manual_check_mailgun(self): [('mailgun_id', '=', item["id"])]) and ( item.get("recipient", "") == email_split(tracking.recipient)[0]): - mapped_event_type = self._mailgun_event_type_mapping.get( - item["event"], item["event"]) + mapped_event_type = self._mailgun_event2state( + item, item["event"] + ) metadata = self._mailgun_metadata( mapped_event_type, item, {}) tracking.event_create(mapped_event_type, metadata)