From dcec209805e58208eda50eb929b5355bc28fc05b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 18 Oct 2018 10:51:09 +0000 Subject: [PATCH] [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. --- addons/link_tracker/models/link_tracker.py | 2 +- .../mass_mailing/security/ir.model.access.csv | 1 + .../tests/test_mass_mailing.py | 67 ++++++++++++++++++- 3 files changed, 66 insertions(+), 4 deletions(-) diff --git a/addons/link_tracker/models/link_tracker.py b/addons/link_tracker/models/link_tracker.py index 584894b4322..ae52a6966f2 100644 --- a/addons/link_tracker/models/link_tracker.py +++ b/addons/link_tracker/models/link_tracker.py @@ -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 diff --git a/addons/mass_mailing/security/ir.model.access.csv b/addons/mass_mailing/security/ir.model.access.csv index b33aa24d9f7..7e3887ea576 100644 --- a/addons/mass_mailing/security/ir.model.access.csv +++ b/addons/mass_mailing/security/ir.model.access.csv @@ -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 \ No newline at end of file diff --git a/addons/test_mass_mailing/tests/test_mass_mailing.py b/addons/test_mass_mailing/tests/test_mass_mailing.py index 8a8a2303317..6629be54f9f 100644 --- a/addons/test_mass_mailing/tests/test_mass_mailing.py +++ b/addons/test_mass_mailing/tests/test_mass_mailing.py @@ -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 ' % 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': '

Hello ${object.name}Unsubscribe

' % _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']