Browse Source

[8.0][FIX][mail_tracking] Use event recipient address to find partners and contacts to bounce (#133)

pull/147/head
Antonio Espinosa 8 years ago
committed by Pedro M. Baeza
parent
commit
11d594708f
  1. 27
      mail_tracking/models/mail_tracking_email.py
  2. 18
      mail_tracking/models/mail_tracking_event.py
  3. 2
      mail_tracking/models/res_partner.py

27
mail_tracking/models/mail_tracking_email.py

@ -183,12 +183,19 @@ class MailTrackingEmail(models.Model):
'tracking_email_id': self.id, 'tracking_email_id': self.id,
}) })
def _partners_email_bounced_set(self, reason):
for tracking_email in self:
@api.multi
def _partners_email_bounced_set(self, reason, event=None):
recipients = []
if event and event.recipient_address:
recipients.append(event.recipient_address)
else:
recipients = list(filter(None, self.mapped('recipient_address')))
for recipient in recipients:
self.env['res.partner'].search([ self.env['res.partner'].search([
('email', '=ilike', tracking_email.recipient_address)
]).email_bounced_set(tracking_email, reason)
('email', '=ilike', recipient)
]).email_bounced_set(self, reason, event=event)
@api.multi
def smtp_error(self, mail_server, smtp_server, exception): def smtp_error(self, mail_server, smtp_server, exception):
self.sudo().write({ self.sudo().write({
'error_smtp_server': tools.ustr(smtp_server), 'error_smtp_server': tools.ustr(smtp_server),
@ -199,6 +206,7 @@ class MailTrackingEmail(models.Model):
self.sudo()._partners_email_bounced_set('error') self.sudo()._partners_email_bounced_set('error')
return True return True
@api.multi
def tracking_img_add(self, email): def tracking_img_add(self, email):
self.ensure_one() self.ensure_one()
tracking_url = self._get_mail_tracking_img() tracking_url = self._get_mail_tracking_img()
@ -226,6 +234,7 @@ class MailTrackingEmail(models.Model):
}) })
return True return True
@api.multi
def _tracking_sent_prepare(self, mail_server, smtp_server, message, def _tracking_sent_prepare(self, mail_server, smtp_server, message,
message_id): message_id):
self.ensure_one() self.ensure_one()
@ -271,6 +280,7 @@ class MailTrackingEmail(models.Model):
concurrent_event_ids = m_event.search(domain) concurrent_event_ids = m_event.search(domain)
return concurrent_event_ids return concurrent_event_ids
@api.multi
def event_create(self, event_type, metadata): def event_create(self, event_type, metadata):
event_ids = self.env['mail.tracking.event'] event_ids = self.env['mail.tracking.event']
for tracking_email in self: for tracking_email in self:
@ -278,11 +288,14 @@ class MailTrackingEmail(models.Model):
if not other_ids: if not other_ids:
vals = tracking_email._event_prepare(event_type, metadata) vals = tracking_email._event_prepare(event_type, metadata)
if vals: if vals:
event_ids += event_ids.sudo().create(vals)
events = event_ids.sudo().create(vals)
if event_type in {'hard_bounce', 'spam', 'reject'}:
for event in events:
self.sudo()._partners_email_bounced_set(
event_type, event=event)
event_ids += events
else: else:
_logger.debug("Concurrent event '%s' discarded", event_type) _logger.debug("Concurrent event '%s' discarded", event_type)
if event_type in {'hard_bounce', 'spam', 'reject'}:
self.sudo()._partners_email_bounced_set(event_type)
return event_ids return event_ids
@api.model @api.model

18
mail_tracking/models/mail_tracking_event.py

@ -2,6 +2,7 @@
# © 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com> # © 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import re
import time import time
from datetime import datetime from datetime import datetime
@ -16,6 +17,9 @@ class MailTrackingEvent(models.Model):
_description = 'MailTracking event' _description = 'MailTracking event'
recipient = fields.Char(string="Recipient", readonly=True) recipient = fields.Char(string="Recipient", readonly=True)
recipient_address = fields.Char(
string='Recipient email address', readonly=True, store=True,
compute='_compute_recipient_address', index=True)
timestamp = fields.Float( timestamp = fields.Float(
string='UTC timestamp', readonly=True, string='UTC timestamp', readonly=True,
digits=dp.get_precision('MailTracking Timestamp')) digits=dp.get_precision('MailTracking Timestamp'))
@ -51,6 +55,20 @@ class MailTrackingEvent(models.Model):
error_description = fields.Char(string='Error description', readonly=True) error_description = fields.Char(string='Error description', readonly=True)
error_details = fields.Text(string='Error details', readonly=True) error_details = fields.Text(string='Error details', readonly=True)
@api.multi
@api.depends('recipient')
def _compute_recipient_address(self):
for email in self:
if email.recipient:
matches = re.search(r'<(.*@.*)>', email.recipient)
if matches:
email.recipient_address = matches.group(1).lower()
else:
email.recipient_address = email.recipient.lower()
else:
email.recipient_address = False
@api.multi
@api.depends('time') @api.depends('time')
def _compute_date(self): def _compute_date(self):
for email in self: for email in self:

2
mail_tracking/models/res_partner.py

@ -33,7 +33,7 @@ class ResPartner(models.Model):
]) ])
@api.multi @api.multi
def email_bounced_set(self, tracking_email, reason):
def email_bounced_set(self, tracking_emails, reason, event=None):
"""Inherit this method to make any other actions to partners""" """Inherit this method to make any other actions to partners"""
partners = self.filtered(lambda r: not r.email_bounced) partners = self.filtered(lambda r: not r.email_bounced)
return partners.write({'email_bounced': True}) return partners.write({'email_bounced': True})

Loading…
Cancel
Save