diff --git a/addons/mass_mailing_slides/__init__.py b/addons/mass_mailing_slides/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..dc5e6b693d19dcacd224b7ab27b26f75e66cb7b2 --- /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 0000000000000000000000000000000000000000..f313de6d64a581d568686fceec7b04d540a385d5 --- /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 0000000000000000000000000000000000000000..c9c3eb273a88f8ce5d6beeaceda6f2192cba5e71 --- /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 0000000000000000000000000000000000000000..7822dc8113d31da915ea39f8dca227d16b0e27f3 --- /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 0000000000000000000000000000000000000000..ddc7c38af22a5ac0984bfb170ea6de4ffeb1f271 --- /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 b8b6868cc0a8c5563656f4f53661399f843fdcff..4fb9318f4da09a9fb142175a947430ad9f17d524 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 8085cd407c8f3771220e17e9f10c2cfa36212c97..9e886766a7c8e4e1a274e5a09d932df48d8ef55b 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 6ee87be909d91e6d66c02d7d753ae407ce922d29..fb2aff8dc9e1a5995ca5ebc144fc233c271596b5 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 3e5a64010f05cd7c77b8249fbc753aa89e8d7649..0271a58c9e9ddcd5ca9afa8bc869dfe1d1752ef7 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 5455a0195f5ee7d7559fff74c6d62958f360b955..8a202cb0311217d8e4cd674a7aa6803ef2899528 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', '<', 2)]}">Courses</span> - <span class="o_stat_text" attrs="{'invisible': [('slide_channels_count', '>', 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', '<', 2)]}">Courses</span> - <span class="o_stat_text" attrs="{'invisible': [('slide_channels_company_count', '>', 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>