summaryrefslogtreecommitdiff
path: root/addons/digest/data
diff options
context:
space:
mode:
authorMitali Patel <mpa@odoo.com>2018-05-16 11:43:07 +0530
committerThibault Delavallée <tde@odoo.com>2018-07-19 11:26:45 +0200
commit2d1abe64e433acdf95d58fedc736247829dc748c (patch)
treeb3c97fa785c35f9254c2565755b732d5f5ed5023 /addons/digest/data
parentca9aa5f2864f4ec83fe918b00686d6584d89c289 (diff)
[ADD] digest: add new module to send recurrent digests by email
This commit adds a new digest module allowing to send recurrent digests by email. Those contain a summary of the activity and display various KPIs allowing to see the activity at a glance. It is also a great tool to improve user engagement. Digest module contain the core implementation of digests emails as well as first basic KPIs. Future commits will gradually add KPIs in various main addons. Digests consist in email templates that have to call some methods on digest module (compute_kpis, compute_tips, compute_kpis_actions) and render it accordingly. A default digest is given in data allowing to tune it or to duplicate and modify it. Frequency is configurable on the digest; digests can be weekly, monthly or send every 3 months. New employee users are added to the default widget. KPIs are computed for each subscribed users so that results match its groups and related access rights. Default digest therefore work for all users as displayed results depend on their right without having to define separate digests just for that purpose. Implementation is done with Studio in mind. KPIs are computed fields on the digest model. It means using Studio custom computed fields can be defined to add customization to the digests, using fields named x_kpi_... . Digests also holds tips to remind and warn users of features to activate or configure like mailgateway. KPIs can be linked to actions so that the section contain a link allowing to directly jump on a given menu, allowing to directly link reporting menus for example. This commit is related Task ID 30655 and PR #18318. Co-authored-by: Siddharth Gajjar <sga@odoo.com>
Diffstat (limited to 'addons/digest/data')
-rw-r--r--addons/digest/data/digest_data.xml45
-rw-r--r--addons/digest/data/digest_template_data.xml160
-rw-r--r--addons/digest/data/ir_cron_data.xml13
-rw-r--r--addons/digest/data/res_config_settings_data.xml11
4 files changed, 229 insertions, 0 deletions
diff --git a/addons/digest/data/digest_data.xml b/addons/digest/data/digest_data.xml
new file mode 100644
index 00000000000..42607cd3401
--- /dev/null
+++ b/addons/digest/data/digest_data.xml
@@ -0,0 +1,45 @@
+<?xml version='1.0' encoding='utf-8'?>
+<odoo>
+ <data noupdate="1">
+ <record id="digest_digest_default" model="digest.digest">
+ <field name="name">Weekly Digest</field>
+ <field name="user_ids" eval="[(4, ref('base.user_root'))]"/>
+ <field name="next_run_date" eval="(DateTime.now() + timedelta(days=7)).strftime('%Y-%m-%d')"/>
+ <field name="kpi_res_users_connected">True</field>
+ <field name="kpi_mail_message_total">True</field>
+ </record>
+ </data>
+
+ <data>
+ <record id="digest_tip_mail_0" model="digest.tip">
+ <field name="sequence">1</field>
+ <field name="tip_description" type="html">
+<div>
+ % set users = object.env['res.users'].search([], limit=10, order='id desc')
+ % set channel_id = object.env.ref('mail.channel_all_employees').id
+ <strong style="font-size: 16px;">Did you know...?</strong>
+ <div style="font-size: 14px;">You can ping colleagues by tagging them in your messages using "@". They will be instantly notified.<br/>
+ <div>
+ <center>
+ <img src="/digest/static/src/img/notification.png" width="70%" height="100%"/><br/>
+ </center>
+ ${', '.join(users.mapped('name'))} signed up. Say hello in the <a href="/web#action=mail.mail_channel_action_client_chat&amp;active_id=${channel_id}" style="color: #006d6b;">company's discussion channel.</a>
+ </div>
+ </div>
+</div>
+ </field>
+ </record>
+ <record id="digest_tip_mail_1" model="digest.tip">
+ <field name="sequence">7</field>
+ <field name="tip_description" type="html">
+<div>
+ <strong style="font-size: 16px;">Get things done with activities</strong>
+ <div style="font-size: 14px;">You don't have any activity scheduled. Use activities on any business document to schedule meetings, calls and todos.</div>
+ <center>
+ <img src="/digest/static/src/img/activity.png" width="70%" height="100%"/><br/>
+ </center>
+</div>
+ </field>
+ </record>
+ </data>
+</odoo>
diff --git a/addons/digest/data/digest_template_data.xml b/addons/digest/data/digest_template_data.xml
new file mode 100644
index 00000000000..c168dd065b7
--- /dev/null
+++ b/addons/digest/data/digest_template_data.xml
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <record id="digest_mail_template" model="mail.template">
+ <field name="name">Digest: Default main template</field>
+ <field name="model_id" ref="digest.model_digest_digest"/>
+ <field name="auto_delete" eval="True" />
+ <field name="email_from">${user.email}</field>
+ <field name="lang">${user.lang}</field>
+ <field name="body_html"><![CDATA[
+<table style="width: 100%; border-spacing: 0; font-family: Helvetica,Arial,Verdana,sans-serif;">
+ <tr>
+ <td align="center" valign="top" style="border-collapse: collapse; padding: 0">
+ % set company, user = ctx['company'], ctx['user']
+ % set data = object.compute_kpis(company, user)
+ % set tips = object.compute_tips(company, user)
+ % set kpi_actions = object.compute_kpis_actions(company, user)
+ % set kpis = data.yesterday.keys()
+ <table style="width: 100%; max-width: 600px; border-spacing: 0; border: 1px solid #e7e7e7; border-bottom: none; color: #6e7172; line-height: 23px; text-align: left;">
+ <tr>
+ <td style="border-collapse: collapse; padding: 10px 40px; text-align: left;">
+ <strong style="margin-left: -22px; color: #000000; font-size: 22px; line-height: 32px;">${company.name} at a glance</strong>
+ <div style="color: #000000; font-size: 15px; margin-left:-22px;">${datetime.date.today().strftime('%B %d, %Y')}</div>
+ </td>
+ <td style="text-align: right; padding: 10px 40px">
+ <img style="padding: 0px; margin: 0px; height: auto; width: 80px;" src="/logo.png?company=${company.id}"/>
+ </td>
+ </tr>
+ <tr><td colspan="2" style="text-align: center;">
+ <hr width="95%" style="background-color: rgb(204,204,204); border: medium none; clear: both; display: block; font-size: 0px; min-height: 1px; line-height: 0; margin: 16px 0px 16px 14px;"/>
+ </td></tr>
+ </table>
+ % for kpi in kpis:
+ <table style="border-spacing: 0; width: 100%; max-width: 600px;">
+ <tr>
+ <td style="border-collapse: collapse; background-color: #ffffff; border-left: 1px solid #e7e7e7; border-right: 1px solid #e7e7e7; line-height: 21px; padding: 0 20px 10px 20px; text-align: left;"><br/>
+ <span style="color: #3d466e; font-size: 18px; font-weight: 500; line-height: 23px;">${object.fields_get()[kpi]['string']}</span>
+ %if kpi in kpi_actions:
+ <span style="float: right;">
+ <a href="/web#action=${kpi_actions[kpi]}">View more</a>
+ </span>
+ %endif
+ </td>
+ </tr>
+ <tr>
+ <td style="border-collapse: collapse; margin: 0; padding:0;">
+ <table style="width: 100%; border-spacing: 0; background-color: #f9f9f9; border: 1px solid #e7e7e7; border-top: none;">
+ <tr>
+ <td style="border-collapse: collapse; margin: 0; padding: 0; display: block; border-top: 2px solid #56b3b5;">
+ <table style="width: 100%; max-width: 199px; border-spacing: 0;">
+ <tr>
+ <td style="border-collapse: collapse; padding: 20px; text-align: center;">
+ <span style="color: #56b3b5; font-size: 35px; font-weight: bold; text-decoration: none; line-height: 36px;">${data['yesterday'][kpi][kpi]}</span><br/>
+ <span style="color: #888888; display: inline-block; font-size: 12px; line-height: 18px; text-transform: uppercase;">Yesterday</span>
+ % if data['yesterday'][kpi]['margin'] != 0.0:
+ <span style="color: #888888; display: block; font-size: 12px; line-height: 18px; text-transform: uppercase;">
+ % if data['yesterday'][kpi]['margin'] > 0.0:
+ <span style="color: #0bbc22;">▲</span>${"%.2f" % data['yesterday'][kpi]['margin']} %
+ % endif
+ % if data['yesterday'][kpi]['margin'] < 0.0:
+ <span style="color: #ff0000;">▼</span>${"%.2f" % data['yesterday'][kpi]['margin']} %
+ % endif
+ </span>
+ % endif
+ </td>
+ </tr>
+ </table>
+ </td>
+ <td style="border-collapse: collapse; margin: 0; padding: 0; border-top: 2px solid #9a5b82;">
+ <table style="width: 100%; max-width: 199px; border-spacing: 0; margin: 0; padding: 0;">
+ <tr>
+ <td style="border-collapse: collapse; padding: 20px; text-align: center;">
+ <span style="color: #9a5b82; font-size: 35px; font-weight: bold; text-decoration: none; line-height: 36px;">${data['lastweek'][kpi][kpi]}</span><br/>
+ <span style="color: #888888; display: inline-block; font-size: 12px; line-height: 18px; text-transform: uppercase;">Last 7 Days</span>
+ % if data['lastweek'][kpi]['margin'] != 0.0:
+ <span style="color: #888888; display: block; font-size: 12px; line-height: 18px; text-transform: uppercase;">
+ % if data['lastweek'][kpi]['margin'] > 0.0:
+ <span style="color: #0bbc22;">▲</span>${"%.2f" % data['lastweek'][kpi]['margin']} %
+ % endif
+ % if data['lastweek'][kpi]['margin'] < 0.0:
+ <span style="color: #ff0000;">▼</span>${"%.2f" % data['lastweek'][kpi]['margin']} %
+ %endif
+ </span>
+ %endif
+ </td>
+ </tr>
+ </table>
+ </td>
+ <td style="border-collapse: collapse; margin: 0; padding: 0; border-top: 2px solid #56b3b5;">
+ <table style="width: 100%; max-width: 199px; border-spacing: 0; margin: 0; padding: 0;">
+ <tr>
+ <td style="border-collapse: collapse; margin: 0; padding: 20; text-align: center;">
+ <span style="color: #56b3b5; font-size: 35px; font-weight: bold; text-decoration: none; line-height: 36px">${data['lastmonth'][kpi][kpi]}</span><br/>
+ <span style="color: #888888; display: inline-block; font-size: 12px; line-height: 18px; text-transform: uppercase;">Last 30 Days</span>
+ % if data['lastmonth'][kpi]['margin'] != 0.0:
+ <span style="color: #888888; display: block; font-size: 12px; line-height: 18px; text-transform: uppercase;">
+ % if data['lastmonth'][kpi]['margin'] > 0.0:
+ <span style="color: #0bbc22;">▲</span>${"%.2f" % data['lastmonth'][kpi]['margin']} %
+ % endif
+ % if data['lastmonth'][kpi]['margin'] < 0.0:
+ <span style="color: #ff0000;">▼</span>${"%.2f" % data['lastmonth'][kpi]['margin']} %
+ %endif
+ </span>
+ %endif
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ % endfor
+ % if tips:
+ <table style="width: 100%; max-width: 600px; margin-top: 5px; border: 1px solid #e7e7e7;">
+ <tr>
+ <td style="border-collapse: collapse; background-color: #ffffff; line-height: 21px; padding: 0px 20px;"><br/>
+ <div style="color: #3d466e; line-height: 23px;">${ctx['tip_description']|safe}</div>
+ </td>
+ </tr>
+ </table>
+ % endif
+ <table style="width: 100%; max-width: 600px; margin-top: 5px; border: 1px solid #e7e7e7;">
+ <tr>
+ <td style="border-collapse: collapse; background-color: #ffffff; line-height: 21px; padding: 0 20px 10px 20px; text-align: center;"><br/>
+ <div style="color: #3d466e; font-size: 16px; font-weight: 600; line-height: 23px;">Run your bussiness from anywhere with Odoo Mobile.</div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div style="text-align: center;"><a href="https://play.google.com/store/apps/details?id=com.odoo.mobile" target="_blank"><img src="/digest/static/src/img/google_play.png" style="display: inline-block; height: 30px; margin-left: auto; margin-right: 12px;"/></a><a href="https://itunes.apple.com/us/app/odoo/id1272543640" target="_blank"><img src="/digest/static/src/img/app_store.png" style="display: inline-block; height: 30px; margin-left: 12px; margin-right: auto;"/></a>
+ </div>
+ </td>
+ </tr>
+ </table>
+ <table style="margin-top: 5px; border: 1px solid #e7e7e7; font-size: 15px; width: 100%; max-width: 600px;">
+ <tr>
+ <td style="border-collapse: collapse; margin: 0; padding: 10px 20px;">
+ % if ctx['user'].has_group('base.group_system'):
+ <div style="margin-top: 20px;">
+ Want to customize the email?
+ <a href="/web#view_type=form&amp;model=digest.digest&amp;id=${object.id}" target="_blank" style="color: #875A7B;">Choose the metrics you care about</a>
+ </div>
+ <br />
+ % endif
+ <p style="font-size: 11px; margin-top: 10px;">
+ <strong>
+ Send by
+ <a href="https://www.odoo.com" style="text-decoration: none; color: #875A7B;">Odoo</a> - <a href="/web#view_type=form&amp;model=digest.digest&amp;id=${object.id}" target="_blank" style="color: #888888;">Unsubscribe</a>
+ </strong>
+ </p>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+ ]]></field>
+ </record>
+</odoo>
diff --git a/addons/digest/data/ir_cron_data.xml b/addons/digest/data/ir_cron_data.xml
new file mode 100644
index 00000000000..2945ad397cd
--- /dev/null
+++ b/addons/digest/data/ir_cron_data.xml
@@ -0,0 +1,13 @@
+<?xml version='1.0' encoding='utf-8'?>
+<odoo>
+ <record forcecreate="True" id="ir_cron_digest_scheduler_action" model="ir.cron">
+ <field name="name">Digest Emails</field>
+ <field name="model_id" ref="model_digest_digest"/>
+ <field name="state">code</field>
+ <field name="code">model._cron_send_digest_email()</field>
+ <field name="user_id" ref="base.user_root"/>
+ <field name="interval_number">1</field>
+ <field name="interval_type">days</field>
+ <field name="numbercall">-1</field>
+ </record>
+</odoo>
diff --git a/addons/digest/data/res_config_settings_data.xml b/addons/digest/data/res_config_settings_data.xml
new file mode 100644
index 00000000000..cbd93e4fef0
--- /dev/null
+++ b/addons/digest/data/res_config_settings_data.xml
@@ -0,0 +1,11 @@
+<?xml version='1.0' encoding='utf-8'?>
+<odoo>
+ <record id="default_emails_digest" model="ir.config_parameter">
+ <field name="key">digest.default_digest_emails</field>
+ <field name="value">True</field>
+ </record>
+ <record id="default_digest" model="ir.config_parameter">
+ <field name="key">digest.default_digest_id</field>
+ <field name="value" ref="digest.digest_digest_default"/>
+ </record>
+</odoo>