summaryrefslogtreecommitdiff
path: root/addons/mass_mailing/report
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/mass_mailing/report
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/mass_mailing/report')
-rw-r--r--addons/mass_mailing/report/__init__.py4
-rw-r--r--addons/mass_mailing/report/mailing_trace_report.py85
-rw-r--r--addons/mass_mailing/report/mailing_trace_report_views.xml70
3 files changed, 159 insertions, 0 deletions
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 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <record id="mailing_trace_report_view_pivot" model="ir.ui.view">
+ <field name="name">mailing.trace.report.view.pivot</field>
+ <field name="model">mailing.trace.report</field>
+ <field name="arch" type="xml">
+ <pivot string="Mass Mailing Statistics" disable_linking="True" sample="1">
+ <field name="name" type="row"/>
+ <field name="sent" type="measure"/>
+ <field name="delivered" type="measure"/>
+ <field name="opened" type="measure"/>
+ <field name="bounced" type="measure"/>
+ <field name="replied" type="measure" invisible="0"/>
+ <field name="clicked" type="measure"/>
+ </pivot>
+ </field>
+ </record>
+
+ <record id="mailing_trace_report_view_graph" model="ir.ui.view">
+ <field name="name">mailing.trace.report.view.graph</field>
+ <field name="model">mailing.trace.report</field>
+ <field name="arch" type="xml">
+ <graph string="Mass Mailing Statistics" sample="1" disable_linking="1">
+ <field name="name"/>
+ <field name="sent" type="measure"/>
+ <field name="replied" invisible="0"/>
+ </graph>
+ </field>
+ </record>
+
+ <record id="mailing_trace_report_view_search" model="ir.ui.view">
+ <field name="name">mailing.trace.report.view.search</field>
+ <field name="model">mailing.trace.report</field>
+ <field name="arch" type="xml">
+ <search string="Mass Mailing Statistics">
+ <field name="name" string="Mailing"/>
+ <field name="campaign" string="Campaign" groups="mass_mailing.group_mass_mailing_campaign"/>
+ <filter name="filter_scheduled_date" date="scheduled_date"/>
+ <group expand="0" string="Extended Filters...">
+ <field name="scheduled_date"/>
+ </group>
+ <group expand="1" string="Group By...">
+ <filter string="Mass Mailing Campaign" domain="[]" name="mass_mailing_campaign"
+ context="{'group_by':'campaign'}" groups="mass_mailing.group_mass_mailing_campaign"/>
+ <filter string="State" domain="[]" name="state"
+ context="{'group_by':'state'}"/>
+ <filter string="Sent By" domain="[]" name="sent_by"
+ context="{'group_by':'email_from'}"/>
+ <separator/>
+ <filter string="Scheduled Period" name="scheduled_date"
+ domain="[]" context="{'group_by':'scheduled_date'}"/>
+ </group>
+ </search>
+ </field>
+ </record>
+
+ <!-- Actions and Menuitems -->
+ <record id="mailing_trace_report_action_mail" model="ir.actions.act_window">
+ <field name="name">Mass Mailing Analysis</field>
+ <field name="res_model">mailing.trace.report</field>
+ <field name="domain">[('mailing_type', '=', 'mail')]</field>
+ <field name="view_mode">graph,pivot</field>
+ <field name="help" type="html"><p>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.</p></field>
+ </record>
+
+ <menuitem name="Reporting" id="menu_mass_mailing_report" sequence="99"
+ parent="mass_mailing_menu_root"
+ action="mailing_trace_report_action_mail"
+ groups="mass_mailing.group_mass_mailing_user"/>
+</odoo>