[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.
This commit is contained in:
@@ -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();
|
||||
},
|
||||
|
||||
/**
|
||||
|
||||
@@ -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")'
|
||||
},
|
||||
|
||||
@@ -144,8 +144,12 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="pb-3 o_wslides_quiz_modal_rank_motivational">
|
||||
<t t-set="showLastRankDescription" t-value="widget.quiz.rankProgress.last_rank && !widget.quiz.rankProgress.level_up" />
|
||||
<t t-raw="showLastRankDescription ? widget.quiz.rankProgress.description : widget.quiz.rankProgress.previous_rank.motivational" />
|
||||
<t t-if="widget.quiz.rankProgress.last_rank and !widget.quiz.rankProgress.level_up">
|
||||
<t t-out="widget.quiz.rankProgress.description"/>
|
||||
</t>
|
||||
<t t-else="">
|
||||
<t t-out="widget.quiz.rankProgress.previous_rank.motivational"/>
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
<div class="o_wslides_quiz_modal_dismiss align-self-end d-none">
|
||||
|
||||
@@ -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',
|
||||
|
||||
Reference in New Issue
Block a user