[FIX] mass_mailing: the blank.gif image in the emails always raise a 500 error

Bug
===
Since 6185f14807 we check the <mail.mail>
existence before marking the <mailing.trace> as opened, but since
57ae1b9b8b61f5f4719a8a81e9d0d21fab58cfda we remove the <mail.mail>
automatically when we send them.

The result is that this endpoint always raise a 500 error.

To be: the <mail.mail> existence shouldn't be checked in this endpoint
(the token is valid for the raw integer id).

Task-3234519

closes odoo/odoo#115842

Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
This commit is contained in:
std-odoo
2023-03-21 10:44:40 +01:00
parent 7fbfb36285
commit eae1a0a7ab
3 changed files with 13 additions and 10 deletions
+2 -2
View File
@@ -118,8 +118,8 @@ class MassMailController(http.Controller):
@http.route('/mail/track/<int:mail_id>/<string:token>/blank.gif', type='http', auth='public')
def track_mail_open(self, mail_id, token, **post):
""" Email tracking. """
mail = request.env['mail.mail'].sudo().browse(mail_id).exists()
if not mail or not consteq(token, mail._generate_mail_recipient_token()):
expected_token = request.env['mail.mail']._generate_mail_recipient_token(mail_id)
if not consteq(token, expected_token):
raise BadRequest()
request.env['mailing.trace'].sudo().set_opened(domain=[('mail_mail_id_int', 'in', [mail_id])])
+4 -4
View File
@@ -25,15 +25,15 @@ class MailMail(models.Model):
return mails
def _get_tracking_url(self):
token = self._generate_mail_recipient_token()
token = self._generate_mail_recipient_token(self.id)
return werkzeug.urls.url_join(
self.get_base_url(),
f'mail/track/{self.id}/{token}/blank.gif'
)
def _generate_mail_recipient_token(self):
self.ensure_one()
return tools.hmac(self.env(su=True), 'mass_mailing-mail_mail-open', self.id)
@api.model
def _generate_mail_recipient_token(self, mail_id):
return tools.hmac(self.env(su=True), 'mass_mailing-mail_mail-open', mail_id)
def _prepare_outgoing_body(self):
""" Override to add the tracking URL to the body and to add trace ID in
@@ -73,22 +73,25 @@ class TestMailingControllers(MassMailCommon, HttpCase):
mailing.action_send_mail()
mail = self._find_mail_mail_wrecord(self.test_contact)
mail_id_int = mail.id
mail_tracking_url = mail._get_tracking_url()
mailing_trace = mail.mailing_trace_ids
self.assertEqual(mail.state, 'sent')
self.assertEqual(len(mailing_trace), 1)
self.assertFalse(mailing_trace.open_datetime)
self.assertEqual(mailing_trace.trace_status, 'sent')
mail.unlink() # the mail might be removed during the email sending
self.env.flush_all()
with freeze_time(self._reference_now):
response = self.url_open(mail._get_tracking_url())
response = self.url_open(mail_tracking_url)
self.assertEqual(response.status_code, 200)
self.assertEqual(mail.state, 'sent')
self.assertEqual(mailing_trace.open_datetime, self._reference_now)
self.assertEqual(mailing_trace.trace_status, 'open')
track_url = werkzeug.urls.url_join(
mail.get_base_url(),
'mail/track/%s/fake_token/blank.gif' % mail.id
mailing.get_base_url(),
f'mail/track/{mail_id_int}/fake_token/blank.gif'
)
response = self.url_open(track_url)
self.assertEqual(response.status_code, 400)