[FIX] {test_}mass_mailing: exclude 'cancel' traces from ratio

ISSUE
=====

clicks_ratio uses a formula that is not relevant as it accounts
for emails that could not lead to a click. It divides the
number of clicks by the total of expected emails instead of
substracting cancelled ones.

HOW TO REPRODUCE
================

1. Create a mailing M
2. Create a mailing list of 5 contacts with same email adress
3. Create a link tracker associated to M
4. Send -> 4 emails will be canceled as same email is used
5. Click the link.
6. Ratio of 'clicked' on the mailing view  will be 20%
instead of 100%

FIX
===

Only use mailing traces where trace status is not 'cancelled';
aligning the formula to other stats set in _compute_statistics.
The formula becomes:

CR = # clicks / (# total_traces - # cancel_traces)

A test on statistics is modified to check this behavior.

Task-3607171

closes odoo/odoo#148551

X-original-commit: 5dc7c6102f1d23ffa02d3b6aff3c518204fb4566
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
This commit is contained in:
Noe Antoine
2024-01-10 06:12:31 +00:00
parent 4a5b93994c
commit 3dd8d8d329
2 changed files with 5 additions and 1 deletions
+1
View File
@@ -289,6 +289,7 @@ class MassMailing(models.Model):
FROM mailing_trace AS stats
LEFT OUTER JOIN link_tracker_click AS clicks ON clicks.mailing_trace_id = stats.id
WHERE stats.mass_mailing_id IN %s
AND stats.trace_status != 'cancel'
GROUP BY stats.mass_mailing_id
""", [tuple(self.ids) or (None,)])
mass_mailing_data = self.env.cr.dictfetchall()
@@ -29,7 +29,8 @@ class TestMailingStatistics(TestMassMailCommon):
@users('user_marketing')
@mute_logger('odoo.addons.mass_mailing.models.mailing', 'odoo.addons.mail.models.mail_mail', 'odoo.addons.mail.models.mail_thread')
def test_mailing_statistics(self):
target_records = self._create_mailing_test_records(model='mailing.test.blacklist', count=10)
target_records = self._create_mailing_test_records(model='mailing.test.blacklist', count=11)
target_records[10]['email_from'] = False # void email should lead to a 'cancel' trace_status
mailing = self.env['mailing.mailing'].browse(self.mailing_bl.ids)
mailing.write({'mailing_domain': [('id', 'in', target_records.ids)], 'user_id': self.user_marketing_2.id})
mailing.action_put_in_queue()
@@ -45,7 +46,9 @@ class TestMailingStatistics(TestMassMailCommon):
self.gateway_mail_click(mailing, target_records[3], 'https://www.odoo.be')
# check mailing statistics
self.assertEqual(mailing.canceled, 1)
self.assertEqual(mailing.clicked, 3)
self.assertEqual(mailing.clicks_ratio, 30)
self.assertEqual(mailing.delivered, 10)
self.assertEqual(mailing.opened, 4)
self.assertEqual(mailing.opened_ratio, 40)