From a6d9decdd52a45ddb87545175ee5e38c17243d0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Warnon?= Date: Wed, 9 Oct 2019 07:58:42 +0000 Subject: [PATCH] [REF] mass_mailing: clean unused utm statistic fields This commit cleans several unused computed utm statistics fields related to mass_mailing along with their compute methods. Upgrade PR odoo/upgrade#823 Task 2082816 closes odoo/odoo#38246 Related: odoo/upgrade#823 Signed-off-by: Thibault Delavallee (tde) --- addons/mass_mailing/__manifest__.py | 2 +- addons/mass_mailing/models/utm.py | 73 +++++++++++------------------ 2 files changed, 29 insertions(+), 46 deletions(-) diff --git a/addons/mass_mailing/__manifest__.py b/addons/mass_mailing/__manifest__.py index cc4a7c0d0c7..1bd54580278 100644 --- a/addons/mass_mailing/__manifest__.py +++ b/addons/mass_mailing/__manifest__.py @@ -5,7 +5,7 @@ 'name': 'Email Marketing', 'summary': 'Design, send and track emails', 'description': "", - 'version': '2.0', + 'version': '2.1', 'sequence': 110, 'website': 'https://www.odoo.com/page/mailing', 'category': 'Marketing/Email Marketing', diff --git a/addons/mass_mailing/models/utm.py b/addons/mass_mailing/models/utm.py index fe98c9c0ee5..783703d3961 100644 --- a/addons/mass_mailing/models/utm.py +++ b/addons/mass_mailing/models/utm.py @@ -12,19 +12,7 @@ class UtmCampaign(models.Model): domain=[('mailing_type', '=', 'mail')], string='Mass Mailings') mailing_mail_count = fields.Integer('Number of Mass Mailing', compute="_compute_mailing_mail_count") - mailing_clicks_ratio = fields.Integer(compute="_compute_mailing_clicks_ratio", string="Number of clicks") - mailing_items = fields.Integer(compute="_compute_mailing_items", string='Mailings') - mailing_clicked = fields.Integer(compute="_compute_mailing_items", string='Mailings Clicked') # stat fields - total = fields.Integer(compute="_compute_statistics") - scheduled = fields.Integer(compute="_compute_statistics") - failed = fields.Integer(compute="_compute_statistics") - ignored = fields.Integer(compute="_compute_statistics") - sent = fields.Integer(compute="_compute_statistics", string="Sent Emails") - delivered = fields.Integer(compute="_compute_statistics") - opened = fields.Integer(compute="_compute_statistics") - replied = fields.Integer(compute="_compute_statistics") - bounced = fields.Integer(compute="_compute_statistics") received_ratio = fields.Integer(compute="_compute_statistics", string='Received Ratio') opened_ratio = fields.Integer(compute="_compute_statistics", string='Opened Ratio') replied_ratio = fields.Integer(compute="_compute_statistics", string='Replied Ratio') @@ -35,40 +23,17 @@ class UtmCampaign(models.Model): for campaign in self: campaign.mailing_mail_count = len(campaign.mailing_mail_ids) - def _compute_mailing_items(self): - query = """SELECT trace.campaign_id AS campaign_id, COUNT(DISTINCT(trace.id)) AS items_total, COUNT(DISTINCT(click.mailing_trace_id)) AS clicked_total - FROM mailing_trace AS trace - LEFT OUTER JOIN link_tracker_click as click ON click.mailing_trace_id = trace.id - WHERE trace.campaign_id IN %s - GROUP BY trace.campaign_id """ - params = [tuple(self.ids)] - self.env.cr.execute(query, params) - clicked_data = self.env.cr.dictfetchall() - mapped_data = {datum['campaign_id']: {'clicked_total': datum['clicked_total'], 'items_total': datum['items_total']} for datum in clicked_data} - - for campaign in self: - campaign_items_values = mapped_data.get(campaign.id, {}) - campaign.mailing_items = campaign_items_values.get('items_total', 0) - campaign.mailing_clicked = campaign_items_values.get('clicked_total', 0) - - @api.depends('mailing_items', 'mailing_clicked') - def _compute_mailing_clicks_ratio(self): - for campaign in self: - campaign.mailing_clicks_ratio = campaign.mailing_clicked / campaign.mailing_items * 100 if campaign.mailing_items > 0 else 0 - def _compute_statistics(self): """ Compute statistics of the mass mailing campaign """ self.env.cr.execute(""" SELECT c.id as campaign_id, - COUNT(s.id) AS total, + COUNT(s.id) AS expected, COUNT(CASE WHEN s.sent is not null THEN 1 ELSE null END) AS sent, - COUNT(CASE WHEN s.scheduled is not null AND s.sent is null AND s.exception is null AND s.ignored is null THEN 1 ELSE null END) AS scheduled, - COUNT(CASE WHEN s.scheduled is not null AND s.sent is null AND s.exception is not null THEN 1 ELSE null END) AS failed, COUNT(CASE WHEN s.scheduled is not null AND s.sent is null AND s.exception is null AND s.ignored is not null THEN 1 ELSE null END) AS ignored, COUNT(CASE WHEN s.id is not null AND s.bounced is null THEN 1 ELSE null END) AS delivered, COUNT(CASE WHEN s.opened is not null THEN 1 ELSE null END) AS opened, - COUNT(CASE WHEN s.replied is not null THEN 1 ELSE null END) AS replied , + COUNT(CASE WHEN s.replied is not null THEN 1 ELSE null END) AS replied, COUNT(CASE WHEN s.bounced is not null THEN 1 ELSE null END) AS bounced FROM mailing_trace s @@ -81,14 +46,32 @@ class UtmCampaign(models.Model): c.id """, (tuple(self.ids), )) - for row in self.env.cr.dictfetchall(): - total = (row['total'] - row['ignored']) or 1 - row['delivered'] = row['sent'] - row['bounced'] - row['received_ratio'] = 100.0 * row['delivered'] / total - row['opened_ratio'] = 100.0 * row['opened'] / total - row['replied_ratio'] = 100.0 * row['replied'] / total - row['bounced_ratio'] = 100.0 * row['bounced'] / total - self.browse(row.pop('campaign_id')).update(row) + all_stats = self.env.cr.dictfetchall() + stats_per_campaign = { + stats['campaign_id']: stats + for stats in all_stats + } + + for campaign in self: + stats = stats_per_campaign.get(campaign.id) + if not stats: + vals = { + 'received_ratio': 0, + 'opened_ratio': 0, + 'replied_ratio': 0, + 'bounced_ratio': 0 + } + else: + total = (stats['expected'] - stats['ignored']) or 1 + delivered = stats['sent'] - stats['bounced'] + vals = { + 'received_ratio': 100.0 * delivered / total, + 'opened_ratio': 100.0 * stats['opened'] / total, + 'replied_ratio': 100.0 * stats['replied'] / total, + 'bounced_ratio': 100.0 * stats['bounced'] / total + } + + campaign.update(vals) def _get_mailing_recipients(self, model=None): """Return the recipients of a mailing campaign. This is based on the statistics