[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) <tde@openerp.com>
This commit is contained in:
Aurélien Warnon
2020-02-24 13:56:00 +00:00
parent d628ec05ed
commit a6d9decdd5
2 changed files with 29 additions and 46 deletions
+1 -1
View File
@@ -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',
+28 -45
View File
@@ -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