[FIX] mass_mailing: fix tracking link creation in mass mailing

When using only mass mailing two issues arise when trying to send mass
mailings containing links

 * a link.tracker is created for each link to shorten; however rights are
   given currently only in website_links for website designers and not to
   marketing users that use mass mailing. This commit adds the rights for
   link.tracker model to those people;
 * a link.tracker.code is created to hold the shortened versions of the
   links. As it is a technical model it is now done as superuser as rights
   on link.tracked model has already been granted and adding rights on such
   a technical model is not necessary;

A test is added that checks what is done with links when sending mass
mailings. It helped spotting the hereabove issue.

This commit is linked to task ID 1889703 and PR #27526.
This commit is contained in:
Thibault Delavallée
2018-10-18 13:57:02 +00:00
parent 7edcbfec38
commit dcec209805
3 changed files with 66 additions and 4 deletions
+1 -1
View File
@@ -185,7 +185,7 @@ class link_tracker(models.Model):
link = super(link_tracker, self).create(create_vals)
code = self.env['link.tracker.code'].get_random_code_string()
self.env['link.tracker.code'].create({'code': code, 'link_id': link.id})
self.env['link.tracker.code'].sudo().create({'code': code, 'link_id': link.id})
return link
@@ -14,3 +14,4 @@ access_utm_source,access_utm_source,utm.model_utm_source,mass_mailing.group_mass
access_ir_mail_server,access_ir_mail_server,base.model_ir_mail_server,mass_mailing.group_mass_mailing_user,1,0,0,0
access_mail_blacklist_mass_mailing_user,access.mail.blacklist.mass_mailing_user,mail.model_mail_blacklist,mass_mailing.group_mass_mailing_user,1,1,1,1
access_mail_mass_mailing_list_contact_rel,access.mail.mass_mailing_list_contact_rel,model_mail_mass_mailing_list_contact_rel,mass_mailing.group_mass_mailing_user,1,1,1,1
access_link_tracker_mailing,access.link.tracker.mailing,link_tracker.model_link_tracker,mass_mailing.group_mass_mailing_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
14 access_ir_mail_server access_ir_mail_server base.model_ir_mail_server mass_mailing.group_mass_mailing_user 1 0 0 0
15 access_mail_blacklist_mass_mailing_user access.mail.blacklist.mass_mailing_user mail.model_mail_blacklist mass_mailing.group_mass_mailing_user 1 1 1 1
16 access_mail_mass_mailing_list_contact_rel access.mail.mass_mailing_list_contact_rel model_mail_mass_mailing_list_contact_rel mass_mailing.group_mass_mailing_user 1 1 1 1
17 access_link_tracker_mailing access.link.tracker.mailing link_tracker.model_link_tracker mass_mailing.group_mass_mailing_user 1 1 1 1
@@ -1,9 +1,70 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.tests import common
from unittest.mock import patch
from werkzeug import urls
from odoo.addons.test_mass_mailing.tests.common import MassMailingCase
from odoo.addons.base.models.ir_config_parameter import IrConfigParameter
from odoo.tests.common import TransactionCase, users
from odoo.tools import mute_logger
class TestAccessRights(common.TransactionCase):
class TestMassMail(MassMailingCase):
def setUp(self):
""" In this setup we prepare 20 blacklist entries. We therefore add
20 recipients compared to first test in order to have comparable results. """
super(TestMassMail, self).setUp()
values = [{
'name': 'Recipient %s' % x,
'email_from': 'Recipient <rec.%s@example.com>' % x,
} for x in range(0, 6)]
self.mm_recs = self.env['mass.mail.test.bl'].create(values)
self.env['mail.blacklist'].create({
'email': 'rec.2@example.com'
})
self.test_medium = self.env['utm.medium'].create({'name': 'TestMedium'})
@users('marketing')
@mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.models.unlink')
def test_link_tracker(self):
_url = 'https://www.example.com/foo/bar?baz=qux'
mailing = self.env['mail.mass_mailing'].create({
'name': 'TestMailing',
'medium_id': self.test_medium.id,
'body_html': '<p>Hello <a role="button" href="%s">${object.name}</a><a role="button" href="/unsubscribe_from_list">Unsubscribe</a></p>' % _url,
'reply_to_mode': 'email',
'mailing_model_id': self.ref('test_mass_mailing.model_mass_mail_test_bl'),
'mailing_domain': [('id', 'in', self.mm_recs.ids)],
})
mailing.send_mail()
# basic test emails are sent
self.assertEqual(mailing.sent, 5)
self.assertEqual(mailing.delivered, 5)
# link trackers
links = self.env['link.tracker'].sudo().search([('mass_mailing_id', '=', mailing.id)])
self.assertEqual(len(links), 1)
self.assertEqual(links.mapped('url'), [_url])
# check UTMS are correctly set on redirect URL
redirect_url = urls.url_parse(links.redirected_url)
redirect_params = redirect_url.decode_query().to_dict(flat=True)
self.assertEqual(redirect_url.scheme, 'https')
self.assertEqual(redirect_url.decode_netloc(), 'www.example.com')
self.assertEqual(redirect_url.path, '/foo/bar')
self.assertEqual(redirect_params, {
'utm_source': mailing.name,
'utm_medium': self.test_medium.name,
'baz': 'qux',
})
class TestAccessRights(TransactionCase):
def test_01_mass_mail_blacklist(self):
mass_mailing_contacts = self.env['mail.mass_mailing.contact']
@@ -204,7 +265,7 @@ class TestAccessRights(common.TransactionCase):
'Opt Out ignored email number incorrect, should be equals to 1')
class TestOnResPartner(common.TransactionCase):
class TestOnResPartner(TransactionCase):
def test_mass_mail_on_res_partner(self):
partners = self.env['res.partner']