From 313a7d9eb2d28c9ca5d3091f3270201a3620b7fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Hennecart?= Date: Wed, 24 Jul 2019 15:32:09 +0000 Subject: [PATCH] [ADD] mass_mailing_slides: allow to mass mail course attendees MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Co-Authored-By: Jérémy Hennecart --- addons/mass_mailing_slides/__init__.py | 4 +++ addons/mass_mailing_slides/__manifest__.py | 20 +++++++++++ addons/mass_mailing_slides/models/__init__.py | 4 +++ .../models/slide_channel.py | 23 +++++++++++++ .../views/slide_channel_views.xml | 33 +++++++++++++++++++ addons/website_slides/models/__init__.py | 2 +- .../models/res_config_settings.py | 1 + addons/website_slides/models/res_partner.py | 26 ++++++++------- .../views/res_config_settings_views.xml | 12 +++++++ .../views/res_partner_views.xml | 20 ++++------- 10 files changed, 118 insertions(+), 27 deletions(-) create mode 100644 addons/mass_mailing_slides/__init__.py create mode 100644 addons/mass_mailing_slides/__manifest__.py create mode 100644 addons/mass_mailing_slides/models/__init__.py create mode 100644 addons/mass_mailing_slides/models/slide_channel.py create mode 100644 addons/mass_mailing_slides/views/slide_channel_views.xml 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 @@ + + + + slide.channel.view.form.inherit.mass.mailing + slide.channel + + + + + + + + + + slide.channel.view.kanban.inherit.mass.mailing + slide.channel + + + + + Mail Attendees + + + + + 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 @@
+
+
+ +
+
+
+
+
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 @@ - - Followed Courses - slide.channel - tree - - res.partner.view.form.inherit.slides res.partner @@ -16,20 +10,18 @@