[IMP] mass_mailing: improve mailing trace report

PURPOSE

Improve user experience of report model build on mailing traces.

SPECIFICATIONS

Add scheduled count to reporting. Indeed we have number of sent and delivered
traces but it lacks count of scheduled. Some traces are not sent for example
when email or sms is missing or obviously wrong. Those are currently not
counted in reporting, this is fixed.

Views are also improved to add relevant metrics and measures. Notably add
a list view on report model, allowing to see some metrics at a glance. Improve
SMS related views, hiding opened / replied metrics as we do not track them
currently in SMS.

LINKS

Task ID-2377974
Community PR odoo/odoo#61467
Enterprise PR odoo/enterprise#14633
This commit is contained in:
Thibault Delavallée
2021-08-18 13:38:17 +00:00
parent ad2fe60525
commit f16dbbcaec
3 changed files with 75 additions and 14 deletions
@@ -19,6 +19,7 @@ class MailingTraceReport(models.Model):
string='Status', readonly=True)
email_from = fields.Char('From', readonly=True)
# traces
scheduled = fields.Integer(readonly=True)
sent = fields.Integer(readonly=True)
delivered = fields.Integer(readonly=True)
error = fields.Integer(readonly=True)
@@ -57,11 +58,12 @@ class MailingTraceReport(models.Model):
'trace.create_date as scheduled_date',
'mailing.state',
'mailing.email_from',
"COUNT(trace.id) as scheduled",
'COUNT(trace.sent_datetime) as sent',
"(COUNT(trace.sent_datetime) - COUNT(trace.trace_status) FILTER (WHERE trace.trace_status IN ('error', 'bounce', 'cancel'))) as delivered",
"(COUNT(trace.id) - COUNT(trace.trace_status) FILTER (WHERE trace.trace_status IN ('error', 'bounce', 'cancel'))) as delivered",
"COUNT(trace.trace_status) FILTER (WHERE trace.trace_status = 'error') as error",
"COUNT(trace.trace_status) FILTER (WHERE trace.trace_status = 'bounce') as bounced",
"COUNT(trace.trace_status) FILTER (WHERE trace.trace_status = 'cancel') as cancel",
"COUNT(trace.trace_status) FILTER (WHERE trace.trace_status = 'cancel') as canceled",
"COUNT(trace.trace_status) FILTER (WHERE trace.trace_status = 'open') as opened",
"COUNT(trace.trace_status) FILTER (WHERE trace.trace_status = 'reply') as replied",
"COUNT(trace.links_click_datetime) as clicked",
@@ -1,17 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="mailing_trace_report_view_tree" model="ir.ui.view">
<field name="name">mailing.trace.report.view.tree</field>
<field name="model">mailing.trace.report</field>
<field name="arch" type="xml">
<tree string="Mass Mailing Statistics" sample="1">
<field name="name"/>
<field name="campaign" groups="mass_mailing.group_mass_mailing_campaign"/>
<field name="mailing_type" invisible="1"/>
<field name="state"/>
<field name="scheduled"/>
<field name="sent"/>
<field name="delivered"/>
<field name="opened"/>
<field name="replied"/>
<field name="clicked"/>
<field name="canceled" optional="hide"/>
<field name="error" optional="hide"/>
<field name="bounced" optional="hide"/>
</tree>
</field>
</record>
<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">
<pivot string="Mass Mailing Statistics" disable_linking="1" sample="1">
<field name="name" type="row"/>
<field name="sent" type="measure"/>
<field name="scheduled" 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="replied" type="measure"/>
<field name="clicked" type="measure"/>
<field name="canceled"/>
<field name="error"/>
<field name="bounced"/>
</pivot>
</field>
</record>
@@ -20,10 +45,11 @@
<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">
<graph string="Mass Mailing Statistics" disable_linking="1" sample="1">
<field name="name"/>
<field name="sent" type="measure"/>
<field name="replied" invisible="0"/>
<field name="replied"/>
<field name="clicked"/>
</graph>
</field>
</record>
@@ -35,9 +61,9 @@
<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"/>
<filter name="filter_scheduled_date" date="scheduled"/>
<group expand="0" string="Extended Filters...">
<field name="scheduled_date"/>
<field name="scheduled"/>
</group>
<group expand="1" string="Group By...">
<filter string="Mass Mailing Campaign" domain="[]" name="mass_mailing_campaign"
@@ -47,8 +73,8 @@
<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'}"/>
<filter string="Scheduled Period" name="scheduled"
domain="[]" context="{'group_by':'scheduled'}"/>
</group>
</search>
</field>
@@ -59,8 +85,14 @@
<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>
<field name="view_mode">graph,pivot,tree</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
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"
@@ -1,5 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="mailing_trace_report_sms_view_tree" model="ir.ui.view">
<field name="name">mailing.sms.trace.report.view.tree</field>
<field name="model">mailing.trace.report</field>
<field name="inherit_id" ref="mass_mailing.mailing_trace_report_view_tree"/>
<field name="priority" eval="50"/>
<field name="mode">primary</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<xpath expr="//field[@name='opened']" position="attributes">
<attribute name="invisible">1</attribute>
</xpath>
<xpath expr="//field[@name='replied']" position="attributes">
<attribute name="invisible">1</attribute>
</xpath>
</field>
</record>
<record id="mailing_trace_report_sms_view_pivot" model="ir.ui.view">
<field name="name">mailing.sms.trace.report.view.pivot</field>
<field name="model">mailing.trace.report</field>
@@ -8,6 +25,9 @@
<field name="mode">primary</field>
<field name="type">pivot</field>
<field name="arch" type="xml">
<xpath expr="//field[@name='opened']" position="attributes">
<attribute name="invisible">1</attribute>
</xpath>
<xpath expr="//field[@name='replied']" position="attributes">
<attribute name="invisible">1</attribute>
</xpath>
@@ -32,7 +52,7 @@
<record id="mailing_trace_report_action_sms" model="ir.actions.act_window">
<field name="name">SMS Marketing Analysis</field>
<field name="res_model">mailing.trace.report</field>
<field name="view_mode">graph,pivot</field>
<field name="view_mode">graph,pivot,tree</field>
<field name="domain">[('mailing_type', '=', 'sms')]</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
@@ -56,6 +76,13 @@
<field name="view_id" ref="mailing_trace_report_sms_view_pivot"/>
</record>
<record id="mailing_trace_report_action_sms_view_tree" model="ir.actions.act_window.view">
<field name="sequence">2</field>
<field name="view_mode">tree</field>
<field name="act_window_id" ref="mailing_trace_report_action_sms"/>
<field name="view_id" ref="mailing_trace_report_sms_view_tree"/>
</record>
<!-- SMS Marketing / Reporting -->
<record id="mass_mailing_sms_menu_reporting" model="ir.ui.menu">
<field name="action" ref="mailing_trace_report_action_sms"/>