From 4fa30f556929fb5c11d835f5ef0af68cd8acb6d8 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Fri, 4 Jul 2014 23:56:22 +0200 Subject: [PATCH] [FIX] mass_mailing: avoid mutable values for dict.fromkeys(), simplify with RIGHT JOIN --- addons/mass_mailing/mass_mailing.py | 58 +++++++++++++---------------- 1 file changed, 26 insertions(+), 32 deletions(-) diff --git a/addons/mass_mailing/mass_mailing.py b/addons/mass_mailing/mass_mailing.py index ddbca692394..f95675d0de7 100644 --- a/addons/mass_mailing/mass_mailing.py +++ b/addons/mass_mailing/mass_mailing.py @@ -37,27 +37,24 @@ class MassMailingCampaign(osv.Model): def _get_statistics(self, cr, uid, ids, name, arg, context=None): """ Compute statistics of the mass mailing campaign """ - results = dict.fromkeys(ids, { - 'sent': 0, - 'delivered': 0, - 'opened': 0, - 'replied': 0, - 'bounced': 0, - }) + results = {} cr.execute(""" SELECT - mass_mailing_campaign_id, - COUNT(id) AS sent, - COUNT(CASE WHEN bounced is null THEN 1 ELSE null END) AS delivered, - COUNT(CASE WHEN opened is not null THEN 1 ELSE null END) AS opened, - COUNT(CASE WHEN replied is not null THEN 1 ELSE null END) AS replied , - COUNT(CASE WHEN bounced is not null THEN 1 ELSE null END) AS bounced + c.id, + COUNT(s.id) AS sent, + 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.bounced is not null THEN 1 ELSE null END) AS bounced FROM - mail_mail_statistics + mail_mail_statistics s + RIGHT JOIN + mail_mass_mailing_campaign c + ON (c.id = s.mass_mailing_campaign_id) WHERE - mass_mailing_campaign_id IN %s + c.id IN %s GROUP BY - mass_mailing_campaign_id + c.id """, (tuple(ids), )) for (campaign_id, sent, delivered, opened, replied, bounced) in cr.fetchall(): results[campaign_id] = { @@ -217,27 +214,24 @@ class MassMailing(osv.Model): def _get_statistics(self, cr, uid, ids, name, arg, context=None): """ Compute statistics of the mass mailing """ - results = dict.fromkeys(ids, { - 'sent': 0, - 'delivered': 0, - 'opened': 0, - 'replied': 0, - 'bounced': 0, - }) + results = {} cr.execute(""" SELECT - mass_mailing_id, - COUNT(id) AS sent, - COUNT(CASE WHEN bounced is null THEN 1 ELSE null END) AS delivered, - COUNT(CASE WHEN opened is not null THEN 1 ELSE null END) AS opened, - COUNT(CASE WHEN replied is not null THEN 1 ELSE null END) AS replied , - COUNT(CASE WHEN bounced is not null THEN 1 ELSE null END) AS bounced + m.id, + COUNT(s.id) AS sent, + 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.bounced is not null THEN 1 ELSE null END) AS bounced FROM - mail_mail_statistics + mail_mail_statistics s + RIGHT JOIN + mail_mass_mailing m + ON (m.id = s.mass_mailing_id) WHERE - mass_mailing_id IN %s + m.id IN %s GROUP BY - mass_mailing_id + m.id """, (tuple(ids), )) for (mass_mailing_id, sent, delivered, opened, replied, bounced) in cr.fetchall(): results[mass_mailing_id] = {