summaryrefslogtreecommitdiff
path: root/addons
diff options
context:
space:
mode:
authorJérémy Hennecart <jeh@odoo.com>2019-07-24 15:32:09 +0000
committerThibault Delavallée <tde@odoo.com>2019-08-05 08:41:27 +0000
commit313a7d9eb2d28c9ca5d3091f3270201a3620b7fa (patch)
tree20565aedf701d36302e6f6caed21ad6cd206f3ea /addons
parentfd9962cd6a1b4462fa8a4a11f14071149bdabdbe (diff)
[ADD] mass_mailing_slides: allow to mass mail course attendees
PURPOSE eLearning should have its own application in manager. Indeed this is becoming a big application and having it embedded inside Website application is not enough anymore. It should also hold updated and easy-to-use menus, navigation, actions and views in backend. SPECIFICATIONS Integrate a button on slide.channel form view allowing to perform a mass mailing on course attendees. Do a flow similar to event. Add menu entry in menu of slide.channel kanban card after invite * Mail Attendees (same as on the course card and depend of the setting) Add menu entry inside Settings * Settings: add an option to install module mass_mailing_slide LINKS Task 1978729 PR #35061 Co-Authored-By: Thibault Delavallée <tde@odoo.com> Co-Authored-By: Jérémy Hennecart <jeh@odoo.com>
Diffstat (limited to 'addons')
-rw-r--r--addons/mass_mailing_slides/__init__.py4
-rw-r--r--addons/mass_mailing_slides/__manifest__.py20
-rw-r--r--addons/mass_mailing_slides/models/__init__.py4
-rw-r--r--addons/mass_mailing_slides/models/slide_channel.py23
-rw-r--r--addons/mass_mailing_slides/views/slide_channel_views.xml33
-rw-r--r--addons/website_slides/models/__init__.py2
-rw-r--r--addons/website_slides/models/res_config_settings.py1
-rw-r--r--addons/website_slides/models/res_partner.py26
-rw-r--r--addons/website_slides/views/res_config_settings_views.xml12
-rw-r--r--addons/website_slides/views/res_partner_views.xml20
10 files changed, 118 insertions, 27 deletions
diff --git a/addons/mass_mailing_slides/__init__.py b/addons/mass_mailing_slides/__init__.py
new file mode 100644
index 00000000000..dc5e6b693d1
--- /dev/null
+++ b/addons/mass_mailing_slides/__init__.py
@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from . import models
diff --git a/addons/mass_mailing_slides/__manifest__.py b/addons/mass_mailing_slides/__manifest__.py
new file mode 100644
index 00000000000..f313de6d64a
--- /dev/null
+++ b/addons/mass_mailing_slides/__manifest__.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+{
+ 'name': 'Mass mailing on course members',
+ 'category': 'Hidden',
+ 'version': '1.0',
+ 'description':
+ """
+Mass mail course members
+========================
+
+Bridge module adding UX requirements to ease mass mailing of course members.
+ """,
+ 'depends': ['website_slides', 'mass_mailing'],
+ 'data': [
+ 'views/slide_channel_views.xml'
+ ],
+ 'auto_install': True,
+}
diff --git a/addons/mass_mailing_slides/models/__init__.py b/addons/mass_mailing_slides/models/__init__.py
new file mode 100644
index 00000000000..c9c3eb273a8
--- /dev/null
+++ b/addons/mass_mailing_slides/models/__init__.py
@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from . import slide_channel
diff --git a/addons/mass_mailing_slides/models/slide_channel.py b/addons/mass_mailing_slides/models/slide_channel.py
new file mode 100644
index 00000000000..7822dc8113d
--- /dev/null
+++ b/addons/mass_mailing_slides/models/slide_channel.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import models, _
+
+
+class Course(models.Model):
+ _inherit = "slide.channel"
+
+ def action_mass_mailing_attendees(self):
+ domain = [('slide_channel_ids', 'in', self.ids)]
+ mass_mailing_action = dict(
+ name=_('Mass Mail Course Members'),
+ type='ir.actions.act_window',
+ res_model='mailing.mailing',
+ view_mode='form',
+ target='current',
+ context=dict(
+ default_mailing_model_id=self.env.ref('base.model_res_partner').id,
+ default_mailing_domain=domain,
+ ),
+ )
+ return mass_mailing_action
diff --git a/addons/mass_mailing_slides/views/slide_channel_views.xml b/addons/mass_mailing_slides/views/slide_channel_views.xml
new file mode 100644
index 00000000000..ddc7c38af22
--- /dev/null
+++ b/addons/mass_mailing_slides/views/slide_channel_views.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<odoo>
+ <record id="slide_channel_view_form" model="ir.ui.view">
+ <field name="name">slide.channel.view.form.inherit.mass.mailing</field>
+ <field name="model">slide.channel</field>
+ <field name="inherit_id" ref="website_slides.view_slide_channel_form"/>
+ <field name="arch" type="xml">
+ <xpath expr="//button[@name='action_redirect_to_members']" position="before">
+ <button class="oe_stat_button" type="object"
+ name="action_mass_mailing_attendees"
+ icon="fa-envelope-o"
+ attrs="{'invisible': [('members_count', '=', 0)]}">
+ <div class="o_field_widget o_stat_info">
+ <span class="o_stat_text">Mail Attendees</span>
+ </div>
+ </button>
+ </xpath>
+ </field>
+ </record>
+
+ <record id="slide_channel_view_kanban" model="ir.ui.view">
+ <field name="name">slide.channel.view.kanban.inherit.mass.mailing</field>
+ <field name="model">slide.channel</field>
+ <field name="inherit_id" ref="website_slides.slide_channel_view_kanban"/>
+ <field name="arch" type="xml">
+ <xpath expr="//a[@name='action_channel_invite']" position="after">
+ <a class="dropdown-item" name="action_mass_mailing_attendees" role="menuitem" type="object">
+ Mail Attendees
+ </a>
+ </xpath>
+ </field>
+ </record>
+</odoo>
diff --git a/addons/website_slides/models/__init__.py b/addons/website_slides/models/__init__.py
index b8b6868cc0a..4fb9318f4da 100644
--- a/addons/website_slides/models/__init__.py
+++ b/addons/website_slides/models/__init__.py
@@ -10,4 +10,4 @@ from . import res_config_settings
from . import website
from . import res_users
from . import res_groups
-from . import res_partner
+from . import res_partner \ No newline at end of file
diff --git a/addons/website_slides/models/res_config_settings.py b/addons/website_slides/models/res_config_settings.py
index 8085cd407c8..9e886766a7c 100644
--- a/addons/website_slides/models/res_config_settings.py
+++ b/addons/website_slides/models/res_config_settings.py
@@ -11,3 +11,4 @@ class ResConfigSettings(models.TransientModel):
module_website_sale_slides = fields.Boolean(string="Sell on eCommerce")
module_website_slides_forum = fields.Boolean(string="Forum")
module_website_slides_survey = fields.Boolean(string="Certifications")
+ module_mass_mailing_slides = fields.Boolean(string="Mailing")
diff --git a/addons/website_slides/models/res_partner.py b/addons/website_slides/models/res_partner.py
index 6ee87be909d..fb2aff8dc9e 100644
--- a/addons/website_slides/models/res_partner.py
+++ b/addons/website_slides/models/res_partner.py
@@ -1,38 +1,40 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
-from odoo import api, fields, models
+from odoo import api, fields, models, _
class ResPartner(models.Model):
_inherit = 'res.partner'
- slide_channels_count = fields.Integer('Course Count', compute='_compute_slide_channels_count')
- slide_channels_company_count = fields.Integer('Company Course Count', compute='_compute_slide_channels_company_count')
+ slide_channel_ids = fields.Many2many(
+ 'slide.channel', 'slide_channel_partner', 'partner_id', 'channel_id',
+ string='eLearning Courses')
+ slide_channel_count = fields.Integer('Course Count', compute='_compute_slide_channel_count')
+ slide_channel_company_count = fields.Integer('Company Course Count', compute='_compute_slide_channel_company_count')
@api.depends('is_company')
- def _compute_slide_channels_count(self):
+ def _compute_slide_channel_count(self):
read_group_res = self.env['slide.channel.partner'].sudo().read_group(
[('partner_id', 'in', self.ids)],
['partner_id'], 'partner_id'
)
data = dict((res['partner_id'][0], res['partner_id_count']) for res in read_group_res)
for partner in self:
- partner.slide_channels_count = data.get(partner.id, 0)
+ partner.slide_channel_count = data.get(partner.id, 0)
- @api.depends('is_company', 'child_ids.slide_channels_count')
- def _compute_slide_channels_company_count(self):
+ @api.depends('is_company', 'child_ids.slide_channel_count')
+ def _compute_slide_channel_company_count(self):
for partner in self:
if partner.is_company:
- partner.slide_channels_company_count = self.env['slide.channel'].sudo().search_count(
+ partner.slide_channel_company_count = self.env['slide.channel'].sudo().search_count(
[('partner_ids', 'in', partner.child_ids.ids)]
)
else:
- partner.slide_channels_company_count = 0
+ partner.slide_channel_company_count = 0
def action_view_courses(self):
- action = self.env.ref('website_slides.res_partner_action_courses').read()[0]
- action['view_mode'] = 'tree'
+ action = self.env.ref('website_slides.slide_channel_action_overview').read()[0]
+ action['name'] = _('Followed Courses')
action['domain'] = ['|', ('partner_ids', 'in', self.ids), ('partner_ids', 'in', self.child_ids.ids)]
-
return action
diff --git a/addons/website_slides/views/res_config_settings_views.xml b/addons/website_slides/views/res_config_settings_views.xml
index 3e5a64010f0..0271a58c9e9 100644
--- a/addons/website_slides/views/res_config_settings_views.xml
+++ b/addons/website_slides/views/res_config_settings_views.xml
@@ -43,6 +43,18 @@
</div>
</div>
<div class="col-12 col-lg-6"></div>
+ <div class="col-12 col-lg-6 o_setting_box" id="website_slides_install_mass_mailing_slides">
+ <div class="o_setting_left_pane">
+ <field name="module_mass_mailing_slides"/>
+ </div>
+ <div class="o_setting_right_pane">
+ <label for="module_mass_mailing_slides"/>
+ <div class="text-muted">
+ Contact all the members of a course via mass mailing
+ </div>
+ </div>
+ </div>
+ <div class="col-12 col-lg-6"></div>
<div class="col-12 col-lg-6 o_setting_box" id="elearning_install_certif">
<div class="o_setting_left_pane">
<field name="module_website_slides_survey"/>
diff --git a/addons/website_slides/views/res_partner_views.xml b/addons/website_slides/views/res_partner_views.xml
index 5455a0195f5..8a202cb0311 100644
--- a/addons/website_slides/views/res_partner_views.xml
+++ b/addons/website_slides/views/res_partner_views.xml
@@ -1,12 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo><data>
- <record id="res_partner_action_courses" model="ir.actions.act_window">
- <field name="name">Followed Courses</field>
- <field name="res_model">slide.channel</field>
- <field name="view_mode">tree</field>
- </record>
-
<record id="res_partner_view_form" model="ir.ui.view">
<field name="name">res.partner.view.form.inherit.slides</field>
<field name="model">res.partner</field>
@@ -16,20 +10,18 @@
<xpath expr="//div[@name='button_box']" position="inside">
<button class="oe_stat_button" type="object"
icon="fa-graduation-cap" name="action_view_courses"
- attrs="{'invisible': ['|', ('slide_channels_count', '=', 0), ('is_company', '=', True)]}">
+ attrs="{'invisible': ['|', ('slide_channel_count', '=', 0), ('is_company', '=', True)]}">
<div class="o_field_widget o_stat_info">
- <span class="o_stat_value"><field name="slide_channels_count" /></span>
- <span class="o_stat_text" attrs="{'invisible': [('slide_channels_count', '&lt;', 2)]}">Courses</span>
- <span class="o_stat_text" attrs="{'invisible': [('slide_channels_count', '&gt;', 1)]}">Course</span>
+ <span class="o_stat_value"><field name="slide_channel_count"/></span>
+ <span class="o_stat_text">Courses</span>
</div>
</button>
<button class="oe_stat_button" type="object"
icon="fa-graduation-cap" name="action_view_courses"
- attrs="{'invisible': ['|', ('slide_channels_company_count', '=', 0), ('is_company', '=', False)]}">
+ attrs="{'invisible': ['|', ('slide_channel_company_count', '=', 0), ('is_company', '=', False)]}">
<div class="o_field_widget o_stat_info">
- <span class="o_stat_value"><field name="slide_channels_company_count" /></span>
- <span class="o_stat_text" attrs="{'invisible': [('slide_channels_company_count', '&lt;', 2)]}">Courses</span>
- <span class="o_stat_text" attrs="{'invisible': [('slide_channels_company_count', '&gt;', 1)]}">Course</span>
+ <span class="o_stat_value"><field name="slide_channel_company_count" /></span>
+ <span class="o_stat_text">Courses</span>
</div>
</button>
</xpath>