[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
This commit is contained in:
Thibault Delavallée
2023-10-06 06:13:53 +00:00
parent a2872cb981
commit 786c2c9e3c
3 changed files with 38 additions and 32 deletions
@@ -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):
@@ -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()
@@ -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': '<p>Hello <t t-out="object.name"/></p>',
'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': '<p>Hello <t t-out="object.name"/></p>',
'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 }} <t t-out="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': '<p>Hello {{ object.name }} <t t-out="object.name"/></p>',
'mailing_model_id': self.env['ir.model']._get('mailing.list').id,
'contact_list_ids': [contact_list.id],
'subject': 'Subject {{ object.name }} <t t-out="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 <t t-out="object.name"/>'
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} <t t-out="object.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,
)