State field on trace model is computed based on other (datetime) fields. It seems therefore unnecessary to force its value. LINKS Prepares task ID 2238597 (notification and trace models cleaning) Task ID 1906925 (mass mailing tests cleaning) PR #50169
96 lines
4.5 KiB
Python
96 lines
4.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
import re
|
|
import werkzeug.urls
|
|
|
|
from odoo import api, fields, models, tools
|
|
|
|
|
|
class MailMail(models.Model):
|
|
"""Add the mass mailing campaign data to mail"""
|
|
_inherit = ['mail.mail']
|
|
|
|
mailing_id = fields.Many2one('mailing.mailing', string='Mass Mailing')
|
|
mailing_trace_ids = fields.One2many('mailing.trace', 'mail_mail_id', string='Statistics')
|
|
|
|
@api.model_create_multi
|
|
def create(self, values_list):
|
|
""" Override mail_mail creation to create an entry in mail.mail.statistics """
|
|
# TDE note: should be after 'all values computed', to have values (FIXME after merging other branch holding create refactoring)
|
|
mails = super(MailMail, self).create(values_list)
|
|
for mail, values in zip(mails, values_list):
|
|
if values.get('mailing_trace_ids'):
|
|
mail.mailing_trace_ids.write({'message_id': mail.message_id})
|
|
return mails
|
|
|
|
def _get_tracking_url(self):
|
|
base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
|
|
track_url = werkzeug.urls.url_join(base_url, 'mail/track/%s/blank.gif' % self.id)
|
|
return '<img src="%s" alt=""/>' % track_url
|
|
|
|
def _get_unsubscribe_url(self, email_to):
|
|
base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
|
|
url = werkzeug.urls.url_join(
|
|
base_url, 'mail/mailing/%(mailing_id)s/unsubscribe?%(params)s' % {
|
|
'mailing_id': self.mailing_id.id,
|
|
'params': werkzeug.urls.url_encode({
|
|
'res_id': self.res_id,
|
|
'email': email_to,
|
|
'token': self.mailing_id._unsubscribe_token(
|
|
self.res_id, email_to),
|
|
}),
|
|
}
|
|
)
|
|
return url
|
|
|
|
def _send_prepare_body(self):
|
|
""" Override to add the tracking URL to the body and to add
|
|
trace ID in shortened urls """
|
|
# TDE: temporary addition (mail was parameter) due to semi-new-API
|
|
self.ensure_one()
|
|
body = super(MailMail, self)._send_prepare_body()
|
|
|
|
if self.mailing_id and body and self.mailing_trace_ids:
|
|
for match in re.findall(tools.URL_REGEX, self.body_html):
|
|
href = match[0]
|
|
url = match[1]
|
|
|
|
parsed = werkzeug.urls.url_parse(url, scheme='http')
|
|
|
|
if parsed.scheme.startswith('http') and parsed.path.startswith('/r/'):
|
|
new_href = href.replace(url, url + '/m/' + str(self.mailing_trace_ids[0].id))
|
|
body = body.replace(href, new_href)
|
|
|
|
# generate tracking URL
|
|
tracking_url = self._get_tracking_url()
|
|
if tracking_url:
|
|
body = tools.append_content_to_html(body, tracking_url, plaintext=False, container_tag='div')
|
|
|
|
body = self.env['mail.render.mixin']._replace_local_links(body)
|
|
|
|
return body
|
|
|
|
def _send_prepare_values(self, partner=None):
|
|
# TDE: temporary addition (mail was parameter) due to semi-new-API
|
|
res = super(MailMail, self)._send_prepare_values(partner)
|
|
base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url').rstrip('/')
|
|
if self.mailing_id and res.get('body') and res.get('email_to'):
|
|
emails = tools.email_split(res.get('email_to')[0])
|
|
email_to = emails and emails[0] or False
|
|
unsubscribe_url = self._get_unsubscribe_url(email_to)
|
|
link_to_replace = base_url + '/unsubscribe_from_list'
|
|
if link_to_replace in res['body']:
|
|
res['body'] = res['body'].replace(link_to_replace, unsubscribe_url if unsubscribe_url else '#')
|
|
return res
|
|
|
|
def _postprocess_sent_message(self, success_pids, failure_reason=False, failure_type=None):
|
|
mail_sent = not failure_type # we consider that a recipient error is a failure with mass mailling and show them as failed
|
|
for mail in self:
|
|
if mail.mailing_id:
|
|
if mail_sent is True and mail.mailing_trace_ids:
|
|
mail.mailing_trace_ids.write({'sent': fields.Datetime.now(), 'exception': False})
|
|
elif mail_sent is False and mail.mailing_trace_ids:
|
|
mail.mailing_trace_ids.write({'exception': fields.Datetime.now(), 'failure_type': failure_type})
|
|
return super(MailMail, self)._postprocess_sent_message(success_pids, failure_reason=failure_reason, failure_type=failure_type)
|