summaryrefslogtreecommitdiff
path: root/addons/mass_mailing/views/mailing_mailing_views.xml
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/mailing_mailing_views.xml
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/mass_mailing/views/mailing_mailing_views.xml')
-rw-r--r--addons/mass_mailing/views/mailing_mailing_views.xml487
1 files changed, 487 insertions, 0 deletions
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>