From 0691736b49543905091daa5208ff361d6bee4ece Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 19 May 2021 10:42:19 +0000 Subject: [PATCH] [IMP] website_slides: de-traw-ify Replace the t-raws used for the end-of-quiz message by t-outs. This requires marking the two subfields of `quiz/submit` as Markup, rewrite the method in a more modern style while at it. Also update the tour to ensure that the message is indeed inserted as markup, reset the users' karma to a known value to ensure the motivational message is predictable. --- .../static/src/js/slides_course_quiz.js | 53 ++++++++++--------- .../src/tests/tours/slides_course_member.js | 3 ++ .../static/src/xml/slide_quiz.xml | 8 ++- .../website_slides/tests/test_ui_wslides.py | 7 ++- 4 files changed, 43 insertions(+), 28 deletions(-) diff --git a/addons/website_slides/static/src/js/slides_course_quiz.js b/addons/website_slides/static/src/js/slides_course_quiz.js index 6d2fd3558bc..96efa0c37f6 100644 --- a/addons/website_slides/static/src/js/slides_course_quiz.js +++ b/addons/website_slides/static/src/js/slides_course_quiz.js @@ -5,6 +5,7 @@ odoo.define('website_slides.quiz', function (require) { var Dialog = require('web.Dialog'); var core = require('web.core'); var session = require('web.session'); + const {Markup} = require('web.utils'); var CourseJoinWidget = require('website_slides.course.join.widget').courseJoinWidget; var QuestionFormWidget = require('website_slides.quiz.question.form'); @@ -342,35 +343,39 @@ odoo.define('website_slides.quiz', function (require) { * * @private */ - _submitQuiz: function () { - var self = this; - - return this._rpc({ + async _submitQuiz() { + const data = await this._rpc({ route: '/slides/slide/quiz/submit', params: { - slide_id: self.slide.id, + slide_id: this.slide.id, answer_ids: this._getQuizAnswers(), } - }).then(function (data) { - if (data.error) { - self._alertShow(data.error); - } else { - self.quiz = _.extend(self.quiz, data); - if (data.completed) { - self._disableAnswers(); - new SlideQuizFinishModal(self, { - quiz: self.quiz, - hasNext: self.slide.hasNext, - userId: self.userId - }).open(); - self.slide.completed = true; - self.trigger_up('slide_completed', {slide: self.slide, completion: data.channel_completion}); - } - self._hideEditOptions(); - self._renderAnswersHighlightingAndComments(); - self._renderValidationInfo(); - } }); + if (data.error) { + this._alertShow(data.error); + return; + } + Object.assign(this.quiz, data); + const {rankProgress, completed, channel_completion: completion} = this.quiz; + // two of the rankProgress properties are HTML messages, mark if set + if ('description' in rankProgress) { + rankProgress['description'] = Markup(rankProgress['description'] || ''); + rankProgress['previous_rank']['motivational'] = + Markup(rankProgress['previous_rank']['motivational'] || ''); + } + if (completed) { + this._disableAnswers(); + new SlideQuizFinishModal(this, { + quiz: this.quiz, + hasNext: this.slide.hasNext, + userId: this.userId + }).open(); + this.slide.completed = true; + this.trigger_up('slide_completed', {slide: this.slide, completion}); + } + this._hideEditOptions(); + this._renderAnswersHighlightingAndComments(); + this._renderValidationInfo(); }, /** diff --git a/addons/website_slides/static/src/tests/tours/slides_course_member.js b/addons/website_slides/static/src/tests/tours/slides_course_member.js index 79818f82854..5ab7e4d461d 100644 --- a/addons/website_slides/static/src/tests/tours/slides_course_member.js +++ b/addons/website_slides/static/src/tests/tours/slides_course_member.js @@ -105,6 +105,9 @@ tour.register('course_member', { trigger: '.o_wslides_js_lesson_quiz_question:last .list-group a:first' }, { trigger: '.o_wslides_js_lesson_quiz_submit' +}, { + // check that we have a properly motivational message to motivate us! + trigger: '.o_wslides_quiz_modal_rank_motivational > div > div:contains("Reach the next rank and gain a very nice mug !")' }, { trigger: 'a:contains("End course")' }, diff --git a/addons/website_slides/static/src/xml/slide_quiz.xml b/addons/website_slides/static/src/xml/slide_quiz.xml index aa7bcc3f835..c2d6784791a 100644 --- a/addons/website_slides/static/src/xml/slide_quiz.xml +++ b/addons/website_slides/static/src/xml/slide_quiz.xml @@ -144,8 +144,12 @@
- - + + + + + +
diff --git a/addons/website_slides/tests/test_ui_wslides.py b/addons/website_slides/tests/test_ui_wslides.py index 7338295a1db..96f907883c2 100644 --- a/addons/website_slides/tests/test_ui_wslides.py +++ b/addons/website_slides/tests/test_ui_wslides.py @@ -102,7 +102,8 @@ class TestUi(TestUICommon): user_demo = self.user_demo user_demo.flush() user_demo.write({ - 'groups_id': [(5, 0), (4, self.env.ref('base.group_user').id)] + 'karma': 1, + 'groups_id': [(6, 0, self.env.ref('base.group_user').ids)] }) self.browser_js( @@ -115,7 +116,8 @@ class TestUi(TestUICommon): user_demo = self.user_demo user_demo.flush() user_demo.write({ - 'groups_id': [(5, 0), (4, self.env.ref('base.group_user').id), (4, self.env.ref('website_slides.group_website_slides_officer').id)] + 'karma': 1, + 'groups_id': [(6, 0, (self.env.ref('base.group_user') | self.env.ref('website_slides.group_website_slides_officer')).ids)] }) self.browser_js( @@ -127,6 +129,7 @@ class TestUi(TestUICommon): def test_course_member_portal(self): user_portal = self.user_portal user_portal.flush() + user_portal.karma = 1 self.browser_js( '/slides',