From 786c2c9e3c1df72017324d69d4309bee425ac62d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Tue, 30 May 2023 13:57:27 +0200 Subject: [PATCH] [IMP] mass_mailing: improve contact order Use name instead of email, as contact is notably used in sms marketing application with mainly phone numbers. Better use the name as primary ordering field. Then use ID to avoid non deterministic behavior. This requires to fix some tests in 'test_mass_mailing' so that they use test models instead of existing models. That way they are not dependent on existing data and existing models definition anymore. An issue with ordering rose as we modified the ordering of contact model. Task-2150462 (Mass Mailing: Improve subscription management) Part-of: odoo/odoo#86084 --- addons/mass_mailing/models/mailing_contact.py | 2 +- .../models/mailing_models.py | 1 + .../tests/test_mailing_test.py | 67 ++++++++++--------- 3 files changed, 38 insertions(+), 32 deletions(-) diff --git a/addons/mass_mailing/models/mailing_contact.py b/addons/mass_mailing/models/mailing_contact.py index bde7c2c057c..404fa4de43d 100644 --- a/addons/mass_mailing/models/mailing_contact.py +++ b/addons/mass_mailing/models/mailing_contact.py @@ -14,7 +14,7 @@ class MassMailingContact(models.Model): _name = 'mailing.contact' _inherit = ['mail.thread.blacklist'] _description = 'Mailing Contact' - _order = 'email' + _order = 'name ASC, id DESC' _mailing_enabled = True def default_get(self, fields_list): diff --git a/addons/test_mass_mailing/models/mailing_models.py b/addons/test_mass_mailing/models/mailing_models.py index e6ed803c4ba..eca2ecb18f5 100644 --- a/addons/test_mass_mailing/models/mailing_models.py +++ b/addons/test_mass_mailing/models/mailing_models.py @@ -61,6 +61,7 @@ class MailingBLacklist(models.Model): _description = 'Mailing Blacklist Enabled' _name = 'mailing.test.blacklist' _inherit = ['mail.thread.blacklist'] + _order = 'name ASC, id DESC' _primary_email = 'email_from' name = fields.Char() diff --git a/addons/test_mass_mailing/tests/test_mailing_test.py b/addons/test_mass_mailing/tests/test_mailing_test.py index 5e0d8ac149a..7aa6e6ed7d4 100644 --- a/addons/test_mass_mailing/tests/test_mailing_test.py +++ b/addons/test_mass_mailing/tests/test_mailing_test.py @@ -11,18 +11,31 @@ from odoo.tools import mute_logger @tagged('mailing_manage') class TestMailingTest(TestMassMailCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.test_records = cls.env['mailing.test.blacklist'].create([ + { + 'email_from': f'test.mailing.{idx}@test.example.com', + 'name': f'Test Mailing {idx}', + 'user_id': cls.user_marketing.id, + } + for idx in range(5) + ]) + cls.test_mailing_bl = cls.env['mailing.mailing'].create({ + 'body_html': '

Hello

', + 'mailing_domain': [('id', 'in', cls.test_records.ids)], + 'mailing_model_id': cls.env['ir.model']._get_id('mailing.test.blacklist'), + 'mailing_type': 'mail', + 'name': 'TestButton', + 'preview': 'Preview {{ object.name }}', + 'subject': 'Subject {{ object.name }}', + }) + @users('user_marketing') @mute_logger('odoo.addons.mail.models.mail_render_mixin') def test_mailing_test_button(self): - mailing = self.env['mailing.mailing'].create({ - 'name': 'TestButton', - 'subject': 'Subject {{ object.name }}', - 'preview': 'Preview {{ object.name }}', - 'state': 'draft', - 'mailing_type': 'mail', - 'body_html': '

Hello

', - 'mailing_model_id': self.env['ir.model']._get('res.partner').id, - }) + mailing = self.test_mailing_bl.with_env(self.env) mailing_test = self.env['mailing.mailing.test'].create({ 'email_to': 'test@test.com', 'mass_mailing_id': mailing.id, @@ -63,25 +76,12 @@ class TestMailingTest(TestMassMailCommon): mailing_test.send_mail_test() def test_mailing_test_equals_reality(self): - """ - Check that both test and real emails will format the qweb and inline placeholders correctly in body and subject. - """ - contact_list = self.env['mailing.list'].create({ - 'name': 'Testers', - 'contact_ids': [Command.create({ - 'name': 'Mitchell Admin', - 'email': 'real@real.com', - })], - }) - - mailing = self.env['mailing.mailing'].create({ - 'name': 'TestButton', - 'subject': 'Subject {{ object.name }} ', - 'state': 'draft', - 'mailing_type': 'mail', + """ Check that both test and real emails will format the qweb and inline + placeholders correctly in body and subject. """ + mailing = self.test_mailing_bl.with_env(self.env) + mailing.write({ 'body_html': '

Hello {{ object.name }}

', - 'mailing_model_id': self.env['ir.model']._get('mailing.list').id, - 'contact_list_ids': [contact_list.id], + 'subject': 'Subject {{ object.name }} ', }) mailing_test = self.env['mailing.mailing.test'].create({ 'email_to': 'test@test.com', @@ -91,8 +91,10 @@ class TestMailingTest(TestMassMailCommon): with self.mock_mail_gateway(): mailing_test.send_mail_test() - expected_subject = 'Subject Mitchell Admin ' - expected_body = 'Hello {{ object.name }} Mitchell Admin' + expected_test_record = self.env[mailing.mailing_model_real].search([], limit=1) + self.assertEqual(expected_test_record, self.test_records[0], 'Should take first found one') + expected_subject = f'Subject {expected_test_record.name} ' + expected_body = 'Hello {{ object.name }}' + f' {expected_test_record.name}' self.assertSentEmail(self.env.user.partner_id, ['test@test.com'], subject=expected_subject, @@ -103,6 +105,9 @@ class TestMailingTest(TestMassMailCommon): mailing.action_launch() self.env.ref('mass_mailing.ir_cron_mass_mailing_queue').method_direct_trigger() - self.assertSentEmail(self.env.user.partner_id, ['real@real.com'], + self.assertSentEmail( + self.env.user.partner_id, + [expected_test_record.email_from], subject=expected_subject, - body_content=expected_body) + body_content=expected_body, + )