summaryrefslogtreecommitdiff
path: root/addons
diff options
context:
space:
mode:
authorJérémy Hennecart <jeh@odoo.com>2020-03-23 08:19:51 +0000
committerThibault Delavallée <tde@odoo.com>2020-05-29 09:48:40 +0000
commitc15f9efed009dd2168fd8296ad573e70e4bbbe52 (patch)
treee3216e1a52cb63888c0b1c1fc778f1473f33b1f1 /addons
parentad828f40424192337017a899566d71992381b574 (diff)
[IMP] mass_mailing: add email marketing tour
PURPOSE Improve the Email Marketing tour and onboarding to create a "wow effect" when users test the app. SPECIFICATIONS Create a tour for mass_mailing to let user visit Odoo Email Marketing through a simple mailing creation flow. This require the following functional changes * by default, if user chooses to contact mailing lists and there is a single mailing list available, add it as default value for chosen list; * create a master mailing list data containing the admin user so that he can easily follow the tour and test the mailing application; LINKS Task ID 2194876 Community PR odoo/odoo#48259 Upgrade PR odoo/upgrade#983 Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
Diffstat (limited to 'addons')
-rw-r--r--addons/mass_mailing/__manifest__.py1
-rw-r--r--addons/mass_mailing/data/mass_mailing_data.xml8
-rw-r--r--addons/mass_mailing/data/mass_mailing_demo.xml15
-rw-r--r--addons/mass_mailing/models/mailing.py13
-rw-r--r--addons/mass_mailing/static/src/js/tours/mass_mailing_tour.js87
-rw-r--r--addons/mass_mailing/static/src/xml/mass_mailing.xml2
-rw-r--r--addons/mass_mailing/views/assets.xml6
-rw-r--r--addons/mass_mailing/views/mailing_mailing_views.xml2
-rw-r--r--addons/test_mass_mailing/tests/test_performance.py4
9 files changed, 122 insertions, 16 deletions
diff --git a/addons/mass_mailing/__manifest__.py b/addons/mass_mailing/__manifest__.py
index 73ed0cc919d..9cb082042d6 100644
--- a/addons/mass_mailing/__manifest__.py
+++ b/addons/mass_mailing/__manifest__.py
@@ -17,6 +17,7 @@
'web_editor',
'web_kanban_gauge',
'social_media',
+ 'web_tour',
],
'data': [
'security/mass_mailing_security.xml',
diff --git a/addons/mass_mailing/data/mass_mailing_data.xml b/addons/mass_mailing/data/mass_mailing_data.xml
index 5fb229f9971..95d6efc0fde 100644
--- a/addons/mass_mailing/data/mass_mailing_data.xml
+++ b/addons/mass_mailing/data/mass_mailing_data.xml
@@ -13,5 +13,13 @@
<field name="numbercall">-1</field>
<field eval="False" name="doall" />
</record>
+ <record id="mailing_list_data" model="mailing.list">
+ <field name="name">Newsletter</field>
+ </record>
+ <record id="mass_mailing_contact_0" model="mailing.contact">
+ <field name="name" model="res.users" eval="obj().env.ref('base.user_admin').name"/>
+ <field name="email" model="res.users" eval="obj().env.ref('base.user_admin').email"/>
+ <field name="list_ids" eval="[(6,0,[ref('mass_mailing.mailing_list_data')])]"/>
+ </record>
</data>
</odoo>
diff --git a/addons/mass_mailing/data/mass_mailing_demo.xml b/addons/mass_mailing/data/mass_mailing_demo.xml
index bb4a942bbff..34e72a7418b 100644
--- a/addons/mass_mailing/data/mass_mailing_demo.xml
+++ b/addons/mass_mailing/data/mass_mailing_demo.xml
@@ -7,26 +7,21 @@
<field name="name">SampleDoc.doc</field>
</record>
- <!-- Create mailing lists -->
- <record id="mass_mail_list_2" model="mailing.list">
- <field name="name">Imported Contacts</field>
- </record>
-
<!-- Create Contacts -->
<record id="mass_mail_contact_1" model="mailing.contact">
<field name="name">Aristide Antario</field>
<field name="email">aa@example.com</field>
- <field name="list_ids" eval="[(6,0,[ref('mass_mailing.mass_mail_list_2')])]"/>
+ <field name="list_ids" eval="[(6,0,[ref('mass_mailing.mailing_list_data')])]"/>
</record>
<record id="mass_mail_contact_2" model="mailing.contact">
<field name="name">Beverly Bridge</field>
<field name="email">bb@example.com</field>
- <field name="list_ids" eval="[(6,0,[ref('mass_mailing.mass_mail_list_2')])]"/>
+ <field name="list_ids" eval="[(6,0,[ref('mass_mailing.mailing_list_data')])]"/>
</record>
<record id="mass_mail_contact_3" model="mailing.contact">
<field name="name">Carol Cartridge</field>
<field name="email">cc@example.com</field>
- <field name="list_ids" eval="[(6,0,[ref('mass_mailing.mass_mail_list_2')])]"/>
+ <field name="list_ids" eval="[(6,0,[ref('mass_mailing.mailing_list_data')])]"/>
</record>
<record id="mass_mail_contact_4" model="mailing.contact">
<field name="name">David Dawson</field>
@@ -35,12 +30,12 @@
<record id="mass_mail_contact_5" model="mailing.contact">
<field name="name">Elsa Ericson</field>
<field name="email">ee@example.com</field>
- <field name="list_ids" eval="[(6,0,[ref('mass_mailing.mass_mail_list_2')])]"/>
+ <field name="list_ids" eval="[(6,0,[ref('mass_mailing.mailing_list_data')])]"/>
</record>
<!-- Create Opt-out Records -->
<record id="mass_mail_contact_list_rel_1" model="mailing.contact.subscription">
- <field name="list_id" ref="mass_mailing.mass_mail_list_2"/>
+ <field name="list_id" ref="mass_mailing.mailing_list_data"/>
<field name="contact_id" ref="mass_mailing.mass_mail_contact_4"/>
<field name="opt_out">True</field>
</record>
diff --git a/addons/mass_mailing/models/mailing.py b/addons/mass_mailing/models/mailing.py
index 38814270ae1..7b5b5e65954 100644
--- a/addons/mass_mailing/models/mailing.py
+++ b/addons/mass_mailing/models/mailing.py
@@ -9,10 +9,9 @@ import random
import re
import threading
from ast import literal_eval
-from base64 import b64encode
from datetime import datetime
-from odoo import api, fields, models, tools, _, SUPERUSER_ID
+from odoo import api, fields, models, tools, _
from odoo.exceptions import UserError
from odoo.osv import expression
@@ -45,6 +44,16 @@ class MassMailing(models.Model):
_rec_name = "subject"
@api.model
+ def default_get(self, fields):
+ vals = super(MassMailing, self).default_get(fields)
+ if 'contact_list_ids' in fields and not vals.get('contact_list_ids') and vals.get('mailing_model_id'):
+ if vals.get('mailing_model_id') == self.env['ir.model']._get('mailing.list').id:
+ mailing_list = self.env['mailing.list'].search([], limit=2)
+ if len(mailing_list) == 1:
+ vals['contact_list_ids'] = [(6, 0, [mailing_list.id])]
+ return vals
+
+ @api.model
def _get_default_mail_server_id(self):
server_id = self.env['ir.config_parameter'].sudo().get_param('mass_mailing.mail_server_id')
try:
diff --git a/addons/mass_mailing/static/src/js/tours/mass_mailing_tour.js b/addons/mass_mailing/static/src/js/tours/mass_mailing_tour.js
new file mode 100644
index 00000000000..82d875e6839
--- /dev/null
+++ b/addons/mass_mailing/static/src/js/tours/mass_mailing_tour.js
@@ -0,0 +1,87 @@
+odoo.define('mass_mailing.mass_mailing_tour', function (require) {
+ "use strict";
+
+ var core = require('web.core');
+ var _t = core._t;
+ var tour = require('web_tour.tour');
+ var now = moment();
+
+ tour.register('mass_mailing_tour', {
+ url: '/web',
+ rainbowManMessage: _t('Congratulations, I love your first mailing. :)'),
+ }, [tour.stepUtils.showAppsMenuItem(), {
+ trigger: '.o_app[data-menu-xmlid="mass_mailing.mass_mailing_menu_root"]',
+ content: _t("Let's try the Email Marketing app."),
+ width: 210,
+ position: 'bottom',
+ edition: 'enterprise',
+ }, {
+ trigger: '.o_app[data-menu-xmlid="mass_mailing.mass_mailing_menu_root"]',
+ content: _t("Let's try the Email Marketing app."),
+ edition: 'community',
+ }, {
+ trigger: '.o-kanban-button-new',
+ content: _t("Start by creating your first <b>Mailing</b>."),
+ position: 'bottom',
+ }, {
+ trigger: 'input[name="subject"]',
+ content: _t('Pick the <b>email subject</b>.'),
+ position: 'right',
+ run: 'text ' + now.format("MMMM") + " Newsletter",
+ }, {
+ trigger: 'div[name="contact_list_ids"] > .o_input_dropdown > input[type="text"]',
+ run: 'click',
+ auto: true,
+ }, {
+ trigger: 'li.ui-menu-item',
+ run: 'click',
+ auto: true,
+ }, {
+ trigger: 'div[name="body_arch"] iframe #newsletter',
+ content: _t('Choose this <b>theme</b>.'),
+ position: 'left',
+ edition: 'enterprise',
+ run: 'click',
+ }, {
+ trigger: 'div[name="body_arch"] iframe #default',
+ content: _t('Choose this <b>theme</b>.'),
+ position: 'right',
+ edition: 'community',
+ run: 'click',
+ }, {
+ trigger: 'div[name="body_arch"] iframe div.o_mail_block_paragraph',
+ content: _t('Click on this paragraph to edit it.'),
+ position: 'top',
+ edition: 'enterprise',
+ run: 'click',
+ }, {
+ trigger: 'div[name="body_arch"] iframe div.o_mail_block_title_text',
+ content: _t('Click on this paragraph to edit it.'),
+ position: 'top',
+ edition: 'community',
+ run: 'click',
+ }, {
+ trigger: 'button[name="action_test"]',
+ content: _t("Test this mailing by sending a copy to yourself."),
+ position: 'bottom',
+ }, {
+ trigger: 'button[name="send_mail_test"]',
+ content: _t("Check the email address and click send."),
+ position: 'bottom',
+ }, {
+ trigger: 'button[name="action_put_in_queue"]',
+ content: _t("Ready for take-off!"),
+ position: 'bottom',
+ }, {
+ trigger: '.btn-primary:contains("Ok")',
+ content: _t("Don't worry, the mailing contact we created is an internal user."),
+ position: 'bottom',
+ run: "click",
+ }, {
+ trigger: '.o_back_button',
+ content: _t("By using the <b>Breadcrumb</b>, you can navigate back to the overview."),
+ position: 'bottom',
+ run: 'click',
+ }]
+ );
+});
diff --git a/addons/mass_mailing/static/src/xml/mass_mailing.xml b/addons/mass_mailing/static/src/xml/mass_mailing.xml
index 266d7931ec5..b4a3bfce26b 100644
--- a/addons/mass_mailing/static/src/xml/mass_mailing.xml
+++ b/addons/mass_mailing/static/src/xml/mass_mailing.xml
@@ -6,7 +6,7 @@
</a>
<div class="dropdown-menu" role="menu">
<t t-foreach="themes" t-as="theme">
- <a role="menuitem" href="#" class="dropdown-item">
+ <a t-att-id="theme.name" role="menuitem" href="#" class="dropdown-item">
<div class="o_thumb small" t-attf-style="background-image: url(#{theme.img}_small.png)"/>
<div class="o_thumb large" t-attf-style="background-image: url(#{theme.img}_large.png)"/>
<div class="o_thumb logo" t-attf-style="background-image: url(#{theme.img}_logo.png)"/>
diff --git a/addons/mass_mailing/views/assets.xml b/addons/mass_mailing/views/assets.xml
index ef99898703d..a1f644b04e7 100644
--- a/addons/mass_mailing/views/assets.xml
+++ b/addons/mass_mailing/views/assets.xml
@@ -38,6 +38,12 @@
<link rel="stylesheet" type="text/scss" href="/mass_mailing/static/src/css/basic_theme_readonly.css"/>
</template>
+ <template id="assets_common" name="Mass Mailing Assets Common" inherit_id="web.assets_common">
+ <xpath expr="//script[last()]" position="after">
+ <script type="text/javscript" src="/mass_mailing/static/src/js/tours/mass_mailing_tour.js"/>
+ </xpath>
+ </template>
+
<template id="qunit_suite" inherit_id="web.qunit_suite_tests">
<xpath expr="." position="inside">
<script type="text/javascript">
diff --git a/addons/mass_mailing/views/mailing_mailing_views.xml b/addons/mass_mailing/views/mailing_mailing_views.xml
index 032a8192c30..b2302f4edc2 100644
--- a/addons/mass_mailing/views/mailing_mailing_views.xml
+++ b/addons/mass_mailing/views/mailing_mailing_views.xml
@@ -156,7 +156,7 @@
<field name="active" invisible="1"/>
<field name="mailing_type" widget="radio" options="{'horizontal': true}" invisible="1"
attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
- <field name="subject" string="Subject" attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}" widget="char_emojis"/>
+ <field name="subject" string="Subject" attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}" widget="char_emojis" placeholder="e.g. New Sale on all T-shirts"/>
<label for="mailing_model_id" string="Recipients"/>
<div name="mailing_model_id_container">
<div class="row">
diff --git a/addons/test_mass_mailing/tests/test_performance.py b/addons/test_mass_mailing/tests/test_performance.py
index d106247ad73..b6d784f1723 100644
--- a/addons/test_mass_mailing/tests/test_performance.py
+++ b/addons/test_mass_mailing/tests/test_performance.py
@@ -51,7 +51,7 @@ class TestMassMailPerformance(TestMassMailPerformanceBase):
})
# runbot needs +50 compared to local
- with self.assertQueryCount(__system__=1913, marketing=1914):
+ with self.assertQueryCount(__system__=1914, marketing=1915):
mailing.action_send_mail()
self.assertEqual(mailing.sent, 50)
@@ -91,7 +91,7 @@ class TestMassMailBlPerformance(TestMassMailPerformanceBase):
})
# runbot needs +62 compared to local
- with self.assertQueryCount(__system__=2240, marketing=2241):
+ with self.assertQueryCount(__system__=2241, marketing=2242):
mailing.action_send_mail()
self.assertEqual(mailing.sent, 50)