From 032493b7c4149e79018364476e6a6d0a552a5b0f Mon Sep 17 00:00:00 2001 From: Patrick Hoste <pko@odoo.com> Date: Wed, 14 Dec 2022 13:39:08 +0000 Subject: [PATCH] [FIX] website_slides: fix multiple course review bug MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before this commit, it was possible for one to post multiple reviews when all the already posted reviews had the 'Employee Only' state. A traceback was also thrown when trying to update an 'Employee Only' comment. It was also possible to edit a log note. This commit fixes all these issues. Task-2810085 closes odoo/odoo#107956 Signed-off-by: Stéphane Debauche (std) <std@odoo.com> --- addons/website_slides/controllers/mail.py | 5 +- addons/website_slides/controllers/main.py | 3 +- .../src/tests/tours/slides_course_reviews.js | 46 +++++++++++++++++++ .../website_slides/tests/test_ui_wslides.py | 20 +++++++- addons/website_slides/views/assets.xml | 1 + 5 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 addons/website_slides/static/src/tests/tours/slides_course_reviews.js diff --git a/addons/website_slides/controllers/mail.py b/addons/website_slides/controllers/mail.py index 2bed6c1e98c5..ce57ac531c25 100644 --- a/addons/website_slides/controllers/mail.py +++ b/addons/website_slides/controllers/mail.py @@ -46,10 +46,11 @@ class SlidesPortalChatter(PortalChatter): # fetch and update mail.message message_id = int(message_id) message_body = plaintext2html(message) + subtype_comment_id = request.env['ir.model.data'].xmlid_to_res_id('mail.mt_comment') domain = [ ('model', '=', res_model), ('res_id', '=', res_id), - ('is_internal', '=', False), + ('subtype_id', '=', subtype_comment_id), ('author_id', '=', request.env.user.partner_id.id), ('message_type', '=', 'comment'), ('id', '=', message_id) @@ -64,7 +65,7 @@ class SlidesPortalChatter(PortalChatter): # update rating if post.get('rating_value'): - domain = [('res_model', '=', res_model), ('res_id', '=', res_id), ('is_internal', '=', False), ('message_id', '=', message.id)] + domain = [('res_model', '=', res_model), ('res_id', '=', res_id), ('message_id', '=', message.id)] rating = request.env['rating.rating'].sudo().search(domain, order='write_date DESC', limit=1) rating.write({ 'rating': float(post['rating_value']), diff --git a/addons/website_slides/controllers/main.py b/addons/website_slides/controllers/main.py index 226ba1f69f0e..3341eeb8e944 100644 --- a/addons/website_slides/controllers/main.py +++ b/addons/website_slides/controllers/main.py @@ -484,12 +484,13 @@ class WebsiteSlides(WebsiteProfile): 'enable_slide_upload': 'enable_slide_upload' in kw, } if not request.env.user._is_public(): + subtype_comment_id = request.env['ir.model.data'].xmlid_to_res_id('mail.mt_comment') last_message = request.env['mail.message'].search([ ('model', '=', channel._name), ('res_id', '=', channel.id), ('author_id', '=', request.env.user.partner_id.id), ('message_type', '=', 'comment'), - ('is_internal', '=', False) + ('subtype_id', '=', subtype_comment_id) ], order='write_date DESC', limit=1) if last_message: last_message_values = last_message.read(['body', 'rating_value', 'attachment_ids'])[0] diff --git a/addons/website_slides/static/src/tests/tours/slides_course_reviews.js b/addons/website_slides/static/src/tests/tours/slides_course_reviews.js new file mode 100644 index 000000000000..f83d919f1e29 --- /dev/null +++ b/addons/website_slides/static/src/tests/tours/slides_course_reviews.js @@ -0,0 +1,46 @@ +odoo.define('website_slides.tour.slide.course.reviews', function (require) { +'use strict'; + +const tour = require('web_tour.tour'); + +/** + * This tour test that a log note isn't considered + * as a course review. And also that a member can + * add only one review. + */ +tour.register('course_reviews', { + url: '/slides', + test: true +}, [ +{ + trigger: 'a:contains("Basics of Gardening - Test")', +}, { + trigger: 'a[id="review-tab"]', +}, { + trigger: '.o_portal_chatter_message:contains("Log note")', + run: function() {}, +}, { + trigger: 'button:contains("Add a review")', + // If it fails here, it means the log note is considered as a review +}, { + trigger: 'form.o_portal_chatter_composer_form textarea', + extra_trigger: 'div#ratingpopupcomposer.modal_shown', + run: 'text Great course!', + in_modal: false, +}, { + trigger: 'button.o_portal_chatter_composer_btn', + in_modal: false, +}, { + trigger: 'a[id="review-tab"]', +}, { + trigger: 'button:contains("Visible")', +}, { + trigger: 'button:contains("Modify your review")', + // If it fails here, it means the system is allowing you to add another review. +}, { + trigger: 'form.o_portal_chatter_composer_form textarea:contains("Great course!")', + run: function() {}, +} +]); + +}); diff --git a/addons/website_slides/tests/test_ui_wslides.py b/addons/website_slides/tests/test_ui_wslides.py index 7338295a1db6..82d815bd4dc2 100644 --- a/addons/website_slides/tests/test_ui_wslides.py +++ b/addons/website_slides/tests/test_ui_wslides.py @@ -19,7 +19,7 @@ class TestUICommon(HttpCaseWithUserDemo, HttpCaseWithUserPortal): img_path = get_module_resource('website_slides', 'static', 'src', 'img', 'slide_demo_gardening_1.jpg') img_content = base64.b64encode(open(img_path, "rb").read()) - self.env['slide.channel'].create({ + self.channel = self.env['slide.channel'].create({ 'name': 'Basics of Gardening - Test', 'user_id': self.env.ref('base.user_admin').id, 'enroll': 'public', @@ -148,6 +148,24 @@ class TestUi(TestUICommon): 'odoo.__DEBUG__.services["web_tour.tour"].tours.full_screen_web_editor.ready', login=user_demo.login) + def test_course_reviews_elearning_officer(self): + user_demo = self.user_demo + user_demo.write({ + 'groups_id': [(6, 0, (self.env.ref('base.group_user') | self.env.ref( + 'website_slides.group_website_slides_officer')).ids)] + }) + + # The user must be a course member before being able to post a log note. + self.channel._action_add_members(user_demo.partner_id) + self.channel.with_user(user_demo).message_post( + body='Log note', subtype_xmlid='mail.mt_note', message_type='comment') + + self.browser_js( + '/slides', + 'odoo.__DEBUG__.services["web_tour.tour"].run("course_reviews")', + 'odoo.__DEBUG__.services["web_tour.tour"].tours.course_reviews.ready', + login=user_demo.login) + @tests.common.tagged('external', 'post_install', '-standard', '-at_install') class TestUiYoutube(HttpCaseWithUserDemo): diff --git a/addons/website_slides/views/assets.xml b/addons/website_slides/views/assets.xml index f614708bdf3d..9a8d62e614c9 100644 --- a/addons/website_slides/views/assets.xml +++ b/addons/website_slides/views/assets.xml @@ -44,6 +44,7 @@ <script type="text/javascript" src="/website_slides/static/src/tests/tours/slides_course_member.js"/> <script type="text/javascript" src="/website_slides/static/src/tests/tours/slides_course_member_yt.js"/> <script type="text/javascript" src="/website_slides/static/src/tests/tours/slides_course_publisher.js"/> + <script type="text/javascript" src="/website_slides/static/src/tests/tours/slides_course_reviews.js"/> <script type="text/javascript" src="/website_slides/static/src/tests/tours/slides_full_screen_web_editor.js"/> </xpath> </template> -- GitLab