From 3751379f1e9a4c215fb6eb898b4ccc67659b9ace Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Tue, 10 May 2022 21:51:50 +0700 Subject: initial commit 2 --- addons/mass_mailing/report/__init__.py | 4 + addons/mass_mailing/report/mailing_trace_report.py | 85 ++++++++++++++++++++++ .../report/mailing_trace_report_views.xml | 70 ++++++++++++++++++ 3 files changed, 159 insertions(+) create mode 100644 addons/mass_mailing/report/__init__.py create mode 100644 addons/mass_mailing/report/mailing_trace_report.py create mode 100644 addons/mass_mailing/report/mailing_trace_report_views.xml (limited to 'addons/mass_mailing/report') diff --git a/addons/mass_mailing/report/__init__.py b/addons/mass_mailing/report/__init__.py new file mode 100644 index 00000000..cd346c5e --- /dev/null +++ b/addons/mass_mailing/report/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import mailing_trace_report diff --git a/addons/mass_mailing/report/mailing_trace_report.py b/addons/mass_mailing/report/mailing_trace_report.py new file mode 100644 index 00000000..02931d62 --- /dev/null +++ b/addons/mass_mailing/report/mailing_trace_report.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models, tools + + +class MailingTraceReport(models.Model): + _name = 'mailing.trace.report' + _auto = False + _description = 'Mass Mailing Statistics' + + # mailing + name = fields.Char(string='Mass Mail', readonly=True) + mailing_type = fields.Selection([('mail', 'Mail')], string='Type', default='mail', required=True) + campaign = fields.Char(string='Mailing Campaign', readonly=True) + scheduled_date = fields.Datetime(string='Scheduled Date', readonly=True) + state = fields.Selection( + [('draft', 'Draft'), ('test', 'Tested'), ('done', 'Sent')], + string='Status', readonly=True) + email_from = fields.Char('From', readonly=True) + # traces + sent = fields.Integer(readonly=True) + delivered = fields.Integer(readonly=True) + opened = fields.Integer(readonly=True) + replied = fields.Integer(readonly=True) + clicked = fields.Integer(readonly=True) + bounced = fields.Integer(readonly=True) + + def init(self): + """Mass Mail Statistical Report: based on mailing.trace that models the various + statistics collected for each mailing, and mailing.mailing model that models the + various mailing performed. """ + tools.drop_view_if_exists(self.env.cr, 'mailing_trace_report') + self.env.cr.execute(self._report_get_request()) + + def _report_get_request(self): + sql_select = 'SELECT %s' % ', '.join(self._report_get_request_select_items()) + sql_from = 'FROM %s' % ' '.join(self._report_get_request_from_items()) + sql_where_items = self._report_get_request_where_items() + if sql_where_items and len(sql_where_items) == 1: + sql_where = 'WHERE %s' % sql_where_items[0] + elif sql_where_items: + sql_where = 'WHERE %s' % ' AND '.join(sql_where_items) + else: + sql_where = '' + sql_group_by = 'GROUP BY %s' % ', '.join(self._report_get_request_group_by_items()) + return f"CREATE OR REPLACE VIEW mailing_trace_report AS ({sql_select} {sql_from} {sql_where} {sql_group_by} )" + + def _report_get_request_select_items(self): + return [ + 'min(trace.id) as id', + 'utm_source.name as name', + 'mailing.mailing_type', + 'utm_campaign.name as campaign', + 'trace.scheduled as scheduled_date', + 'mailing.state', + 'mailing.email_from', + 'count(trace.sent) as sent', + '(count(trace.sent) - count(trace.bounced)) as delivered', + 'count(trace.opened) as opened', + 'count(trace.replied) as replied', + 'count(trace.clicked) as clicked', + 'count(trace.bounced) as bounced' + ] + + def _report_get_request_from_items(self): + return [ + 'mailing_trace as trace', + 'left join mailing_mailing as mailing ON (trace.mass_mailing_id=mailing.id)', + 'left join utm_campaign as utm_campaign ON (mailing.campaign_id = utm_campaign.id)', + 'left join utm_source as utm_source ON (mailing.source_id = utm_source.id)' + ] + + def _report_get_request_where_items(self): + return [] + + def _report_get_request_group_by_items(self): + return [ + 'trace.scheduled', + 'utm_source.name', + 'utm_campaign.name', + 'mailing.mailing_type', + 'mailing.state', + 'mailing.email_from' + ] diff --git a/addons/mass_mailing/report/mailing_trace_report_views.xml b/addons/mass_mailing/report/mailing_trace_report_views.xml new file mode 100644 index 00000000..51c70d9b --- /dev/null +++ b/addons/mass_mailing/report/mailing_trace_report_views.xml @@ -0,0 +1,70 @@ + + + + mailing.trace.report.view.pivot + mailing.trace.report + + + + + + + + + + + + + + + mailing.trace.report.view.graph + mailing.trace.report + + + + + + + + + + + mailing.trace.report.view.search + mailing.trace.report + + + + + + + + + + + + + + + + + + + + + + Mass Mailing Analysis + mailing.trace.report + [('mailing_type', '=', 'mail')] + graph,pivot +

Mass Mailing Statistics allows you to check different mailing related information like number of bounced mails, opened mails, replied mails. You can sort out your analysis by different groups to get accurate grained analysis.

+
+ + +
-- cgit v1.2.3