summaryrefslogtreecommitdiff
path: root/addons/mass_mailing/views
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/views
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/mass_mailing/views')
-rw-r--r--addons/mass_mailing/views/assets.xml81
-rw-r--r--addons/mass_mailing/views/link_tracker_views.xml89
-rw-r--r--addons/mass_mailing/views/mailing_contact_views.xml238
-rw-r--r--addons/mass_mailing/views/mailing_list_views.xml165
-rw-r--r--addons/mass_mailing/views/mailing_mailing_views.xml487
-rw-r--r--addons/mass_mailing/views/mailing_mailing_views_menus.xml24
-rw-r--r--addons/mass_mailing/views/mailing_trace_views.xml143
-rw-r--r--addons/mass_mailing/views/mass_mailing_templates_portal.xml150
-rw-r--r--addons/mass_mailing/views/res_config_settings_views.xml73
-rw-r--r--addons/mass_mailing/views/snippets_themes.xml877
-rw-r--r--addons/mass_mailing/views/themes_templates.xml35
-rw-r--r--addons/mass_mailing/views/utm_campaign_views.xml121
12 files changed, 2483 insertions, 0 deletions
diff --git a/addons/mass_mailing/views/assets.xml b/addons/mass_mailing/views/assets.xml
new file mode 100644
index 00000000..f5ed615e
--- /dev/null
+++ b/addons/mass_mailing/views/assets.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <template id="assets_backend" name="mass_mailing assets" inherit_id="web.assets_backend">
+ <xpath expr="." position="inside">
+ <link rel="stylesheet" type="text/scss" href="/mass_mailing/static/src/scss/mass_mailing.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/mass_mailing/static/src/scss/mass_mailing_mobile.scss"/>
+ <link rel="stylesheet" href="/mass_mailing/static/src/css/email_template.css"/>
+ <link rel="stylesheet" type="text/scss" href="/mass_mailing/static/src/scss/mass_mailing.ui.jw.scss"/>
+
+ <script type="text/javascript" src="/mass_mailing/static/src/js/mass_mailing.js"></script>
+ <script type="text/javascript" src="/mass_mailing/static/src/js/mass_mailing_widget.js"></script>
+ </xpath>
+ <xpath expr="//script[last()]" position="after">
+ <script type="text/javascript" src="/mass_mailing/static/src/js/mass_mailing_list_kanban_record.js"></script>
+ <script type="text/javascript" src="/mass_mailing/static/src/js/mass_mailing_list_kanban_renderer.js"></script>
+ <script type="text/javascript" src="/mass_mailing/static/src/js/mass_mailing_list_kanban_view.js"></script>
+ <script type="text/javascript" src="/mass_mailing/static/src/js/unsubscribe.js"></script>
+ </xpath>
+ </template>
+
+ <template id="assets_mail_themes">
+ <link rel="stylesheet" type="text/scss" href="/mass_mailing/static/src/scss/themes/theme_basic.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/mass_mailing/static/src/scss/themes/theme_default.scss"/>
+ <t t-call="mass_mailing.mass_mailing_mail_style"/>
+ </template>
+
+ <template id="assets_mail_themes_edition"> <!-- maybe to remove and convert into a field dumy with attr invisible if the template is not selected -->
+ <t t-call="web._assets_helpers"/>
+ <link rel="stylesheet" type="text/scss" href="/mass_mailing/static/src/scss/mass_mailing.ui.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/mass_mailing/static/src/scss/mass_mailing.ui.shadow.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/webclient.scss"/>
+ </template>
+
+ <template id="iframe_css_assets_edit" groups="base.group_user">
+ <t t-call-assets="web.assets_common" t-js="false"/>
+ <t t-call-assets="web_editor.assets_wysiwyg" t-js="false"/>
+ <t t-call-assets="mass_mailing.assets_mail_themes" t-js="false"/>
+ <t t-call-assets="mass_mailing.assets_mail_themes_edition" t-js="false"/>
+ </template>
+
+ <template id="iframe_css_assets_readonly" groups="base.group_user">
+ <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">
+ odoo.define('mass_mailing.FieldHtml.test', function (require) {
+ 'use strict';
+ var MassMailingFieldHtml = require('mass_mailing.FieldHtml');
+ MassMailingFieldHtml.include({jsLibs: []});
+ });
+ </script>
+ <script type="text/javascript" src="/mass_mailing/static/src/js/mass_mailing_snippets.js"/>
+ <script type="text/javascript" src="/mass_mailing/static/tests/mass_mailing_html_tests.js"/>
+ </xpath>
+ </template>
+
+ <template id="mass_mailing_mail_style">
+ <style>
+ @media screen and (max-width: 768px) {
+ .o_mail_col_mv {
+ display: block !important;
+ width: auto !important;
+ }
+ .o_mail_table_styles {
+ width: 100% !important;
+ }
+ .o_mail_col_container {
+ margin: 0px 0px 10px 0px !important;
+ }
+ }
+ </style>
+ </template>
+</odoo>
diff --git a/addons/mass_mailing/views/link_tracker_views.xml b/addons/mass_mailing/views/link_tracker_views.xml
new file mode 100644
index 00000000..615b4c27
--- /dev/null
+++ b/addons/mass_mailing/views/link_tracker_views.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <!-- LINK.TRACKER VIEWS -->
+ <record id="link_tracker_view_search" model="ir.ui.view">
+ <field name="name">link.tracker.view.search.inherit.mass.mail</field>
+ <field name="model">link.tracker</field>
+ <field name="inherit_id" ref="link_tracker.link_tracker_view_search"/>
+ <field name="arch" type="xml">
+ <xpath expr="//field[@name='title']" position="after">
+ <field name="mass_mailing_id"/>
+ </xpath>
+ <xpath expr="//group" position="inside">
+ <filter string="Mass Mailing" name="groupby_mass_mailing_id" context="{'group_by': 'mass_mailing_id'}"/>
+ </xpath>
+ </field>
+ </record>
+
+ <record id="link_tracker_view_form" model="ir.ui.view">
+ <field name="name">link.tracker.view.form.inherit.mass.mail</field>
+ <field name="model">link.tracker</field>
+ <field name="inherit_id" ref="link_tracker.link_tracker_view_form"/>
+ <field name="arch" type="xml">
+ <xpath expr="//field[@name='campaign_id']" position="before">
+ <field name="mass_mailing_id"/>
+ </xpath>
+ </field>
+ </record>
+
+ <!-- LINK.TRACKER.CLICK VIEWS -->
+ <record id="link_tracker_click_view_search" model="ir.ui.view">
+ <field name="name">link.tracker.click.view.search.inherit.mass_mailing</field>
+ <field name="model">link.tracker.click</field>
+ <field name="inherit_id" ref="link_tracker.link_tracker_click_view_search"/>
+ <field name="arch" type="xml">
+ <xpath expr="//field[@name='country_id']" position="after">
+ <field name="campaign_id"/>
+ <field name="mass_mailing_id"/>
+ </xpath>
+ <xpath expr="//filter[@name='groupby_country_id']" position="after">
+ <filter string="Mass Mailing" name="groupby_mass_mailing_id" context="{'group_by': 'mass_mailing_id'}"/>
+ </xpath>
+ </field>
+ </record>
+
+ <record id="link_tracker_click_view_form" model="ir.ui.view">
+ <field name="name">link.tracker.click.view.form.inherit.mass_mailing</field>
+ <field name="model">link.tracker.click</field>
+ <field name="inherit_id" ref="link_tracker.link_tracker_click_view_form"/>
+ <field name="arch" type="xml">
+ <xpath expr="//field[@name='country_id']" position="after">
+ <field name="campaign_id"/>
+ <field name="mass_mailing_id"/>
+ <field name="mailing_trace_id"/>
+ </xpath>
+ </field>
+ </record>
+
+ <record id="link_tracker_click_view_tree" model="ir.ui.view">
+ <field name="name">link.tracker.click.view.tree.inherit.mass_mailing</field>
+ <field name="model">link.tracker.click</field>
+ <field name="inherit_id" ref="link_tracker.link_tracker_click_view_tree"/>
+ <field name="arch" type="xml">
+ <xpath expr="//field[@name='link_id']" position="after">
+ <field name="campaign_id"/>
+ <field name="mass_mailing_id"/>
+ </xpath>
+ </field>
+ </record>
+
+ <record id="link_tracker_click_view_graph" model="ir.ui.view">
+ <field name="name">link.tracker.click.view.graph.inherit.mass_mailing</field>
+ <field name="model">link.tracker.click</field>
+ <field name="inherit_id" ref="link_tracker.link_tracker_click_view_graph"/>
+ <field name="arch" type="xml">
+ <xpath expr="//field[@name='country_id']" position="after">
+ <field name="campaign_id"/>
+ <field name="mass_mailing_id"/>
+ </xpath>
+ </field>
+ </record>
+
+ <!-- MENU TO HANLDE LINK DATA IN MM -->
+ <menuitem id="link_tracker_menu_mass_mailing"
+ name="Link Tracker"
+ parent="mass_mailing_configuration"
+ sequence="5"
+ action="link_tracker.link_tracker_action"/>
+
+</odoo>
diff --git a/addons/mass_mailing/views/mailing_contact_views.xml b/addons/mass_mailing/views/mailing_contact_views.xml
new file mode 100644
index 00000000..cdcb91dc
--- /dev/null
+++ b/addons/mass_mailing/views/mailing_contact_views.xml
@@ -0,0 +1,238 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <!-- MAILING CONTACT SUBSCRIPTION -->
+ <record model="ir.ui.view" id="mailing_contact_subscription_view_form">
+ <field name="name">mailing.contact.subscription.view.form</field>
+ <field name="model">mailing.contact.subscription</field>
+ <field name="priority">10</field>
+ <field name="arch" type="xml">
+ <form string="Mailing List Subscription">
+ <sheet>
+ <group>
+ <field name="list_id"/>
+ <field name="is_blacklisted" invisible="1"/>
+ <label for="contact_id" class="oe_inline"/>
+ <div class="o_row o_row_readonly">
+ <i class="fa fa-ban text-danger" role="img" title="This email is blacklisted for mass mailings"
+ aria-label="Blacklisted" attrs="{'invisible': [('is_blacklisted', '=', False)]}" groups="base.group_user"></i>
+ <field name="contact_id"/>
+ </div>
+ <field name="unsubscription_date" readonly="1"/>
+ <field name="opt_out"/>
+ <field name="message_bounce" readonly="1"/>
+ </group>
+ </sheet>
+ </form>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="mailing_contact_subscription_view_tree">
+ <field name="name">mailing.contact.subscription.view.tree</field>
+ <field name="model">mailing.contact.subscription</field>
+ <field name="arch" type="xml">
+ <tree string="Mailing List Subscriptions">
+ <field name="contact_id"/>
+ <field name="unsubscription_date"/>
+ <field name="opt_out"/>
+ <field name="message_bounce"/>
+ <field name="is_blacklisted"/>
+ </tree>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="mailing_contact_subscription_view_search">
+ <field name="name">mailing.contact.subscription.view.search</field>
+ <field name="model">mailing.contact.subscription</field>
+ <field name="arch" type="xml">
+ <search string="Mailing List Subscriptions">
+ <field name="contact_id"/>
+ <field name="opt_out"/>
+ <field name="list_id"/>
+ </search>
+ </field>
+ </record>
+
+ <record id="mailing_contact_view_search" model="ir.ui.view">
+ <field name="name">mailing.contact.view.search</field>
+ <field name="model">mailing.contact</field>
+ <field name="arch" type="xml">
+ <search string="Mailing List Contacts">
+ <field name="name"
+ filter_domain="['|', '|', ('name','ilike',self), ('company_name','ilike',self), ('email_normalized','ilike',self)]"
+ string="Name / Email"/>
+ <field name="tag_ids"/>
+ <field name="list_ids"/>
+ <separator/>
+ <filter string="Valid Email Recipients"
+ name="filter_valid_email_recipient"
+ domain="[('opt_out', '=', False), ('is_blacklisted', '=', False), ('email_normalized', '!=', False)]"
+ invisible="not context.get('default_list_ids')"/>
+ <separator/>
+ <filter string="Exclude Blacklisted Emails"
+ name="filter_not_email_bl"
+ domain="[('is_blacklisted', '=', False)]"/>
+ <separator/>
+ <filter string="Exclude Opt Out"
+ name="filter_not_optout"
+ domain="[('opt_out', '=', False)]"
+ invisible="not context.get('default_list_ids')"/>
+ <group expand="0" string="Group By">
+ <filter string="Creation Date" name="group_create_date"
+ context="{'group_by': 'create_date'}"/>
+ </group>
+ </search>
+ </field>
+ </record>
+
+ <record id="mailing_contact_view_tree" model="ir.ui.view">
+ <field name="name">mailing.contact.view.tree</field>
+ <field name="model">mailing.contact</field>
+ <field name="priority">10</field>
+ <field name="arch" type="xml">
+ <tree string="Mailing List Contacts" sample="1">
+ <field name="create_date"/>
+ <field name="name"/>
+ <field name="company_name"/>
+ <field name="email"/>
+ <field name="is_blacklisted" string="Email Blacklisted"/>
+ <field name="message_bounce" sum="Total Bounces"/>
+ <field name="opt_out" invisible="'default_list_ids' not in context"/>
+ </tree>
+ </field>
+ </record>
+
+ <record id="mailing_contact_view_kanban" model="ir.ui.view">
+ <field name="name">mailing.contact.view.kanban</field>
+ <field name="model">mailing.contact</field>
+ <field name="arch" type="xml">
+ <kanban sample="1">
+ <field name="name"/>
+ <field name="company_name"/>
+ <field name="email"/>
+ <field name="message_bounce"/>
+ <templates>
+ <t t-name="kanban-box">
+ <div t-attf-class="oe_kanban_global_click">
+ <div class="o_kanban_record_top">
+ <div class="o_kanban_record_headings">
+ <strong class="o_kanban_record_title">
+ <t t-esc="record.name.value"/>
+ </strong>
+ </div>
+ <span class="badge badge-pill" title="Number of bounced email.">
+ <i class="fa fa-exclamation-triangle" role="img" aria-label="Warning" title="Warning"/> <t t-esc="record.message_bounce.value" title=""/>
+ </span>
+ </div>
+ <div class="o_kanban_record_body">
+ <field name="tag_ids"/>
+ </div>
+ <div class="o_kanban_record_bottom">
+ <div class="oe_kanban_bottom_left">
+ <strong>
+ <t t-esc="record.email.value"/>
+ </strong>
+ </div>
+ <div class="oe_kanban_bottom_right">
+ <t t-esc="record.company_name.value"/>
+ </div>
+ </div>
+ </div>
+ </t>
+ </templates>
+ </kanban>
+ </field>
+ </record>
+
+ <record id="mailing_contact_view_form" model="ir.ui.view">
+ <field name="name">mailing.contact.view.form</field>
+ <field name="model">mailing.contact</field>
+ <field name="priority">10</field>
+ <field name="arch" type="xml">
+ <form string="Mailing List Contacts">
+ <sheet>
+ <div class="oe_title">
+ <label for="name" class="oe_edit_only"/>
+ <h1>
+ <field name="name" placeholder="e.g. John Smith"/>
+ </h1>
+ <label for="tag_ids" class="oe_edit_only"/>
+ <div>
+ <field name="tag_ids" widget="many2many_tags" style="width: 100%%"/>
+ </div>
+ </div>
+ <group>
+ <group>
+ <label for="email" class="oe_inline"/>
+ <div class="o_row o_row_readonly" name="email_details">
+ <button name="mail_action_blacklist_remove" class="fa fa-ban text-danger"
+ title="This email is blacklisted for mass mailings. Click to unblacklist."
+ type="object" context="{'default_email': email}" groups="base.group_user"
+ attrs="{'invisible': [('is_blacklisted', '=', False)]}"/>
+ <field name="email" widget="email"/>
+ <field name="is_blacklisted" invisible="1"/>
+ </div>
+ <field name="title_id"/>
+ <field name="company_name"/>
+ <field name="country_id"/>
+ </group>
+ <group>
+ <field name="create_date" readonly="1"/>
+ <field name="message_bounce"/>
+ </group>
+ </group>
+ <field name="subscription_list_ids">
+ <tree editable="bottom">
+ <field name="list_id"/>
+ <field name="unsubscription_date"/>
+ <field name="opt_out"/>
+ </tree>
+ </field>
+ </sheet>
+ <div class="oe_chatter">
+ <field name="message_follower_ids"/>
+ <field name="message_ids"/>
+ </div>
+ </form>
+ </field>
+ </record>
+
+ <record id="mailing_contact_view_pivot" model="ir.ui.view">
+ <field name="name">mailing.contact.pivot</field>
+ <field name="model">mailing.contact</field>
+ <field name="priority">10</field>
+ <field name="arch" type="xml">
+ <pivot string="Mailing List Contacts" stacked="True" sample="1">
+ <field name="create_date" type="row"/>
+ </pivot>
+ </field>
+ </record>
+
+ <record id="mailing_contact_view_graph" model="ir.ui.view">
+ <field name="name">mailing.contact.view.graph</field>
+ <field name="model">mailing.contact</field>
+ <field name="priority">10</field>
+ <field name="arch" type="xml">
+ <graph string="Mailing List Contacts" stacked="True" sample="1">
+ <field name="create_date" type="row"/>
+ </graph>
+ </field>
+ </record>
+
+ <record model="ir.actions.act_window" id="action_view_mass_mailing_contacts">
+ <field name="name">Mailing List Contacts</field>
+ <field name="res_model">mailing.contact</field>
+ <field name="view_mode">tree,kanban,form,graph,pivot</field>
+ <field name="context">{'search_default_filter_not_email_bl': 1}</field>
+ <field name="help" type="html">
+ <p class="o_view_nocontent_smiling_face">
+ Create a mailing contact
+ </p><p>
+ Mailing contacts allow you to separate your marketing audience from your business contact directory.
+ </p>
+ </field>
+ </record>
+
+ <menuitem name="Mailing List Contacts" id="menu_email_mass_mailing_contacts"
+ parent="mass_mailing_mailing_list_menu" sequence="4"
+ action="action_view_mass_mailing_contacts"/>
+</odoo>
diff --git a/addons/mass_mailing/views/mailing_list_views.xml b/addons/mass_mailing/views/mailing_list_views.xml
new file mode 100644
index 00000000..f581669c
--- /dev/null
+++ b/addons/mass_mailing/views/mailing_list_views.xml
@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <!-- MAILING LIST -->
+ <record model="ir.ui.view" id="mailing_list_view_search">
+ <field name="name">mailing.list.view.search</field>
+ <field name="model">mailing.list</field>
+ <field name="arch" type="xml">
+ <search string="Mailing Lists">
+ <field name="name"/>
+ <field name="create_date"/>
+ <filter name="inactive" string="Archived" domain="[('active','=',False)]"/>
+ <group expand="0" string="Group By">
+ <filter string="Creation Period" name="group_create_date"
+ context="{'group_by': 'create_date'}"/>
+ </group>
+ </search>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="mailing_list_view_tree">
+ <field name="name">mailing.list.view.tree</field>
+ <field name="model">mailing.list</field>
+ <field name="priority">10</field>
+ <field name="arch" type="xml">
+ <tree string="Mailing Lists" sample="1">
+ <field name="name"/>
+ <field name="create_date"/>
+ <field name="is_public"/>
+ <field name="contact_nbr"/>
+ </tree>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="mailing_list_view_form">
+ <field name="name">mailing.list.form</field>
+ <field name="model">mailing.list</field>
+ <field name="arch" type="xml">
+ <form string="Contact List">
+ <sheet>
+ <div class="oe_button_box" name="button_box">
+ <button name="action_view_contacts"
+ type="object" icon="fa-user" class="oe_stat_button">
+ <field name="contact_nbr" string="Recipients" widget="statinfo"/>
+ </button>
+ </div>
+ <widget name="web_ribbon" title="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
+ <div class="oe_title">
+ <label for="name" class="oe_edit_only"/>
+ <h1>
+ <field name="name" placeholder="e.g. Consumer Newsletter"/>
+ </h1>
+ </div>
+ <group>
+ <field name="active" invisible="1"/>
+ <field name="is_public"/>
+ </group>
+ </sheet>
+ </form>
+ </field>
+ </record>
+
+ <record id="mailing_list_view_form_simplified" model="ir.ui.view">
+ <field name="name">mailing.list.form.simplified</field>
+ <field name="model">mailing.list</field>
+ <field name="arch" type="xml">
+ <form string="Contact List">
+ <group>
+ <group>
+ <div class="oe_title">
+ <label for="name" class="oe_edit_only"/>
+ <h1>
+ <field name="name" placeholder="e.g. Consumer Newsletter"/>
+ </h1>
+ </div>
+ </group>
+ </group>
+ <group>
+ <field name="is_public"/>
+ </group>
+ <footer>
+ <button string="Create" name="close_dialog" type="object" class="btn-primary"/>
+ <button string="Discard" class="btn-secondary" special="cancel"/>
+ </footer>
+ </form>
+ </field>
+ </record>
+
+ <record id="open_create_mass_mailing_list" model="ir.actions.act_window">
+ <field name="name">Create a Mailing List</field>
+ <field name="res_model">mailing.list</field>
+ <field name="view_mode">form</field>
+ <field name="view_id" ref="mailing_list_view_form_simplified"/>
+ <field name="target">new</field>
+ </record>
+
+ <record id="mailing_list_view_kanban" model="ir.ui.view">
+ <field name="name">mailing.list.view.kanban</field>
+ <field name="model">mailing.list</field>
+ <field name="arch" type="xml">
+ <kanban js_class="mass_mailing_list_kanban" class="o_kanban_mobile" on_create="mass_mailing.open_create_mass_mailing_list" sample="1">
+ <field name="name"/>
+ <field name="contact_nbr"/>
+ <field name="active"/>
+ <templates>
+ <t t-name="kanban-box">
+ <div t-attf-class="oe_kanban_global_click">
+ <div class="o_mass_mailing_kanban_main">
+ <div class="o_kanban_card_content">
+ <div class="o_kanban_primary_left">
+ <div class="o_primary">
+ <span><t t-esc="record.name.value"/></span>
+ </div>
+ </div>
+ </div>
+ <div class="o_kanban_card_manage_pane">
+ <div class="o_kanban_card_manage_section o_dropdown_kanban dropdown">
+ <a role="button" class="dropdown-toggle o-no-caret btn" data-toggle="dropdown" href="#" data-display="static" aria-label="Dropdown menu" title="Dropdown menu">
+ <span class="fa fa-ellipsis-v"/>
+ </a>
+ <div class="dropdown-menu" role="menu">
+ <a t-if="widget.editable" role="menuitem" type="edit" class="dropdown-item">Edit</a>
+ <a t-if="widget.deletable" role="menuitem" type="delete" class="dropdown-item">Delete</a>
+ <a role="menuitem" class="dropdown-item o_kanban_mailing_active" name="toggle_active" type="object">
+ <t t-if="record.active.raw_value">Archive</t>
+ <t t-if="!record.active.raw_value">Restore</t>
+ </a>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="o_mailing_list_kanban_boxes">
+ <a name="action_view_contacts" type="object">
+ <div>
+ <span class="badge badge-pill">
+ <i class="fa fa-user" role="img" aria-label="Contacts" title="Contacts"/>
+ <t t-esc="record.contact_nbr.value"/>
+ </span>
+ </div>
+ </a>
+ </div>
+ </div>
+ </t>
+ </templates>
+ </kanban>
+ </field>
+ </record>
+
+ <record model="ir.actions.act_window" id="action_view_mass_mailing_lists">
+ <field name="name">Mailing Lists</field>
+ <field name="res_model">mailing.list</field>
+ <field name="view_mode">kanban,tree,form</field>
+ <field name="help" type="html">
+ <p class="o_view_nocontent_smiling_face">
+ Create a new mailing list
+ </p><p>
+ You don't need to import your mailing lists, you can easily
+ send emails<br/> to any contact saved in other Odoo apps.
+ </p>
+ </field>
+ </record>
+
+ <menuitem name="Mailing Lists" id="menu_email_mass_mailing_lists"
+ parent="mass_mailing_mailing_list_menu" sequence="3"
+ action="action_view_mass_mailing_lists"/>
+</odoo>
diff --git a/addons/mass_mailing/views/mailing_mailing_views.xml b/addons/mass_mailing/views/mailing_mailing_views.xml
new file mode 100644
index 00000000..16d1c56d
--- /dev/null
+++ b/addons/mass_mailing/views/mailing_mailing_views.xml
@@ -0,0 +1,487 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <!-- MAILING !-->
+ <record model="ir.ui.view" id="view_mail_mass_mailing_search">
+ <field name="name">mailing.mailing.search</field>
+ <field name="model">mailing.mailing</field>
+ <field name="arch" type="xml">
+ <search string="Mailings">
+ <field name="name" string="Mailing" filter_domain="['|', ('name', 'ilike', self), ('subject', 'ilike', self)]"/>
+ <field name="campaign_id" string="Campaign" groups="mass_mailing.group_mass_mailing_campaign"/>
+ <filter string="My Mailings" name="assigned_to_me"
+ domain="[('user_id', '=', uid)]"
+ help="Mailings that are assigned to me"/>
+ <separator/>
+ <filter name="filter_sent_date" date="sent_date"/>
+ <separator/>
+ <filter name="inactive" string="Archived" domain="[('active', '=', False)]"/>
+ <group expand="0" string="Group By">
+ <filter string="Status" name="group_state" context="{'group_by': 'state'}"/>
+ <filter string="Sent By" name="sent_by" domain="[]" context="{'group_by': 'email_from'}"/>
+ <separator/>
+ <filter string="Sent Period" name="sent_date" domain="[]" context="{'group_by': 'sent_date'}"/>
+ </group>
+ </search>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="view_mail_mass_mailing_tree">
+ <field name="name">mailing.mailing.tree</field>
+ <field name="model">mailing.mailing</field>
+ <field name="priority">10</field>
+ <field name="arch" type="xml">
+ <tree string="Mailings" sample="1">
+ <field name="subject" attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
+ <field name="mailing_type" invisible="1"/>
+ <field name="mailing_model_id" string="Recipients"/>
+ <field name="user_id" widget="many2one_avatar_user"/>
+ <field name="schedule_date" string="Scheduled" widget="remaining_days"/>
+ <field name="sent_date" widget="date"/>
+ <field name="state" decoration-info="state == 'draft' or state == 'in_queue'" decoration-success="state == 'sending' or state == 'done'" widget="badge"/>
+ <field name="campaign_id" string="Campaign"
+ groups="mass_mailing.group_mass_mailing_campaign"/>
+ <field name="sent"/>
+ <field name="bounced_ratio" string="Bounced (%)"/>
+ <field name="received_ratio" string="Delivered (%)"/>
+ <field name="opened_ratio" string="Opened (%)"/>
+ <field name="clicks_ratio" string="Clicked (%)"/>
+ <field name="replied_ratio" string="Replied (%)"/>
+ </tree>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="view_mail_mass_mailing_form">
+ <field name="name">mailing.mailing.form</field>
+ <field name="model">mailing.mailing</field>
+ <field name="arch" type="xml">
+ <form string="Mailing">
+ <header style="min-height:31px;">
+ <button name="action_put_in_queue" type="object" attrs="{'invisible': [('state', 'in', ('in_queue', 'sending', 'done'))]}" class="oe_highlight" string="Send"
+ confirm="This will send the email to all recipients. Do you still want to proceed ?"/>
+ <button name="action_schedule" type="object" attrs="{'invisible': [('state', 'in', ('in_queue', 'sending', 'done'))]}" class="btn-secondary" string="Schedule"/>
+ <button name="action_test" type="object" class="btn-secondary" string="Test"/>
+ <button name="action_cancel" type="object" attrs="{'invisible': [('state', '!=', 'in_queue')]}" class="btn-secondary" string="Cancel"/>
+ <button name="action_retry_failed" type="object" attrs="{'invisible': ['|', ('state', '!=', 'done'), ('failed', '=', 0)]}" class="oe_highlight" string="Retry"/>
+
+ <field name="state" readonly="1" widget="statusbar"/>
+ </header>
+ <div class="alert alert-info text-center" role="alert" attrs="{'invisible': ['&amp;','&amp;','&amp;','&amp;',('state', '!=', 'in_queue'),('sent', '=', 0),('ignored', '=', 0),('scheduled', '=', 0),('failed', '=', 0)]}">
+ <div attrs="{'invisible': [('ignored', '=', 0)]}">
+ <button class="btn-link py-0"
+ name="action_view_traces_ignored"
+ type="object">
+ <strong>
+ <field name="ignored" class="oe_inline mr-2"/>
+ <span name="ignored_text">emails have been ignored and will not be sent.</span>
+ </strong>
+ </button>
+ </div>
+ <div attrs="{'invisible': [('scheduled', '=', 0)]}">
+ <button class="btn-link py-0"
+ name="action_view_traces_scheduled"
+ type="object">
+ <strong>
+ <field name="scheduled" class="oe_inline mr-2"/>
+ <span name="scheduled_text">emails are in queue and will be sent soon.</span>
+ </strong>
+ </button>
+ </div>
+ <div attrs="{'invisible': ['&amp;', ('sent', '=', 0), ('state', 'in', ('draft', 'test', 'in_queue'))]}">
+ <button class="btn-link py-0"
+ name="action_view_traces_sent"
+ type="object">
+ <strong>
+ <field name="sent" class="oe_inline mr-2"/>
+ <span name="sent">emails have been sent.</span>
+ </strong>
+ </button>
+ </div>
+ <div attrs="{'invisible': ['|', ('state', '!=', 'done'), ('failed', '=', 0)]}">
+ <button class="btn-link py-0"
+ name="action_view_traces_failed"
+ type="object">
+ <strong>
+ <field name="failed" class="oe_inline mr-2"/>
+ <span name="failed_text">emails could not be sent.</span>
+ </strong>
+ </button>
+ </div>
+ <div attrs="{'invisible': [('state', '!=', 'in_queue')]}">
+ <strong>
+ <span name="next_departure_text">This mailing is scheduled for </span>
+ <field name="next_departure" class="oe_inline"/>.
+ </strong>
+ </div>
+ </div>
+
+ <sheet>
+ <div class="oe_button_box" name="button_box">
+ <button name="action_view_delivered"
+ id="button_view_delivered"
+ type="object"
+ context="{'search_default_filter_delivered': True}"
+ attrs="{'invisible': [('state', 'in', ('draft','test'))]}"
+ class="oe_stat_button">
+ <field name="received_ratio" string="Received" widget="percentpie"/>
+ </button>
+ <button name="action_view_opened"
+ type="object"
+ context="{'search_default_filter_opened': True}"
+ attrs="{'invisible': [('state', 'in', ('draft','test'))]}"
+ class="oe_stat_button">
+ <field name="opened_ratio" string="Opened" widget="percentpie"/>
+ </button>
+ <button name="action_view_clicked"
+ type="object"
+ context="{'search_default_filter_clicked': True}"
+ attrs="{'invisible': [('state', 'in', ('draft','test'))]}"
+ class="oe_stat_button">
+ <field name="clicks_ratio" string="Clicked" widget="percentpie"/>
+ </button>
+ <button name="action_view_replied"
+ type="object"
+ context="{'search_default_filter_replied': True}"
+ attrs="{'invisible': [('state', 'in', ('draft','test'))]}"
+ class="oe_stat_button">
+ <field name="replied_ratio" string="Replied" widget="percentpie"/>
+ </button>
+ <button name="action_view_bounced"
+ type="object"
+ context="{'search_default_filter_bounced': True}"
+ attrs="{'invisible': [('state', 'in', ('draft','test'))]}"
+ class="oe_stat_button">
+ <field name="bounced_ratio" string="Bounced" widget="percentpie"/>
+ </button>
+ </div>
+ <widget name="web_ribbon" title="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
+ <group>
+ <field name="active" invisible="1"/>
+ <field name="mailing_type" widget="radio" options="{'horizontal': true}" invisible="1"
+ attrs="{'readonly': [('state', '!=', 'draft')]}" force_save="1"/>
+ <field name="subject" string="Subject" attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}" widget="char_emojis" placeholder="e.g. New Sale on all T-shirts"/>
+ <field name="preview" string="Preview Text" attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}" widget="char_emojis" placeholder="e.g. Check it out before it's too late!"/>
+ <label for="mailing_model_id" string="Recipients"/>
+ <div name="mailing_model_id_container">
+ <div class="row">
+ <div class="col-xs-12 col-md-3" >
+ <field name="mailing_model_id" widget="selection"
+ attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
+ </div>
+ <div attrs="{'invisible': [('mailing_model_name', '!=', 'mailing.list')]}" class="col-xs-12 col-md-9 pt-1">
+ <label for="contact_list_ids" string="Select mailing lists:" class="oe_edit_only"/>
+ <field name="contact_list_ids" widget="many2many_tags"
+ placeholder="Select mailing lists..." class="oe_inline"
+ attrs="{
+ 'required':[('mailing_model_name','=','mailing.list')],
+ 'readonly': [('state', 'in', ('sending', 'done'))]
+ }"/>
+ </div>
+ </div>
+
+ <field name="mailing_model_name" invisible="1"/>
+ <field name="mailing_model_real" invisible="1"/>
+ <div attrs="{'invisible': [('mailing_model_name', '=', 'mailing.list')]}">
+ <field name="mailing_domain" widget="domain" options="{'model': 'mailing_model_real'}"
+ attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
+ </div>
+ </div>
+ </group>
+ <notebook>
+ <page string="Mail Body" name="mail_body">
+ <field name="body_html" class="oe_read_only" widget="html"
+ options="{'cssReadonly': 'mass_mailing.iframe_css_assets_readonly'}"/>
+ <field name="body_arch" class="o_mail_body oe_edit_only" widget="mass_mailing_html"
+ options="{
+ 'snippets': 'mass_mailing.email_designer_snippets',
+ 'cssEdit': 'mass_mailing.iframe_css_assets_edit',
+ 'inline-field': 'body_html'
+ }" attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
+ </page>
+ <page string="Dynamic Placeholder Generator"
+ name="dynamic_placeholder_generator"
+ groups="base.group_no_one">
+ <group>
+ <field name="model_object_field" attrs="{'invisible': True}"/>
+ <field name="model_object_field"
+ domain="[('model_id','=',mailing_model_real),('ttype','!=','one2many'),('ttype','!=','many2many')]"/>
+ <field name="sub_object" readonly="1"/>
+ <field name="sub_model_object_field"
+ domain="[('model_id','=',sub_object),('ttype','!=','one2many'),('ttype','!=','many2many')]"
+ attrs="{'readonly':[('sub_object','=',False)],'required':[('sub_object','!=',False)]}"/>
+ <field name="null_value"/>
+ <field name="copyvalue"/>
+ </group>
+ </page>
+ <page string="Settings" name="settings">
+ <group>
+ <group>
+ <field name="id" invisible="1"/>
+ <field name="name" required="False" groups="base.group_no_one" string="Name"/>
+ <field name="user_id" domain="[('share', '=', False)]"/>
+ <field name="email_from" attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
+ <label for="reply_to"/>
+ <div name="reply_to_details">
+ <field name="reply_to_mode" widget="radio"
+ attrs="{
+ 'invisible': [('mailing_model_name', 'in', ['mailing.contact', 'res.partner', 'mailing.list'])],
+ 'readonly': [('state', 'in', ('sending', 'done'))]
+ }"/>
+ <field name="reply_to"
+ attrs="{
+ 'required': [('reply_to_mode', '=', 'email')],
+ 'invisible': [('reply_to_mode', '=', 'thread')],
+ 'readonly': [('state', 'in', ('sending', 'done'))]
+ }"/>
+ <div style="margin-top:-5px">
+ <small class="oe_edit_only text-muted mb-2"
+ style="font-size:74%"
+ attrs="{'invisible': ['|', ('reply_to_mode', '=', 'thread'), ('mailing_model_name', 'in', ['mailing.contact', 'res.partner', 'mailing.list'])],}">
+ To track replies, this address must belong to this database.
+ </small>
+ </div>
+ </div>
+ <label for="attachment_ids"/>
+ <div name="attachment_ids_details">
+ <field name="attachment_ids" widget="many2many_binary" string="Attach a file" class="oe_inline"
+ attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
+ </div>
+ <field name="mail_server_id" groups="base.group_no_one" options="{'no_create': True, 'no_open': True}"/>
+ <field name="keep_archives" groups="base.group_no_one" attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
+ </group>
+ <group string="Marketing" groups="base.group_no_one,mass_mailing.group_mass_mailing_campaign">
+ <field name="campaign_id"
+ string="Mailing Campaign"
+ groups="mass_mailing.group_mass_mailing_campaign"
+ attrs="{'readonly': [('state', 'in', ('sending', 'done'))],
+ 'required': [('unique_ab_testing', '=', True)]}"/>
+ <field name="source_id"
+ string="Source"
+ readonly="1"
+ required="False"
+ groups="base.group_no_one"
+ attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
+ <field name="medium_id"
+ string="Medium"
+ required="True"
+ groups="base.group_no_one"
+ attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
+ <field name="unique_ab_testing"
+ groups="mass_mailing.group_mass_mailing_campaign"
+ attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
+ <label for="contact_ab_pc" groups="mass_mailing.group_mass_mailing_campaign"/>
+ <div groups="mass_mailing.group_mass_mailing_campaign">
+ <field name="contact_ab_pc"
+ class="oe_inline"
+ attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/> %
+ </div>
+ </group>
+ </group>
+ </page>
+ </notebook>
+ </sheet>
+ <div class="oe_chatter">
+ <field name="message_follower_ids" groups="base.group_user"/>
+ <field name="message_ids"/>
+ <field name="activity_ids"/>
+ </div>
+ </form>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="view_mail_mass_mailing_kanban">
+ <field name="name">mailing.mailing.kanban</field>
+ <field name="model">mailing.mailing</field>
+ <field name="arch" type="xml">
+ <kanban default_group_by="state" quick_create="false" sample="1">
+ <field name='state' readonly="1"/>
+ <field name='email_from' readonly="1"/>
+ <field name='color'/>
+ <field name='user_id'/>
+ <field name='expected'/>
+ <field name='failed'/>
+ <field name='total'/>
+ <field name='mailing_model_id'/>
+ <field name='mailing_model_name'/>
+ <field name='sent_date'/>
+ <field name='schedule_date'/>
+ <field name='next_departure'/>
+ <field name='active'/>
+ <templates>
+ <t t-name="kanban-box">
+ <div t-attf-class="{{!selection_mode ? 'oe_kanban_color_' + kanban_getcolor(record.color.raw_value) : ''}} oe_kanban_card oe_kanban_global_click oe_kanban_mass_mailing">
+ <div class="o_dropdown_kanban dropdown" t-if="!selection_mode">
+ <a role="button" class="dropdown-toggle o-no-caret btn" data-toggle="dropdown" href="#" data-display="static" aria-label="Dropdown menu" title="Dropdown menu">
+ <span class="fa fa-ellipsis-v"/>
+ </a>
+ <div class="dropdown-menu" role="menu">
+ <ul class="oe_kanban_colorpicker" data-field="color"/>
+ <t t-if="widget.deletable">
+ <a role="menuitem" type="delete" class="dropdown-item">Delete</a>
+ </t>
+ <a role="menuitem" class="dropdown-item o_kanban_mailing_active" name="toggle_active" type="object">
+ <t t-if="record.active.raw_value">Archive</t>
+ <t t-if="!record.active.raw_value">Restore</t>
+ </a>
+ </div>
+ </div>
+ <div class="oe_kanban_content">
+ <div class="o_kanban_record_top">
+ <div class="o_kanban_record_headings">
+ <div class="row" attrs="{'invisible': [('sent_date', '=', False)]}">
+ <h3 class="my-1 col-8 o_text_overflow">
+ <field name="subject"/>
+ </h3>
+ <div class="progress border col-3 px-0 mt-2" style="background-color: inherit; height:12px;">
+ <div class="progress-bar" role="progressbar"
+ aria-valuemin="0"
+ t-att-aria-valuenow="record.delivered.raw_value"
+ t-att-aria-valuemax="record.expected.raw_value"
+ t-attf-style="width: #{record.delivered.raw_value * 100 / record.expected.raw_value}%"/>
+ </div>
+ </div>
+ <h3 class="my-1 o_text_overflow" attrs="{'invisible': [('sent_date', '!=', False)]}">
+ <field name="subject"/>
+ </h3>
+ <field name="mailing_type" invisible="1"/>
+ <div class="o_kanban_record_subtitle" attrs="{'invisible': [('sent_date', '=', False)]}">
+ <h5 style="display: inline;">
+ <field name="campaign_id" groups="mass_mailing.group_mass_mailing_campaign"/>
+ </h5>
+ </div>
+ </div>
+ </div>
+ <div class="o_kanban_record_body" t-if="!selection_mode" attrs="{'invisible': [('sent_date', '=', False), ('schedule_date', '=', False), ('state', '!=', 'in_queue')]}">
+ <div>
+ <span attrs="{'invisible': [('sent_date', '=', False)]}"><b><field name="delivered"/> / <field name="expected"/></b> Delivered to</span>
+ <span attrs="{'invisible': [('sent_date', '!=', False)]}"><b><field name='total'/></b></span>
+ <field name='mailing_model_id' attrs="{'invisible': [('mailing_model_name','=','mailing.list')]}"/>
+ <span attrs="{'invisible': [('mailing_model_name','!=','mailing.list')]}">Mailing Contact</span>
+ </div>
+ <div attrs="{'invisible': [('sent_date', '=', False)]}" class="d-flex justify-content-between">
+ <div name="stat_opened">
+ <b><field name="opened_ratio" />%</b> Opened
+ </div>
+ <div name="stat_replied">
+ <b><field name="replied_ratio" />%</b> Replied
+ </div>
+ <div name="stat_clicks">
+ <b><field name="clicks_ratio" />%</b> Clicks
+ </div>
+ </div>
+ </div>
+ </div>
+ <div name="div_responsible_avatar" class="o_kanban_record_bottom">
+ <div class="oe_kanban_bottom_left">
+ <span attrs="{'invisible': [('sent_date', '=', False)]}"
+ t-attf-title="Sent on #{record.sent_date.value}" class="d-inline-flex">
+ <span class="fa fa-calendar-check-o mr-2 small my-auto" aria-label="Sent date"/>
+ <span class="align-self-baseline"><field name="sent_date" widget="date"/></span>
+ </span>
+ <span attrs="{'invisible': [('schedule_date', '=', False)]}"
+ t-attf-title="Scheduled on #{record.schedule_date.value}" class="d-inline-flex">
+ <span class="fa fa-hourglass-half mr-2 small my-auto" aria-label="Scheduled date"/>
+ <span class="align-self-baseline"><field name="schedule_date" widget="date"/></span>
+ </span>
+ <span attrs="{'invisible': ['|', '|', ('sent_date', '!=', False), ('schedule_date', '!=', False), ('state', '=', 'in_queue')]}"
+ class="oe_clear">
+ <b><field name='total'/></b>
+ <field name='mailing_model_id' attrs="{'invisible': [('mailing_model_name','=','mailing.list')]}"/>
+ <span attrs="{'invisible': [('mailing_model_name','!=','mailing.list')]}">Mailing Contact</span>
+ </span>
+ <span attrs="{'invisible': ['|', '|', ('schedule_date', '!=', False), ('state', '!=', 'in_queue'), ('next_departure', '=', False)]}"
+ t-attf-title="Scheduled on #{record.next_departure.value}" class="d-inline-flex">
+ <span class="fa fa-hourglass-o mr-2 small my-auto" aria-label="Scheduled date"/>
+ <span class="align-self-baseline">Next Batch</span>
+ </span>
+ </div>
+ <div class="oe_kanban_bottom_right">
+ <field name="user_id" widget="many2one_avatar_user"/>
+ </div>
+ </div>
+ </div>
+ </t>
+ </templates>
+ </kanban>
+ </field>
+ </record>
+
+ <record id="view_mail_mass_mailing_graph" model="ir.ui.view">
+ <field name="name">mailing.mailing.graph</field>
+ <field name="model">mailing.mailing</field>
+ <field name="arch" type="xml">
+ <graph string="Mailing" type="bar" sample="1">
+ <field name="state" type="row"/>
+ </graph>
+ </field>
+ </record>
+
+ <record id="mailing_mailing_action_mail" model="ir.actions.act_window">
+ <field name="name">Mailings</field>
+ <field name="res_model">mailing.mailing</field>
+ <field name="view_mode">kanban,tree,form,graph</field>
+ <field name="domain">[('mailing_type', '=', 'mail')]</field>
+ <field name="context">{
+ 'search_default_assigned_to_me': 1,
+ 'default_user_id': uid,
+ 'default_mailing_type': 'mail',
+ }</field>
+ <field name="help" type="html">
+ <p class="o_view_nocontent_smiling_face">
+ Create a new mailing
+ </p><p>
+ You don't need to import your mailing lists, you can easily
+ send emails<br/> to any contact saved in other Odoo apps.
+ </p>
+ </field>
+ </record>
+
+ <record id="action_view_mass_mailings_from_campaign" model="ir.actions.act_window">
+ <field name="name">Mailings</field>
+ <field name="res_model">mailing.mailing</field>
+ <field name="view_mode">kanban,tree,form</field>
+ <field name="context">{
+ 'search_default_assigned_to_me': 1,
+ 'search_default_campaign_id': [active_id],
+ 'default_campaign_id': active_id,
+ 'default_user_id': uid,
+ }
+ </field>
+ <field name="domain">[('mailing_type', '=', 'mail')]</field>
+ <field name="help" type="html">
+ <p class="o_view_nocontent_smiling_face">
+ Create a new mailing
+ </p><p>
+ You don't need to import your mailing lists, you can easily
+ send emails<br/> to any contact saved in other Odoo apps.
+ </p>
+ </field>
+ </record>
+
+ <record id="action_create_mass_mailings_from_campaign" model="ir.actions.act_window">
+ <field name="name">Mailings</field>
+ <field name="res_model">mailing.mailing</field>
+ <field name="view_mode">form,kanban,tree</field>
+ <field name="context">{
+ 'search_default_assigned_to_me': 1,
+ 'search_default_campaign_id': [active_id],
+ 'default_campaign_id': active_id,
+ 'default_user_id': uid,
+ }
+ </field>
+ <field name="help" type="html">
+ <p class="o_view_nocontent_smiling_face">
+ Create a new mailing
+ </p><p>
+ You don't need to import your mailing lists, you can easily
+ send emails<br/> to any contact saved in other Odoo apps.
+ </p>
+ </field>
+ </record>
+
+ <menuitem name="Mailings" id="mass_mailing_menu"
+ parent="mass_mailing_menu_root"
+ sequence="1"
+ action="mailing_mailing_action_mail"
+ groups="mass_mailing.group_mass_mailing_user"/>
+
+</odoo>
diff --git a/addons/mass_mailing/views/mailing_mailing_views_menus.xml b/addons/mass_mailing/views/mailing_mailing_views_menus.xml
new file mode 100644
index 00000000..f6d3b692
--- /dev/null
+++ b/addons/mass_mailing/views/mailing_mailing_views_menus.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <!-- Marketing / Mailing -->
+ <menuitem name="Email Marketing" id="mass_mailing_menu_root" sequence="60" web_icon="mass_mailing,static/description/icon.png"/>
+ <menuitem name="Mailing Lists" id="mass_mailing_mailing_list_menu"
+ parent="mass_mailing_menu_root" sequence="2" groups="mass_mailing.group_mass_mailing_user"/>
+
+ <!-- Marketing / Configuration -->
+ <menuitem name="Configuration" id="mass_mailing_configuration"
+ parent="mass_mailing_menu_root"
+ sequence="100"
+ groups="mass_mailing.group_mass_mailing_user"/>
+
+ <!-- Configuration / Blacklist -->
+ <menuitem id="mail_blacklist_mm_menu" name="Blacklisted Email Addresses"
+ action="mail.mail_blacklist_action"
+ parent="mass_mailing_configuration"/>
+
+ <!-- Technical / Mass Mailing -->
+ <menuitem id="mailing_mailing_menu_technical"
+ name="Mass Mailing"
+ sequence="4"
+ parent="base.menu_custom"/>
+</odoo>
diff --git a/addons/mass_mailing/views/mailing_trace_views.xml b/addons/mass_mailing/views/mailing_trace_views.xml
new file mode 100644
index 00000000..f715384e
--- /dev/null
+++ b/addons/mass_mailing/views/mailing_trace_views.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <!-- MAILING TRACE !-->
+ <record model="ir.ui.view" id="mailing_trace_view_search">
+ <field name="name">mailing.trace.search</field>
+ <field name="model">mailing.trace</field>
+ <field name="arch" type="xml">
+ <search string="Mail Statistics">
+ <field name="mail_mail_id_int"/>
+ <field name="message_id"/>
+ <field name="email"/>
+ <field name="mass_mailing_id"/>
+ <filter string="Scheduled" name="filter_scheduled" domain="[('scheduled', '!=', False), ('sent', '=', False), ('exception', '=', False), ('ignored', '=', False), ('bounced', '=', False)]"/>
+ <filter string="Ignored" name="filter_ignored" domain="[('scheduled', '!=', False), ('sent', '=', False), ('exception', '=', False), ('ignored', '!=', False)]"/>
+ <filter string="Sent" name="filter_sent" domain="[('sent', '!=', False)]"/>
+ <filter string="Delivered" name="filter_delivered" domain="[('sent', '!=', False), ('exception', '=', False), ('bounced', '=', False)]"/>
+ <separator/>
+ <filter string="Opened" name="filter_opened" domain="[('opened', '!=', False)]"/>
+ <filter string="Clicked" name="filter_clicked" domain="[('clicked', '!=', False)]"/>
+ <filter string="Replied" name="filter_replied" domain="[('replied', '!=', False)]"/>
+ <filter string="Bounced" name="filter_bounced" domain="[('bounced', '!=', False)]"/>
+ <filter string="Failed" name="filter_failed" domain="[('exception', '!=', False)]"/>
+ <group expand="0" string="Group By">
+ <filter string="State" name="state" domain="[]" context="{'group_by':'state'}"/>
+ <filter string="Open Date" name="group_open_date" context="{'group_by': 'opened:day'}"/>
+ <filter string="Reply Date" name="group_reply_date" context="{'group_by': 'replied:day'}"/>
+ <filter string="Last State Update" name="state_update" domain="[]" context="{'group_by':'state_update'}"/>
+ <filter string="Mass Mailing" name="mass_mailing" domain="[]" context="{'group_by':'mass_mailing_id'}"/>
+ </group>
+ </search>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="mailing_trace_view_tree">
+ <field name="name">mailing.trace.tree</field>
+ <field name="model">mailing.trace</field>
+ <field name="arch" type="xml">
+ <tree string="Mail Statistics" create="0">
+ <field name="mass_mailing_id"/>
+ <field name="email"/>
+ <field name="state"/>
+ <field name="message_id"/>
+ <field name="scheduled"/>
+ <field name="sent"/>
+ <field name="exception"/>
+ <field name="opened"/>
+ <field name="clicked"/>
+ <field name="replied"/>
+ <field name="bounced"/>
+ <field name="ignored"/>
+ </tree>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="mailing_trace_view_form">
+ <field name="name">mailing.trace.form</field>
+ <field name="model">mailing.trace</field>
+ <field name="arch" type="xml">
+ <form string="Mail Statistics" create="0">
+ <header>
+ <field name="state" widget="statusbar"/>
+ </header>
+ <sheet>
+ <div class="alert alert-info text-center" role="alert" name="alert_mail_exception"
+ attrs="{'invisible': [('exception', '=', False), ('bounced', '=', False)]}">
+ <p>
+ <strong><span name="trace_type_name_mail">This email</span>
+ <span attrs="{'invisible': [('exception', '=', False)]}"> could not be sent</span>
+ <span attrs="{'invisible': [('bounced', '=', False)]}"> appears to be invalid</span>
+ </strong>
+ </p>
+ </div>
+ <group>
+ <group string="Recipient">
+ <field name="trace_type" invisible="1"/>
+ <field name="email"/>
+ <field name="mail_mail_id_int"/>
+ <field name="message_id"/>
+ </group>
+ <group string="Document">
+ <field name="model"/>
+ <field name="res_id"/>
+ <field name="state_update"/>
+ </group>
+ </group>
+ <group string="Marketing">
+ <group>
+ <field name="mass_mailing_id"/>
+ <field name="campaign_id"/>
+ <field name="sent"/>
+ <field name="opened"/>
+ <field name="clicked"/>
+ <field name="replied"/>
+ </group>
+ <group>
+ <field name="exception"/>
+ <field name="ignored"/>
+ <field name="bounced"/>
+ <field name="failure_type"/>
+ </group>
+ </group>
+ </sheet>
+ </form>
+ </field>
+ </record>
+
+ <record id="view_mail_mail_statistics_graph" model="ir.ui.view">
+ <field name="name">Mail Statistics Graph</field>
+ <field name="model">mailing.trace</field>
+ <field name="arch" type="xml">
+ <graph string="Mail Statistics" type="bar" stacked="True" interval="day" sample="1">
+ <field name="state_update" type="row" interval="day"/>
+ <field name="state" type="row"/>
+ </graph>
+ </field>
+ </record>
+
+ <record id="mailing_trace_action" model="ir.actions.act_window">
+ <field name="name">Mailing Traces</field>
+ <field name="res_model">mailing.trace</field>
+ <field name="view_mode">tree,form,graph,pivot</field>
+ <field name="domain">[]</field>
+ </record>
+
+ <record id="action_view_mail_mail_statistics_mailing" model="ir.actions.act_window">
+ <field name="name">Mail Statistics</field>
+ <field name="res_model">mailing.trace</field>
+ <field name="view_mode">graph,tree,form,pivot</field>
+ <field name="domain">[]</field>
+ <field name="context">{'search_default_mass_mailing_id': active_id}</field>
+ <field name="help" type="html">
+ <p class="o_view_nocontent_smiling_face">
+ No data yet!
+ </p>
+ </field>
+ </record>
+
+ <!-- Add in Technical/Email -->
+ <menuitem id="menu_email_statistics"
+ name="Mailing Traces"
+ parent="mass_mailing.mailing_mailing_menu_technical" sequence="2"
+ action="mailing_trace_action"/>
+</odoo>
diff --git a/addons/mass_mailing/views/mass_mailing_templates_portal.xml b/addons/mass_mailing/views/mass_mailing_templates_portal.xml
new file mode 100644
index 00000000..52da35d4
--- /dev/null
+++ b/addons/mass_mailing/views/mass_mailing_templates_portal.xml
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <template id="unsubscribe">
+ <div class="container o_unsubscribe_form">
+ <div class="row">
+ <form action="/mail/mailing/unsubscribe" method="POST" id="unsubscribe_form" class="col-lg-6 offset-lg-3 mt-4">
+ <input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
+ <input type="hidden" name="email" t-att-value="email"/>
+ <input type="hidden" name="mailing_id" t-att-value="mailing_id"/>
+ <input type="hidden" name="res_id" t-att-value="res_id"/>
+ <input type="hidden" name="unsubscribed_list" t-att-value="unsubscribed_list"/>
+
+ <div>
+ <t t-if="contacts">
+ <div id="info_state" class="alert alert-success" role="status">
+ <div id="subscription_info"></div>
+ <div id="div_feedback">
+ <p>We would appreciate if you provide feedback about why you updated<br/>your subscriptions</p>
+ <textarea class="form-control" name="opt_out_feedback" cols="60" rows="3"></textarea>
+ <br/>
+ <div class="btn btn-primary text-left" id="button_feedback">Send</div>
+ </div>
+ </div>
+
+ <h1 class="o_page_header">Mailing Subscriptions</h1>
+ <p>Choose your mailing subscriptions</p>
+ <div id="div_opt_out">
+ <ul class="list-group">
+ <t t-foreach="list_ids" t-as="list_id">
+ <t t-if="list_id.is_public == True">
+ <li class="list-group-item">
+ <input type="checkbox" class="mail_list_checkbox" name="contact_ids"
+ t-att-value="list_id['id']" t-att-checked="None if list_id['id'] in opt_out_list_ids else 'checked'"/>
+ <t t-esc="list_id.name"/>
+ <span t-if="list_id['id'] in opt_out_list_ids"
+ class="o_mass_mailing_unsubscribed">
+ Unsubscribed
+ </span>
+ </li>
+ </t>
+ </t>
+ </ul>
+
+ <div class="mb64 pt-3">
+ <div t-if="show_blacklist_button">
+ <div class="btn btn-secondary pull-right" id="button_add_blacklist" style="display:none">Blacklist Me</div>
+ </div>
+ <div class="btn btn-secondary pull-right" id="button_remove_blacklist" style="display:none">Come Back</div>
+ <button type="submit" id="send_form" class="btn btn-primary">Update my subscriptions</button>
+ </div>
+ </div>
+
+ </t>
+ <t t-else="">
+ <div class="alert alert-info text-center" role="status">
+ <p>You are not subscribed to any of our mailing list.</p>
+ </div>
+ </t>
+ </div>
+ </form>
+ </div>
+ </div>
+ </template>
+
+ <template id="unsubscribed">
+ <div class="container o_unsubscribe_form">
+ <div class="row">
+ <input type="hidden" name="email" t-att-value="email"/>
+ <input type="hidden" name="mailing_id" t-att-value="mailing_id"/>
+ <input type="hidden" name="res_id" t-att-value="res_id"/>
+ <div id="div_blacklist" class="col-lg-6 offset-lg-3">
+ <h1 class="o_page_header">Mailing Subscriptions</h1>
+
+ <div id="subscription_info" class="alert alert-success text-center" role="status">
+ <p>You have been successfully <strong>unsubscribed</strong>!</p>
+ </div>
+
+ <div t-if="list_ids" class="alert alert-warning">
+ <p class="text-center">You were still subscribed to those newsletters. You will not receive any news from them anymore:</p>
+ <ul class="list-group mb-4">
+ <t t-foreach="list_ids" t-as="list_id">
+ <t t-if="list_id.is_public == True">
+ <li class="list-group-item bg-transparent">
+ <strong><t t-esc="list_id.name"/></strong>
+ </li>
+ </t>
+ </t>
+ </ul>
+ </div>
+
+ <div t-if="show_blacklist_button" class="mb64">
+ <div class="btn btn-secondary pull-right" id="button_add_blacklist" style="display:none">Blacklist Me</div>
+ <div class="btn btn-secondary pull-right" id="button_remove_blacklist" style="display:none">Come Back</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </template>
+
+ <template id="view" name="Browser View">
+ <!-- Raw body inserted here because it is a rendered mailing, therefore internal content -->
+ <t t-raw="body"/>
+ </template>
+
+ <template id="page_unsubscribe" name="Unsubscribe">
+ <t t-call="mass_mailing.layout">
+ <t t-call="mass_mailing.unsubscribe"/>
+ </t>
+ </template>
+
+ <template id="page_unsubscribed" name="Unsubscribed">
+ <t t-call="mass_mailing.layout">
+ <t t-call="mass_mailing.unsubscribed"/>
+ </t>
+ </template>
+
+ <!-- new layout for mass_mailing -->
+ <template id="mass_mailing.layout" name="Mass Mailing Layout">
+ <t t-call="web.layout">
+ <t t-set="head">
+ <t t-call-assets="web.assets_common"/>
+ <t t-call-assets="mass_mailing.assets_backend"/>
+ </t>
+ <body class="o_white_body">
+ <header>
+ <div><title>Odoo</title></div>
+ <div class="text-center">
+ <img t-attf-src="/web/binary/company_logo?company={{ res_company.id }}"/>
+ </div>
+ </header>
+ <div id="wrap" class="oe_structure oe_empty"/>
+ <main>
+ <t t-raw="0"/>
+ </main>
+ </body>
+ <xpath expr="//footer" position="replace">
+ <div class="container mt16 mb8">
+ <div class="pull-right" t-ignore="true" t-if="not editable">
+ Create a <a target="_blank" href="https://www.odoo.com/page/website-builder">free website</a> with
+ <a target="_blank" class="label label-danger" href="https://www.odoo.com/page/website-builder">Odoo</a>
+ </div>
+ <div class="pull-left text-muted" itemscope="itemscope" itemtype="https://schema.org/Organization">
+ <t t-call="web.debug_icon"/>
+ Copyright &amp;copy; <span t-field="res_company.name" itemprop="name">Company name</span>
+ </div>
+ </div>
+ </xpath>
+ </t>
+ </template>
+</odoo>
diff --git a/addons/mass_mailing/views/res_config_settings_views.xml b/addons/mass_mailing/views/res_config_settings_views.xml
new file mode 100644
index 00000000..d1d9cd5b
--- /dev/null
+++ b/addons/mass_mailing/views/res_config_settings_views.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <record id="res_config_settings_view_form" model="ir.ui.view">
+ <field name="name">res.config.settings.view.form.inherit.mass.mailing</field>
+ <field name="model">res.config.settings</field>
+ <field name="priority" eval="60"/>
+ <field name="inherit_id" ref="base.res_config_settings_view_form"/>
+ <field name="arch" type="xml">
+ <xpath expr="//div[hasclass('settings')]" position="inside">
+ <div class="app_settings_block" data-string="Email Marketing" string="Email Marketing" data-key="mass_mailing" groups="mass_mailing.group_mass_mailing_user">
+ <h2>Email Marketing</h2>
+ <div class="row mt16 o_settings_container" name="managa_mail_campaigns_setting_container">
+ <div class="col-lg-6 o_setting_box col-12" title="This tool is advised if your marketing campaign is composed of several emails.">
+ <div class="o_setting_left_pane" title="This is useful if your marketing campaigns are composed of several emails.">
+ <field name="group_mass_mailing_campaign"/>
+ </div>
+ <div class="o_setting_right_pane">
+ <label for="group_mass_mailing_campaign"/>
+ <div class="text-muted">
+ Manage mass mailing campaigns
+ </div>
+ </div>
+ </div>
+ <div class="col-lg-6 o_setting_box col-12" name="dedicated_server_setting_container">
+ <div class="o_setting_left_pane" title="Use a specific mail server in priority. Otherwise Odoo relies on the first outgoing mail server available (based on their sequencing) as it does for normal mails.">
+ <field name="mass_mailing_outgoing_mail_server"/>
+ </div>
+ <div class="o_setting_right_pane">
+ <label for="mass_mailing_outgoing_mail_server"/>
+ <div class="text-muted">
+ Use a dedicated server for mailings
+ </div>
+ <div class="content-group" attrs="{'invisible': [('mass_mailing_outgoing_mail_server', '=', False)]}">
+ <div class="mt16">
+ <field name="mass_mailing_mail_server_id" options="{'no_create': True, 'no_open': True}"/>
+ </div>
+ <div class="mt8">
+ <button type="action" name="base.action_ir_mail_server_list" string="Configure Email Server" icon="fa-arrow-right" class="oe_link"/>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="col-md-6 o_setting_box col-xs-12" name="allow_blacklist_setting_container">
+ <div class="o_setting_left_pane" title="Allow the recipient to manage himself his state in the blacklist via the unsubscription page.
+ If the option is active, the 'Blacklist Me' button is hidden on the unsubscription page.
+ The 'come Back' button will always be visible in any case to allow leads and partners to re-subscribe.">
+ <field name="show_blacklist_buttons"/>
+ </div>
+ <div class="o_setting_right_pane">
+ <label for="show_blacklist_buttons"/>
+ <div class="text-muted">
+ Allow recipients to blacklist themselves
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </xpath>
+ </field>
+ </record>
+
+ <record id="action_mass_mailing_configuration" model="ir.actions.act_window">
+ <field name="name">Settings</field>
+ <field name="type">ir.actions.act_window</field>
+ <field name="res_model">res.config.settings</field>
+ <field name="view_mode">form</field>
+ <field name="target">inline</field>
+ <field name="context">{'module' : 'mass_mailing', 'bin_size': False}</field>
+ </record>
+
+ <menuitem id="menu_mass_mailing_global_settings" name="Settings"
+ parent="mass_mailing_configuration" sequence="0" action="action_mass_mailing_configuration" groups="base.group_system"/>
+</odoo>
diff --git a/addons/mass_mailing/views/snippets_themes.xml b/addons/mass_mailing/views/snippets_themes.xml
new file mode 100644
index 00000000..a5dc2fd3
--- /dev/null
+++ b/addons/mass_mailing/views/snippets_themes.xml
@@ -0,0 +1,877 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+<!-- Snippets & Themes Menu -->
+<template id="email_designer_snippets" inherit_id="web_editor.snippets" primary="True" groups="base.group_user">
+ <xpath expr="//div[@id='snippets_menu']" position="inside">
+ <button type="button" disabled="disabled">Select a template</button>
+ </xpath>
+ <xpath expr="//t[@id='default_snippets']" position="replace">
+ <t id="default_snippets">
+ <t t-set="company_id" t-value="res_company"/>
+ <div id="email_designer_themes">
+ <div data-name="basic"
+ data-nowrap="1"
+ data-img="/mass_mailing/static/src/img/theme_imgs/basic_thumb"
+ data-images-info='{"logo": {"format": "png"}}'>
+ <t t-call="mass_mailing.theme_basic_template"/>
+ </div>
+ <div data-name="default"
+ data-img="/mass_mailing/static/src/img/theme_imgs/default_thumb"
+ data-images-info='{"logo": {"format": "png"}}'>
+ <t t-call="mass_mailing.theme_default_template"/>
+ </div>
+ </div>
+ <div id="email_designer_default_headers" class="o_panel">
+ <div class="o_panel_header">Headers</div>
+ <div class="o_panel_body" id="email_designer_header_elements">
+ <t t-snippet="mass_mailing.s_mail_block_header_social" t-thumbnail="/mass_mailing/static/src/img/blocks/block_header_social.png"/>
+ <t t-snippet="mass_mailing.s_mail_block_header_text_social" t-thumbnail="/mass_mailing/static/src/img/blocks/block_header_text_social.png"/>
+ <t t-snippet="mass_mailing.s_mail_block_header_logo" t-thumbnail="/mass_mailing/static/src/img/blocks/block_header_logo.png"/>
+ <t t-snippet="mass_mailing.s_mail_block_banner" t-thumbnail="/mass_mailing/static/src/img/blocks/block_banner.png"/>
+ <t t-snippet="mass_mailing.s_mail_block_header_view" t-thumbnail="/mass_mailing/static/src/img/blocks/block_header_browser.png"/>
+ </div>
+ </div>
+ <div id="email_designer_default_body" class="o_panel">
+ <div class="o_panel_header">Body</div>
+ <div class="o_panel_body" id="email_designer_body_elements">
+ <t t-snippet="mass_mailing.s_mail_block_title_text" t-thumbnail="/mass_mailing/static/src/img/blocks/block_title_text.png"/>
+ <t t-snippet="mass_mailing.s_mail_block_title_sub" t-thumbnail="/mass_mailing/static/src/img/blocks/block_title_sub.png"/>
+ <t t-snippet="mass_mailing.s_mail_block_paragraph" t-thumbnail="/mass_mailing/static/src/img/blocks/block_paragraph.png"/>
+ <t t-snippet="mass_mailing.s_mail_block_comparison_table" t-thumbnail="/mass_mailing/static/src/img/blocks/block_comparison_table.png"/>
+ <t t-snippet="mass_mailing.s_mail_block_two_cols" t-thumbnail="/mass_mailing/static/src/img/blocks/block_two_cols.png"/>
+ <t t-snippet="mass_mailing.s_mail_block_three_cols" t-thumbnail="/mass_mailing/static/src/img/blocks/block_three_cols.png"/>
+ <t t-snippet="mass_mailing.s_mail_block_image_text" t-thumbnail="/mass_mailing/static/src/img/blocks/block_image_text.png"/>
+ <t t-snippet="mass_mailing.s_mail_block_text_image" t-thumbnail="/mass_mailing/static/src/img/blocks/block_text_image.png"/>
+ <t t-snippet="mass_mailing.s_mail_block_image" t-thumbnail="/mass_mailing/static/src/img/blocks/block_image.png"/>
+ <t t-snippet="mass_mailing.s_mail_block_footer_separator" t-thumbnail="/mass_mailing/static/src/img/blocks/block_footer_separator.png"/>
+ <t t-snippet="mass_mailing.s_mail_block_footer_tag_line" t-thumbnail="/mass_mailing/static/src/img/blocks/block_footer_tag_line.png"/>
+ </div>
+ </div>
+ <div id="email_designer_default_extra" class="o_panel">
+ <div class="o_panel_header">Marketing Content</div>
+ <div class="o_panel_body" id="email_designer_marketing_elements">
+ <t t-snippet="mass_mailing.s_mail_block_discount2" t-thumbnail="/mass_mailing/static/src/img/blocks/block_discount2.png"/>
+ <t t-snippet="mass_mailing.s_mail_block_discount1" t-thumbnail="/mass_mailing/static/src/img/blocks/block_discount1.png"/>
+ <t t-snippet="mass_mailing.s_mail_block_event" t-thumbnail="/mass_mailing/static/src/img/blocks/block_event.png"/>
+ <t t-snippet="mass_mailing.s_mail_block_steps" t-thumbnail="/mass_mailing/static/src/img/blocks/block_steps.png"/>
+ </div>
+ </div>
+ <div id="email_designer_default_footer" class="o_panel">
+ <div class="o_panel_header">Footers</div>
+ <div class="o_panel_body" id="email_designer_footer_elements">
+ <t t-snippet="mass_mailing.s_mail_block_footer_social" t-thumbnail="/mass_mailing/static/src/img/blocks/block_footer_social.png"/>
+ <t t-snippet="mass_mailing.s_mail_block_footer_social_left" t-thumbnail="/mass_mailing/static/src/img/blocks/block_footer_social_left.png"/>
+ </div>
+ </div>
+ </t>
+ </xpath>
+ <xpath expr="//div[@id='snippet_options']/t" position="attributes">
+ <attribute name="t-call">mass_mailing.snippet_options</attribute>
+ </xpath>
+</template>
+
+<!-- Snippet Templates -->
+<template id="s_mail_block_header_social" name="Left Logo">
+ <div class="o_mail_block_header_social">
+ <div class="o_mail_snippet_general">
+ <table align="center" cellspacing="0" cellpadding="0" border="0" class="o_mail_table_styles">
+ <tr>
+ <td width="70%" class="o_mail_logo_container o_mail_h_padding o_mail_v_padding">
+ &amp;nbsp;
+ <a t-att-href="(company_id.website) or '#'" style="text-decoration:none;float:none;">
+ <img border="0" src="/mass_mailing/static/src/img/theme_basic/s_default_image_logo.png" style="height:auto;max-width:400px;" alt="Your Logo" />
+ </a>
+ &amp;nbsp;
+ </td>
+ <td width="30%" class="text-right o_mail_no_resize">
+ <div class="o_mail_header_social">
+ <t t-call="mass_mailing.social_links"/>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </div>
+</template>
+
+<template id="s_mail_block_header_text_social" name="Left Text">
+ <div class="o_mail_block_header_text_social">
+ <div class="o_mail_snippet_general">
+ <table align="center" cellspacing="0" cellpadding="0" border="0" class="o_mail_table_styles">
+ <tr>
+ <td width="70%" class="o_mail_h_padding o_mail_v_padding">
+ &amp;nbsp;
+ <h3>
+ <a t-att-href="(company_id.website) or '#'">
+ My Company
+ </a>
+ </h3>
+ &amp;nbsp;
+ </td>
+ <td width="30%" class="text-right o_mail_no_resize">
+ <div class="o_mail_header_social">
+ <t t-call="mass_mailing.social_links"/>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </div>
+</template>
+
+<template id="s_mail_block_header_logo" name="Centered Logo">
+ <div class="o_mail_block_header_logo">
+ <div class="o_mail_snippet_general">
+ <table align="center" cellspacing="0" cellpadding="0" border="0" class="o_mail_table_styles o_mail_h_padding">
+ <tr>
+ <td width="35%"/>
+ <td valign="center" width="30%" class="text-center o_mail_v_padding">
+ <a t-att-href="(company_id.website) or '#'" style="text-decoration:none;">
+ <img border="0" src="/mass_mailing/static/src/img/theme_basic/s_default_image_logo.png" style="height:auto;max-width:400px;width:auto"/>
+ </a>
+ </td>
+ <td width="35%" style="text-align:right"/>
+ </tr>
+ </table>
+ </div>
+ </div>
+</template>
+
+<template id="s_mail_block_banner" name="Banner">
+ <div class="o_mail_block_banner">
+ <div class="o_mail_snippet_general">
+ <table align="center" cellspacing="0" cellpadding="0" border="0" class="o_mail_table_styles">
+ <tbody>
+ <tr>
+ <td width="100%" valign="top" class="o_mail_full_width_padding o_mail_no_colorpicker">
+ <a href="#">
+ <img src="/mass_mailing/static/src/img/theme_basic/s_default_image_block_banner.jpg" class="d-block mx-auto"/>
+ </a>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</template>
+
+<template id="s_mail_block_header_view" name="View Online">
+ <div class="o_snippet_view_in_browser">
+ <div class="o_mail_snippet_general">
+ <table align="center" cellspacing="0" cellpadding="0" border="0" class="o_mail_table_styles">
+ <tbody>
+ <tr>
+ <td width="100%" class="o_mail_h_padding o_mail_v_padding o_mail_no_colorpicker text-center">
+ <a href="/view">
+ View Online
+ </a>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</template>
+
+<template id="s_mail_block_title_text" name="Title Content">
+ <div class="o_mail_block_title_text">
+ <div class="o_mail_snippet_general">
+ <table align="center" cellspacing="0" cellpadding="0" border="0" class="o_mail_table_styles">
+ <tbody>
+ <tr>
+ <td width="100%" class="o_mail_h_padding o_mail_v_padding o_mail_no_colorpicker">
+ <h2 class="mt0">Thank you for joining us!</h2>
+ <p>We want to take this opportunity to welcome you to our ever-growing community!<br/></p>
+ <p>Your platform is ready for work. It will help you reduce the costs of digital signage, attract new customers and increase sales.</p>
+ <p>Enjoy,</p>
+ <img src="/mass_mailing/static/src/img/theme_default//demo/signature.png" style="width:125px; margin-top:8px;margin-bottom:-25px;" alt="Demo Signature"/>
+ <p>
+ <small>
+ <strong>Michael Fletcher</strong><br/>
+ <small>Community Manager</small>
+ </small>
+ </p>
+ <div class="o_mail_v_padding text-center">
+ <a role="button" href="#" class="btn btn-primary">LOGIN</a>
+ </div>
+
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</template>
+
+<template id="s_mail_block_paragraph" name="Paragraph">
+ <div class="o_mail_block_paragraph">
+ <div class="o_mail_snippet_general">
+ <table align="center" cellspacing="0" cellpadding="0" border="0" class="o_mail_table_styles">
+ <tbody>
+ <tr>
+ <td width="100%" class="o_mail_h_padding o_mail_v_padding o_mail_no_colorpicker">
+ <p> The open source model of Odoo has allowed us to leverage thousands of developers and
+ business experts to build hundreds of apps in just a few years.</p>
+ <p> With strong technical foundations, Odoo's framework is unique.
+ It provides top notch usability that scales across all apps.</p>
+ <p> Usability improvements made on Odoo will automatically apply to all
+ of our fully integrated apps.</p>
+ <p> That way, Odoo evolves much faster than any other solution.</p>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</template>
+
+
+<template id="s_mail_block_title_sub" name="Title - Subtitle">
+ <div class="o_mail_block_title_sub">
+ <div class="o_mail_snippet_general">
+ <table align="center" cellspacing="0" cellpadding="0" class="o_mail_table_styles">
+ <tbody>
+ <tr>
+ <td class="o_mail_h_padding o_mail_v_padding o_mail_no_colorpicker">
+ <h2 class="o_mail_no_margin">Check this out!</h2>
+ <p class="o_mail_no_margin">Apps That Help You Grow Your Business!</p>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</template>
+
+<template id="s_mail_block_comparison_table" name="Comparison">
+ <div class="o_mail_block_comparison_table">
+ <div class="o_mail_snippet_general">
+ <table align="center" cellspacing="0" cellpadding="0" class="o_mail_table_styles">
+ <tbody>
+ <tr>
+ <td class="o_mail_h_padding o_mail_v_padding o_mail_col_mv">
+ <table cellspacing="0" cellpadding="0" class="o_mail_table_styles">
+ <thead>
+ <tr>
+ <th class="bg-o-color-2 o_mail_v_padding o_mail_col_mv">
+ <h2 class="text-center o_mail_no_margin">DEFAULT</h2>
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td class="text-center o_mail_col_mv bg-gray-lighter">
+ <p class="o_mail_display_coupon text-center" style="margin-top:10px;">$8</p>
+ <small>user / month (billed annually)</small>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="o_mail_v_padding o_mail_col_mv bg-gray-lighter">
+ <div class="separator"></div>
+ </td>
+ </tr>
+ <tr>
+ <td class="o_mail_col_mv bg-gray-lighter">
+ <p>Basic features</p>
+ </td>
+ </tr>
+ <tr>
+ <td class="o_mail_col_mv bg-gray-lighter">
+ <p>Basic management</p>
+ </td>
+ </tr>
+ <tr>
+ <td class="o_mail_col_mv bg-gray-lighter">
+ <p>No customization</p>
+ </td>
+ </tr>
+ <tr>
+ <td class="o_mail_col_mv bg-gray-lighter">
+ <p>No support</p>
+ </td>
+ </tr>
+ </tbody>
+ <tfoot>
+ <tr>
+ <td valign="top" class="o_mail_v_padding o_mail_col_mv bg-gray-lighter">
+ <div class="separator"></div>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="text-center o_mail_h_padding o_mail_col_mv bg-gray-lighter" style="padding-bottom: 20px;">
+ <a role="button" href="#" class="btn btn-block btn-primary">More</a>
+ </td>
+ </tr>
+ </tfoot>
+ </table>
+ </td>
+ <td class="o_mail_h_padding o_mail_v_padding o_mail_col_mv">
+ <table cellspacing="0" cellpadding="0" class="o_mail_table_styles">
+ <thead>
+ <tr>
+ <th class="bg-o-color-2 o_mail_v_padding o_mail_col_mv">
+ <h2 class="text-center o_mail_no_margin">PRO</h2>
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td class="text-center o_mail_col_mv bg-gray-lighter">
+ <p class="o_mail_display_coupon text-center" style="margin-top:10px;">$18</p>
+ <small>user / month (billed annually)</small>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="o_mail_v_padding o_mail_col_mv bg-gray-lighter">
+ <div class="separator"></div>
+ </td>
+ </tr>
+ <tr>
+ <td class="o_mail_col_mv bg-gray-lighter">
+ <p><strong>Advanced</strong> features</p>
+ </td>
+ </tr>
+ <tr>
+ <td class="o_mail_col_mv bg-gray-lighter">
+ <p><strong>Total</strong> management</p>
+ </td>
+ </tr>
+ <tr>
+ <td class="o_mail_col_mv bg-gray-lighter">
+ <p><strong>Fully customizable</strong></p>
+ </td>
+ </tr>
+ <tr>
+ <td class="o_mail_col_mv bg-gray-lighter">
+ <p><strong>24/7 Support</strong></p>
+ </td>
+ </tr>
+ </tbody>
+ <tfoot>
+ <tr>
+ <td valign="top" class="o_mail_v_padding o_mail_col_mv bg-gray-lighter">
+ <div class="separator"></div>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="text-center o_mail_h_padding o_mail_col_mv bg-gray-lighter" style="padding-bottom: 20px;">
+ <a role="button" href="#" class="btn btn-block btn-primary">More</a>
+ </td>
+ </tr>
+ </tfoot>
+ </table>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</template>
+
+<template id="s_mail_block_two_cols" name="Two Columns">
+ <div class="o_mail_block_two_cols">
+ <div class="o_mail_snippet_general">
+ <table align="center" cellspacing="0" cellpadding="0" class="o_mail_table_styles o_mail_v_padding o_mail_col_table">
+ <tbody>
+ <tr>
+ <td style="vertical-align:top;width:270px;" class="o_mail_col_mv o_mail_col_container">
+ <div>
+ <img src="/mass_mailing/static/src/img/theme_basic/s_default_image_block_two_cols_1.jpg" class="d-block mx-auto"/>
+ <h4 class="text-center">Column title</h4>
+ <p class="text-center o_mail_no_margin">
+ Write one paragraph describing your product,
+ services or a specific feature. To be successful
+ your content needs to be useful to your readers.
+ </p>
+ <div class="text-center" style="margin-top:15px;">
+ <a role="button" href="#" class="btn btn-link">Read More...</a>
+ </div>
+ </div>
+ </td>
+
+ <td style="vertical-align:top;width:270px;" class="o_mail_col_mv o_mail_col_container">
+ <div>
+ <img src="/mass_mailing/static/src/img/theme_basic/s_default_image_block_two_cols_2.jpg" class="d-block mx-auto"/>
+ <h4 class="text-center">Column title</h4>
+ <p class="text-center o_mail_no_margin">
+ Write one paragraph describing your product,
+ services or a specific feature. To be successful
+ your content needs to be useful to your readers.
+ </p>
+ <div class="text-center" style="margin-top:15px;">
+ <a role="button" href="#" class="btn btn-link">Read More...</a>
+ </div>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</template>
+
+<template id="s_mail_block_three_cols" name="Three Columns">
+ <div class="o_mail_block_three_cols">
+ <div class="o_mail_snippet_general">
+ <table align="center" cellspacing="0" cellpadding="0" class="o_mail_table_styles o_mail_v_padding o_mail_col_table">
+ <tbody>
+ <tr>
+ <td style="vertical-align:top;width:180px;" class="o_mail_col_mv o_mail_col_container">
+ <div>
+ <img src="/mass_mailing/static/src/img/theme_basic/s_default_image_block_three_cols_1.jpg" class="d-block mx-auto"/>
+ <h4 class="text-center">Column Title</h4>
+ <p class="text-center o_mail_no_margin">
+ A short description
+ </p>
+ <div class="text-center" style="margin-top:15px;">
+ <a role="button" href="#" class="btn btn-link">Read More...</a>
+ </div>
+ </div>
+ </td>
+
+ <td style="vertical-align:top;width:180px;" class="o_mail_col_mv o_mail_col_container">
+ <div>
+ <img src="/mass_mailing/static/src/img/theme_basic/s_default_image_block_three_cols_2.jpg" class="d-block mx-auto"/>
+ <h4 class="text-center">Column Title</h4>
+ <p class="text-center o_mail_no_margin">
+ A short description
+ </p>
+ <div class="text-center" style="margin-top:15px;">
+ <a role="button" href="#" class="btn btn-link">Read More...</a>
+ </div>
+ </div>
+ </td>
+
+ <td style="vertical-align:top;width:180px;" class="o_mail_col_mv o_mail_col_container">
+ <div>
+ <img src="/mass_mailing/static/src/img/theme_basic/s_default_image_block_three_cols_3.jpg" class="d-block mx-auto"/>
+ <h4 class="text-center">Column Title</h4>
+ <p class="text-center o_mail_no_margin">
+ A short description
+ </p>
+ <div class="text-center" style="margin-top:15px;">
+ <a role="button" href="#" class="btn btn-link">Read More...</a>
+ </div>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</template>
+
+<template id="s_mail_block_image_text" name="Image - Text">
+ <div class="o_mail_block_image_text">
+ <div class="o_mail_snippet_general">
+ <table align="center" cellspacing="0" cellpadding="0" class="o_mail_table_styles">
+ <tbody>
+ <tr>
+ <td style="width:270px;text-align:center;vertical-align:middle" class="o_mail_col_mv o_mail_img_container o_mail_h_padding o_mail_v_padding">
+ <img src="/mass_mailing/static/src/img/theme_basic/s_default_image_block_image_text.jpg" class="d-block mx-auto"/>
+ </td>
+ <td style="width:270px;vertical-align:middle;text-align:center;" class="o_mail_col_mv o_mail_h_padding o_mail_v_padding">
+ <h3>Omnichannel sales</h3>
+ <p class="o_mail_no_margin" style="text-align:justify;">Get your inside sales (CRM) fully integrated with online sales (eCommerce), in-store sales (Point of Sale) and marketplaces like eBay and Amazon.</p>
+ <div class="text-center" style="margin-top:15px;">
+ <a role="button" href="#" class="btn btn-link">Read More...</a>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</template>
+
+<template id="s_mail_block_text_image" name="Text - Image">
+ <div class="o_mail_block_text_image">
+ <div class="o_mail_snippet_general">
+ <table align="center" cellspacing="0" cellpadding="0" class="o_mail_table_styles">
+ <tbody>
+ <tr>
+ <td style="width:270px;vertical-align:middle;text-align:center;" class="o_mail_col_mv o_mail_h_padding o_mail_v_padding">
+ <h3>A unique value</h3>
+ <p class="o_mail_no_margin" style="text-align:justify;">The open source model of Odoo has allowed us to leverage thousands of developers and business experts to build hundreds of apps in just a few years.</p>
+ <div class="text-center" style="margin-top:15px;">
+ <a role="button" href="#" class="btn btn-link">Read More...</a>
+ </div>
+ </td>
+ <td style="width:270px;text-align:center;vertical-align:middle" class="o_mail_col_mv o_mail_img_container o_mail_h_padding o_mail_v_padding">
+ <img src="/mass_mailing/static/src/img/theme_basic/s_default_image_block_text_image.jpg" class="d-block mx-auto"/>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</template>
+
+<template id="s_mail_block_image" name="Image">
+ <div class="o_mail_block_image">
+ <div class="o_mail_snippet_general">
+ <table align="center" cellspacing="0" cellpadding="0" class="o_mail_table_styles">
+ <tbody>
+ <tr>
+ <td width="100%" align="center" style="text-align:center" class="o_mail_h_padding">
+ <img src="/mass_mailing/static/src/img/theme_basic/s_default_image_block_image.jpg" class="d-block mx-auto"/>
+ </td>
+ </tr>
+ <tr>
+ <td width="100%" align="center" style="text-align:center" class="o_mail_h_padding">
+ <table>
+ <td class="bg-o-color-2 o_mail_v_padding">
+ <p class="text-center">With strong technical foundations, Odoo's framework is unique. It provides <strong>top notch usability that scales across all apps</strong>.</p>
+ </td>
+ </table>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</template>
+
+<template id="s_mail_block_footer_separator" name="Separator">
+ <div class="o_mail_block_footer_separator">
+ <div class="o_mail_snippet_general">
+ <table align="center" cellspacing="0" cellpadding="0" class="o_mail_table_styles o_mail_full_width_padding">
+ <tbody>
+ <tr>
+ <td valign="top" style="width:100%;" class="o_mail_v_padding o_mail_no_colorpicker">
+ <div style="width:100%;" class="separator"></div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</template>
+
+<template id="s_mail_block_footer_tag_line" name="Tag Line">
+ <div class="o_mail_block_footer_tag_line o_mail_no_colorpicker">
+ <div class="o_mail_snippet_general">
+ <table class="o_mail_table_styles o_mail_full_width_padding" align="center" cellpadding="0" cellspacing="0">
+ <tbody>
+ <tr>
+ <td class="text-center o_mail_h_padding o_mail_v_padding bg-o-color-2">
+ <h3 style="margin:10px 0;">Apps That Help You Grow Your Business</h3>
+ </td>
+ </tr>
+ <tr>
+ <td class="text-center o_mail_h_padding o_mail_v_padding bg-o-color-2" style="padding:10px;">
+ &amp;nbsp;
+ <a role="button" href="#" class="btn btn-primary">My Account</a>
+ &amp;nbsp;
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div class="bg-o-color-2">
+ &amp;nbsp;
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</template>
+
+<template id="s_mail_block_discount2" name="Promo Code">
+ <div class="o_mail_block_discount2 mb32">
+ <div class="o_mail_snippet_general">
+ <table align="center" cellspacing="0" cellpadding="0" class="o_mail_table_styles o_mail_h_padding">
+ <tbody>
+ <tr>
+ <td class="o_mail_v_padding">
+ <div class="text-center d-block mx-auto">
+ <p class="o_mail_display_coupon o_mail_no_margin text-center text-o-color-2" style="font-weight:800;">
+ $20
+ </p>
+ <h3 class="o_mail_no_margin">OFF YOUR NEXT ORDER!</h3>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td class="text-center">
+ <p class="text-center" style="margin-top:10px;">
+ Use This Promo Code BEFORE 1st of August
+ </p>
+ <p class="o_mail_h_padding text-center">
+ <span style="line-height: 30px;"><small>CODE: </small></span><strong class="o_code h3">45A9E77DGW8455</strong>
+ </p>
+ <p class="text-center">
+ and save $20 on your next order!
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td class="mb16 mt16 text-center">
+ <a role="button" href="#" class="btn btn-primary">Use now</a>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</template>
+
+<template id="s_mail_block_discount1" name="Discount Offer">
+ <div class="o_mail_block_discount1">
+ <div class="o_mail_snippet_general">
+ <table align="center" cellpadding="0" cellspacing="0" class="o_mail_table_styles">
+ <tbody>
+ <tr>
+ <td class="o_mail_h_padding o_mail_v_padding text-center o_mail_col_mv" width="250">
+ <table class="o_mail_table_styles">
+ <tr>
+ <td>
+ <p class="o_mail_display_coupon text-o-color-2 text-center o_mail_no_margin" style="font-weight:800;">20%</p>
+ <h4 class="text-o-color-2 text-center mt0 mb16" style="font-weight:800;">OFF</h4>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p class="text-center">FROM YOUR NEXT ORDER!</p>
+ </td>
+ </tr>
+ <tr>
+ <td class="text-center">
+ <a role="button" href="#" class="btn btn-primary">Redeem Discount!</a>
+ &amp;nbsp;
+ </td>
+ </tr>
+ </table>
+ </td>
+ <td class="o_mail_h_padding o_mail_v_padding o_mail_col_mv" width="350">
+ <p class="o_mail_no_margin">We are continuing to grow and we miss seeing you be a part of it! We've increased store hours and have lot's of new brands available. To welcome you back please accept this 20% discount on you next purchase by clicking the button.</p>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</template>
+
+<template id="s_mail_block_event" name="Event">
+ <div class="o_mail_block_event o_mail_no_colorpicker">
+ <div class="o_mail_snippet_general">
+ <table align="center" cellpadding="0" cellspacing="0" class="o_mail_table_styles">
+ <tr>
+ <td style="width:25%;min-height: 150px;vertical-align:middle;" class="bg-o-color-2 text-center o_mail_col_mv">
+ <div class="o_mail_h_padding o_mail_v_padding">
+ <h3 class="o_mail_no_margin">21 Jul</h3>
+ <p class="o_mail_no_margin">ALL DAY</p>
+ </div>
+ </td>
+ <td style="width:25%;min-height: 150px;" class="text-center bg-o-color-4 o_mail_col_mv">
+ <img src="/mass_mailing/static/src/img/theme_basic/s_default_image_block_event.jpg" class="d-block mx-auto"/>
+ </td>
+ <td class="o_mail_h_padding o_mail_v_padding o_mail_col_mv" style="min-height: 150px;">
+ <div style="min-height: 111px">
+ <h4>Cybersecurity</h4>
+ <p class="o_mail_no_margin">
+ Cyber-threats continue to increase.<br/>
+ The discussion will examine how to develop new norms and integrate them into EU
+ </p>
+ </div>
+ <div class="small mt16">
+ <a role="button" href="#" class="btn btn-primary">Registration</a>
+ <a role="button" href="#" class="btn btn-link" style="margin-left:10px">More Info</a>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </div>
+</template>
+
+<template id="s_mail_block_steps" name="Steps">
+ <div class="o_mail_block_steps o_mail_no_colorpicker">
+ <div class="o_mail_snippet_general">
+ <table align="center" cellspacing="0" cellpadding="0" class="o_mail_table_styles o_mail_full_width_padding">
+ <tbody>
+ <tr>
+ <td class="o_mail_col_mv o_mail_h_padding o_mail_v_padding">
+ <table align="center">
+ <tr>
+ <td rowspan="2" class="text-right">
+ &amp;nbsp;
+ <span class="fa fa-compass fa-2x text-o-color-4" role="img" aria-label="Choose" title="Choose"></span>
+ &amp;nbsp;
+ </td>
+ <td style="padding-left:10px;">
+ <p class="o_mail_no_margin"><small>Step 1:</small></p>
+ <h4 class="o_mail_no_margin">Choose</h4>
+ </td>
+ </tr>
+ </table>
+ </td>
+ <td class="o_mail_col_mv o_mail_h_padding o_mail_v_padding">
+ <table align="center">
+ <tr>
+ <td rowspan="2" class="text-right">
+ &amp;nbsp;
+ <span class="fa fa-credit-card fa-2x text-o-color-4" role="img" aria-label="Order" title="Order"></span>
+ &amp;nbsp;
+ </td>
+ <td style="padding-left:10px;">
+ <p class="o_mail_no_margin"><small>Step 2:</small></p>
+ <h4 class="o_mail_no_margin ">Order</h4>
+ </td>
+ </tr>
+ </table>
+ </td>
+ <td class="o_mail_col_mv o_mail_h_padding o_mail_v_padding">
+ <table align="center">
+ <tr>
+ <td rowspan="2" class="text-right">
+ &amp;nbsp;
+ <span class="fa fa-smile-o fa-2x text-o-color-4" role="img" aria-label="Enjoy" title="Enjoy"></span>
+ &amp;nbsp;
+ </td>
+ <td style="padding-left:10px;">
+ <p class="o_mail_no_margin"><small>Step 3:</small></p>
+ <h4 class="o_mail_no_margin ">Enjoy!</h4>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</template>
+
+<template id="s_mail_block_footer_social" name="Footer Center">
+ <div class="o_mail_block_footer_social o_mail_footer_social_center">
+ <div class="o_mail_snippet_general">
+ <table align="center" cellspacing="0" cellpadding="0" class="o_mail_table_styles o_mail_full_width_padding">
+ <tbody>
+ <tr>
+ <td class="o_mail_footer_social">
+ <t t-call="mass_mailing.social_links"/>
+ </td>
+ </tr>
+ <tr>
+ <td class="o_mail_footer_links">
+ <a role="button" href="/unsubscribe_from_list" class="btn btn-link">Unsubscribe</a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p class="o_mail_footer_copy"><span class="fa fa-copyright" role="img" aria-label="Copyright" title="Copyright"/> <t t-esc="datetime.datetime.now().year"/> All Rights Reserved</p>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</template>
+
+<template id="s_mail_block_footer_social_left" name="Footer Left">
+ <div class="o_mail_block_footer_social o_mail_footer_social_left">
+ <div class="o_mail_snippet_general">
+ <table align="center" cellspacing="0" cellpadding="0" class="o_mail_table_styles o_mail_full_width_padding">
+ <tbody>
+ <tr>
+ <td class="o_mail_footer_description">
+ <p t-if="res_company" class="o_mail_no_margin">
+ <strong><t t-esc="res_company.partner_id.name"/></strong>
+ </p>
+ <div class="o_mail_footer_links">
+ <a role="button" href="/unsubscribe_from_list" class="btn btn-link">Unsubscribe</a>
+ </div>
+ <div>
+ <p class="o_mail_footer_copy"><span class="fa fa-copyright" role="img" aria-label="Copyright" title="Copyright"/> <t t-esc="datetime.datetime.now().year"/> All Rights Reserved</p>
+ </div>
+ </td>
+ <td class="o_mail_footer_social">
+ <t t-call="mass_mailing.social_links"/>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</template>
+
+<template id="social_links">
+
+ <t t-set="social_links" t-value="company_id._get_social_media_links()"/>
+
+ <a t-if="social_links.get('social_facebook')" t-att-href="social_links.get('social_facebook')" aria-label="Facebook" title="Facebook">
+ <span class="fa fa-facebook"></span>
+ </a>
+ <a t-if="social_links.get('social_linkedin')" t-att-href="social_links.get('social_linkedin')" style="margin-left:10px" aria-label="LinkedIn" title="LinkedIn">
+ <span class="fa fa-linkedin"></span>
+ </a>
+ <a t-if="social_links.get('social_twitter')" t-att-href="social_links.get('social_twitter')" style="margin-left:10px" aria-label="Twitter" title="Twitter">
+ <span class="fa fa-twitter"></span>
+ </a>
+ <a t-if="social_links.get('social_instagram')" t-att-href="social_links.get('social_instagram')" style="margin-left:10px" aria-label="Instagram" title="Instagram">
+ <span class="fa fa-instagram"></span>
+ </a>
+</template>
+
+<!-- Snippet themes Options -->
+<template id="snippet_options">
+ <t t-call="web_editor.snippet_options"/>
+ <t t-raw="0"/>
+
+ <div data-js="mass_mailing_sizing_x"
+ data-selector="img, .mv, .col_mv, td, th"
+ data-exclude=".o_mail_no_resize, .o_mail_no_options"/>
+
+ <div data-js="mass_mailing_table_item"
+ data-selector="td, th"
+ data-exclude=".o_mail_no_options"/>
+
+ <div data-js="table_row"
+ data-selector="tr:has(> .row), tr:has(> .col_mv)"
+ data-exclude=".o_mail_no_options"
+ data-drop-near="tr:has(> .row), tr:has(> .col_mv)"/>
+
+ <div data-js="table_column"
+ data-selector=".col>td, .col>th"
+ data-exclude=".o_mail_no_options"
+ data-drop-near=".col>td, .col>th"/>
+
+ <div data-js="table_column_mv"
+ data-selector=".col_mv, td, th"
+ data-exclude=".o_mail_no_options"
+ data-drop-near=".col_mv, td, th"/>
+
+ <t t-set="mailing_content_selector" t-translation="off">.note-editable > div:not(.o_layout), .note-editable .oe_structure > div, .oe_snippet_body</t>
+ <div data-js="content"
+ t-att-data-selector="mailing_content_selector"
+ data-exclude=".o_mail_no_options"
+ data-drop-near="[data-oe-field='body_html']:not(:has(.o_layout)) > *, .oe_structure > *"
+ data-drop-in="[data-oe-field='body_html']:not(:has(.o_layout)), .oe_structure"/>
+
+ <!-- TODO remove in master, the option has been disabled in 14.0 because -->
+ <!-- of tricky problems to resolve that require refactoring -->
+ <div t-if="False"
+ data-js="SnippetSave"
+ t-att-data-selector="mailing_content_selector">
+ <we-button class="fa fa-fw fa-save"
+ title="Save the block to use it elsewhere"
+ data-save-snippet=""
+ data-no-preview="true"/>
+ </div>
+
+ <div data-js="sizing_y"
+ data-selector=".note-editable > div:not(.o_layout), .note-editable .oe_structure > div, td, th"
+ data-exclude=".o_mail_no_resize, .o_mail_no_options"/>
+
+ <div data-selector=".note-editable > div:not(.o_layout), .note-editable .oe_structure > div, td, th"
+ data-exclude=".o_mail_no_colorpicker, .o_mail_no_options">
+ <we-colorpicker string="Background Color"
+ data-select-style="true"
+ data-css-property="background-color"
+ data-color-prefix="bg-"/>
+ </div>
+</template>
+</odoo>
diff --git a/addons/mass_mailing/views/themes_templates.xml b/addons/mass_mailing/views/themes_templates.xml
new file mode 100644
index 00000000..6d819395
--- /dev/null
+++ b/addons/mass_mailing/views/themes_templates.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <!-- Theme "Basic" template -->
+ <template id="theme_basic_template">
+ <div class="o_mail_no_options">
+ <p><br/></p>
+ <p><br/></p>
+ <p>
+ <br/>
+ <a href="/unsubscribe_from_list">Unsubscribe</a>
+ </p>
+ </div>
+ </template>
+
+ <!-- Default Theme -->
+ <template id="theme_default_template">
+ <div class="o_mail_block_header_logo mb16" data-snippet="s_mail_block_header_logo">
+ <div class="o_mail_snippet_general">
+ <table align="center" cellspacing="0" cellpadding="0" border="0" class="o_mail_table_styles o_mail_h_padding">
+ <tr>
+ <td width="20%"/>
+ <td valign="center" width="60%" class="o_mail_logo_container text-center o_mail_v_padding">
+ <a t-att-href="(company_id.website) or '#'" style="text-decoration:none;">
+ <img border="0" src="/mass_mailing/static/src/img/theme_default/s_default_image_logo.png" style="height:auto;max-width:400px;"/>
+ </a>
+ </td>
+ <td width="20%" style="text-align:right"/>
+ </tr>
+ </table>
+ </div>
+ </div>
+ <t t-snippet-call="mass_mailing.s_mail_block_title_text" />
+ <t t-snippet-call="mass_mailing.s_mail_block_footer_social_left"/>
+ </template>
+</odoo>
diff --git a/addons/mass_mailing/views/utm_campaign_views.xml b/addons/mass_mailing/views/utm_campaign_views.xml
new file mode 100644
index 00000000..b900c8c7
--- /dev/null
+++ b/addons/mass_mailing/views/utm_campaign_views.xml
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <record model="ir.ui.view" id="utm_campaign_view_form">
+ <field name="name">utm.campaign.view.form</field>
+ <field name="model">utm.campaign</field>
+ <field name="inherit_id" ref="utm.utm_campaign_view_form"/>
+ <field name="arch" type="xml">
+ <xpath expr="//header" position="inside">
+ <button name="%(action_create_mass_mailings_from_campaign)d" type="action" class="oe_highlight" groups="mass_mailing.group_mass_mailing_campaign" string="Send new Mailing"/>
+ </xpath>
+ <xpath expr="//div[hasclass('oe_button_box')]" position="inside">
+ <button name="%(action_view_mass_mailings_from_campaign)d"
+ type="action" class="oe_stat_button order-9" icon="fa-envelope-o"
+ attrs="{'invisible': [('mailing_mail_count', '=', 0)]}" groups="mass_mailing.group_mass_mailing_campaign">
+ <field name="mailing_mail_count" widget="statinfo" string="Mailings"/>
+ </button>
+ </xpath>
+ <xpath expr="//notebook" position="inside">
+ <page string="Mailings" name="mailings" attrs="{'invisible': [('mailing_mail_count', '=', 0)]}">
+ <field name="mailing_mail_ids" readonly="1" nolabel="1">
+ <tree>
+ <field name="subject"/>
+ <field name="sent_date"/>
+ <field name="state"/>
+ <field name="delivered"/>
+ <field name="opened"/>
+ <field name="replied"/>
+ <field name="bounced"/>
+ <button name="action_duplicate" type="object" string="Duplicate"/>
+ </tree>
+ </field>
+ <div class="o_utm_campaign_mass_mailing_substats d-flex justify-content-end align-items-center">
+ <div class="d-flex justify-content-end align-items-center flex-column">
+ <label for="received_ratio" string="Delivered" class="m-0"/>
+ <div class="m-0">
+ <span class="text-right">
+ <field name="received_ratio"/>
+ <span>%</span>
+ </span>
+ </div>
+ </div>
+ <div class="d-flex justify-content-end align-items-center flex-column">
+ <label for="opened_ratio" string="Opened" class="m-0"/>
+ <div class="m-0">
+ <span class="text-right">
+ <field name="opened_ratio"/>
+ <span>%</span>
+ </span>
+ </div>
+ </div>
+ <div class="d-flex justify-content-end align-items-center flex-column">
+ <label for="replied_ratio" string="Replied" class="m-0"/>
+ <div class="m-0">
+ <span class="text-right">
+ <field name="replied_ratio"/>
+ <span>%</span>
+ </span>
+ </div>
+ </div>
+ <div class="d-flex justify-content-end align-items-center flex-column">
+ <label for="bounced_ratio" string="Bounced" class="m-0"/>
+ <div class="m-0">
+ <span class="text-right">
+ <field name="bounced_ratio"/>
+ <span>%</span>
+ </span>
+ </div>
+ </div>
+ </div>
+ </page>
+ </xpath>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="utm_campaign_view_kanban">
+ <field name="name">utm.campaign.view.kanban</field>
+ <field name="model">utm.campaign</field>
+ <field name="inherit_id" ref="utm.utm_campaign_view_kanban"/>
+ <field name="arch" type="xml">
+ <xpath expr="//field[@name='user_id']" position="after">
+ <field name="mailing_mail_ids"/>
+ </xpath>
+ <xpath expr="//ul[@id='o_utm_actions']">
+ <a name="%(action_view_mass_mailings_from_campaign)d" type="action"
+ t-attf-class="oe_mailings #{record.mailing_mail_ids.raw_value.length === 0 ? 'text-muted' : ''}">
+ <t t-raw="record.mailing_mail_ids.raw_value.length"/> Mailings
+ </a>
+ </xpath>
+ </field>
+ </record>
+
+ <record id="action_view_utm_campaigns" model="ir.actions.act_window">
+ <field name="name">Campaigns</field>
+ <field name="res_model">utm.campaign</field>
+ <field name="view_mode">kanban,tree,form</field>
+ <field name="help" type="html">
+ <p class="o_view_nocontent_smiling_face">
+ Create a mailing campaign
+ </p><p>
+ Campaigns are the perfect tool to track results across multiple mailings.
+ </p>
+ </field>
+ <field name="domain">[('is_website', '=', False)]</field>
+ </record>
+
+ <menuitem name="Campaigns" id="menu_email_campaigns"
+ parent="mass_mailing_menu_root" sequence="5"
+ action="action_view_utm_campaigns"
+ groups="mass_mailing.group_mass_mailing_campaign"/>
+
+ <menuitem name="Campaign Stages" id="menu_view_mass_mailing_stages"
+ parent="mass_mailing_configuration" sequence="1"
+ groups="mass_mailing.group_mass_mailing_campaign"
+ action="utm.action_view_utm_stage"/>
+
+ <menuitem id="mass_mailing_tag_menu"
+ parent="mass_mailing_configuration"
+ action="utm.action_view_utm_tag"
+ sequence="2"
+ groups="mass_mailing.group_mass_mailing_campaign"/>
+</odoo>