From 39fdb8064c53c1fd2e26c0ca1fcea67366ff5cfd Mon Sep 17 00:00:00 2001 From: Patrick Hoste Date: Tue, 7 Mar 2023 15:00:49 +0000 Subject: [PATCH] [IMP] website_slides: allow course to have prerequisites MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit allows the course manager to add prerequisites courses to a course so that the final user will be notified on the frontend he has to take some courses before the one he wants. He could however request access to the course and take it without taking the prerequisites before if the access has been granted. Task-3213628 closes odoo/odoo#114710 Signed-off-by: Warnon Aurélien (awa) --- .../views/website_slides_templates.xml | 17 +++ addons/website_slides/__manifest__.py | 2 + .../data/slide_channel_demo.xml | 3 + addons/website_slides/models/slide_channel.py | 26 +++++ .../src/js/slides_course_enroll_email.js | 2 +- .../src/js/slides_course_prerequisite.js | 24 +++++ .../src/xml/slide_course_prerequisite.xml | 10 ++ .../views/slide_channel_views.xml | 4 + .../views/website_slides_templates_course.xml | 101 ++++++++++++------ 9 files changed, 157 insertions(+), 32 deletions(-) create mode 100644 addons/website_slides/static/src/js/slides_course_prerequisite.js create mode 100644 addons/website_slides/static/src/xml/slide_course_prerequisite.xml diff --git a/addons/website_sale_slides/views/website_slides_templates.xml b/addons/website_sale_slides/views/website_slides_templates.xml index c49f9a69dac..e4ff9ecddec 100644 --- a/addons/website_sale_slides/views/website_slides_templates.xml +++ b/addons/website_sale_slides/views/website_slides_templates.xml @@ -125,6 +125,23 @@ + + + Prerequisite: + + + + There are some + + prerequisite courses. + + +
diff --git a/addons/website_slides/__manifest__.py b/addons/website_slides/__manifest__.py index 99348388770..f50baa9cae4 100644 --- a/addons/website_slides/__manifest__.py +++ b/addons/website_slides/__manifest__.py @@ -95,6 +95,7 @@ Featuring 'website_slides/static/src/js/slides_course_fullscreen_player.js', 'website_slides/static/src/js/slides_course_join.js', 'website_slides/static/src/js/slides_course_enroll_email.js', + 'website_slides/static/src/js/slides_course_prerequisite.js', 'website_slides/static/src/js/slides_course_quiz.js', 'website_slides/static/src/js/slides_course_quiz_question_form.js', 'website_slides/static/src/js/slides_course_quiz_finish.js', @@ -109,6 +110,7 @@ Featuring 'website_slides/static/src/xml/website_slides_unsubscribe.xml', 'website_slides/static/src/xml/slide_management.xml', 'website_slides/static/src/xml/slide_course_join.xml', + 'website_slides/static/src/xml/slide_course_prerequisite.xml', 'website_slides/static/src/xml/slide_quiz_create.xml', 'website_slides/static/src/xml/slide_quiz.xml', ], diff --git a/addons/website_slides/data/slide_channel_demo.xml b/addons/website_slides/data/slide_channel_demo.xml index 78bf078a86e..54d5d1e5df8 100644 --- a/addons/website_slides/data/slide_channel_demo.xml +++ b/addons/website_slides/data/slide_channel_demo.xml @@ -42,6 +42,9 @@ Trees, Wood and Gardens + public documentation diff --git a/addons/website_slides/models/slide_channel.py b/addons/website_slides/models/slide_channel.py index 3568c48e215..60df5748662 100644 --- a/addons/website_slides/models/slide_channel.py +++ b/addons/website_slides/models/slide_channel.py @@ -359,6 +359,16 @@ class Channel(models.Model): can_review = fields.Boolean('Can Review', compute='_compute_action_rights', compute_sudo=False) can_comment = fields.Boolean('Can Comment', compute='_compute_action_rights', compute_sudo=False) can_vote = fields.Boolean('Can Vote', compute='_compute_action_rights', compute_sudo=False) + # prerequisite settings + prerequisite_channel_ids = fields.Many2many( + 'slide.channel', 'slide_channel_prerequisite_slide_channel_rel', 'channel_id', 'prerequisite_channel_id', + string='Prerequisites', help='Prerequisite courses to complete before accessing this one.', + domain="[('id', '!=', id), ('visibility', '=', visibility), ('website_published', '=', website_published)]") + prerequisite_of_channel_ids = fields.Many2many( + 'slide.channel', 'slide_channel_prerequisite_slide_channel_rel', 'prerequisite_channel_id', 'channel_id', + string='Prerequisite Of', help='Courses that have this course as prerequisite.') + prerequisite_user_has_completed = fields.Boolean( + 'Has Completed Prerequisite', compute='_compute_prerequisite_user_has_completed') _sql_constraints = [ ( @@ -540,6 +550,22 @@ class Channel(models.Model): channel.can_comment = user_karma >= channel.karma_slide_comment channel.can_vote = user_karma >= channel.karma_slide_vote + ###################### + # Prerequisite Compute + ###################### + + @api.depends('prerequisite_channel_ids', 'channel_partner_ids.completed') + @api.depends_context('uid') + def _compute_prerequisite_user_has_completed(self): + completed_prerequisite_channels = self.env['slide.channel.partner'].sudo().search([ + ('partner_id', '=', self.env.user.partner_id.id), + ('channel_id', 'in', self.prerequisite_channel_ids.ids), + ('completed', '=', True), + ]).mapped('channel_id') + for channel in self: + channel.prerequisite_user_has_completed = all( + channel in completed_prerequisite_channels for channel in channel.prerequisite_channel_ids) + # --------------------------------------------------------- # ORM Overrides # --------------------------------------------------------- diff --git a/addons/website_slides/static/src/js/slides_course_enroll_email.js b/addons/website_slides/static/src/js/slides_course_enroll_email.js index 077cf58ec94..473fc1eda76 100644 --- a/addons/website_slides/static/src/js/slides_course_enroll_email.js +++ b/addons/website_slides/static/src/js/slides_course_enroll_email.js @@ -58,7 +58,7 @@ publicWidget.registry.websiteSlidesEnroll = publicWidget.Widget.extend({ _openDialog: function (channelId) { new SlideEnrollDialog(this, { channelId: channelId, - $element: this.$el + $element: this.$el.closest('.alert') }).open(); }, diff --git a/addons/website_slides/static/src/js/slides_course_prerequisite.js b/addons/website_slides/static/src/js/slides_course_prerequisite.js new file mode 100644 index 00000000000..85b8d8fecf9 --- /dev/null +++ b/addons/website_slides/static/src/js/slides_course_prerequisite.js @@ -0,0 +1,24 @@ +/** @odoo-module **/ + +import { qweb } from 'web.core'; +import publicWidget from 'web.public.widget'; + +publicWidget.registry.websiteSlidesCoursePrerequisite = publicWidget.Widget.extend({ + selector: '.o_wslides_js_prerequisite_course', + + async start() { + await this._super(...arguments); + const channels = this.$el.data('channels'); + this.$el.popover({ + trigger: 'focus', + placement: 'bottom', + container: 'body', + html: true, + content: qweb.render('slide.course.prerequisite', {channels: channels}), + }); + }, +}); + +export default { + websiteSlidesCoursePrerequisite: publicWidget.registry.websiteSlidesCoursePrerequisite +}; diff --git a/addons/website_slides/static/src/xml/slide_course_prerequisite.xml b/addons/website_slides/static/src/xml/slide_course_prerequisite.xml new file mode 100644 index 00000000000..6487f0827d9 --- /dev/null +++ b/addons/website_slides/static/src/xml/slide_course_prerequisite.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/addons/website_slides/views/slide_channel_views.xml b/addons/website_slides/views/slide_channel_views.xml index ab9df39b499..b7054d3ff50 100644 --- a/addons/website_slides/views/slide_channel_views.xml +++ b/addons/website_slides/views/slide_channel_views.xml @@ -98,6 +98,10 @@ + + + diff --git a/addons/website_slides/views/website_slides_templates_course.xml b/addons/website_slides/views/website_slides_templates_course.xml index 772c3f18aca..65b9a97f18d 100644 --- a/addons/website_slides/views/website_slides_templates_course.xml +++ b/addons/website_slides/views/website_slides_templates_course.xml @@ -275,37 +275,6 @@