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