[FIX] website_slides: Remove read access on slide.answer

This commit removes the read access on slide.answer for all
users except website_publisher and admin

Task: #1947884
PR: #32083

Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
This commit is contained in:
qmo-odoo
2019-05-06 06:24:38 +00:00
parent b0aa580c05
commit b6f185b45d
4 changed files with 39 additions and 33 deletions
+20 -19
View File
@@ -119,9 +119,25 @@ class WebsiteSlides(WebsiteProfile):
return values
def _get_slide_quiz_info(self, slide, quiz_done=False):
def _get_slide_quiz_partner_info(self, slide, quiz_done=False):
return slide._compute_quiz_info(request.env.user.partner_id, quiz_done=quiz_done)[slide.id]
def _get_slide_quiz_data(self, slide):
slide_completed = slide.user_membership_id.sudo().completed
values = {
'slide_questions': [{
'id': question.id,
'question': question.question,
'answers': [{
'id': answer.id,
'text_value': answer.text_value,
'is_correct': answer.is_correct if slide_completed else None
} for answer in question.sudo().answer_ids],
} for question in slide.question_ids]
}
values.update(self._get_slide_quiz_partner_info(slide))
return values
# CHANNEL UTILITIES
# --------------------------------------------------
@@ -489,7 +505,7 @@ class WebsiteSlides(WebsiteProfile):
values = self._get_slide_detail(slide)
# quiz-specific: update with karma and quiz information
if slide.question_ids:
values.update(self._get_slide_quiz_info(slide))
values.update(self._get_slide_quiz_data(slide))
# sidebar: update with user channel progress
values['channel_progress'] = self._get_channel_progress(slide.channel_id, include_quiz=True)
@@ -623,22 +639,7 @@ class WebsiteSlides(WebsiteProfile):
if fetch_res.get('error'):
return fetch_res
slide = fetch_res['slide']
quiz_info = self._get_slide_quiz_info(slide)
slide_completed = slide.user_membership_id.sudo().completed
return {
'questions': [{
'id': question.id,
'question': question.question,
'answers': [{
'id': answer.id,
'text_value': answer.text_value,
'is_correct': answer.is_correct if slide_completed else None
} for answer in question.answer_ids],
} for question in slide.question_ids],
'quizAttemptsCount': quiz_info['quiz_attempts_count'],
'quizKarmaGain': quiz_info['quiz_karma_gain'],
'quizKarmaWon': quiz_info['quiz_karma_won'],
}
return self._get_slide_quiz_data(slide)
@http.route('/slides/slide/quiz/submit', type="json", auth="public", website=True)
def slide_quiz_submit(self, slide_id, answer_ids):
@@ -662,7 +663,7 @@ class WebsiteSlides(WebsiteProfile):
user_good_answers = user_answers - user_bad_answers
self._set_viewed_slide(slide, quiz_attempts_inc=True)
quiz_info = self._get_slide_quiz_info(slide, quiz_done=True)
quiz_info = self._get_slide_quiz_partner_info(slide, quiz_done=True)
rank_progress = {}
if not user_bad_answers:
@@ -5,7 +5,7 @@ access_slide_slide_partner_all,slide.slide.partner.all,model_slide_slide_partner
access_slide_slide_partner_system,slide.slide.partner.system,model_slide_slide_partner,website.group_website_publisher,1,1,1,1
access_slide_question_all,slide.question.all,model_slide_question,,1,0,0,0
access_slide_question_publisher,slide.question.publisher,model_slide_question,website.group_website_publisher,1,1,1,1
access_slide_answer_all,slide.answer.all,model_slide_answer,,1,0,0,0
access_slide_answer_all,slide.answer.all,model_slide_answer,,0,0,0,0
access_slide_answer_publisher,slide.answer.publisher,model_slide_answer,website.group_website_publisher,1,1,1,1
access_slide_tag_all,slide.tag.all,model_slide_tag,,1,0,0,0
access_slide_tag_publisher,slide.tag.publisher,model_slide_tag,website.group_website_publisher,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
5 access_slide_slide_partner_system slide.slide.partner.system model_slide_slide_partner website.group_website_publisher 1 1 1 1
6 access_slide_question_all slide.question.all model_slide_question 1 0 0 0
7 access_slide_question_publisher slide.question.publisher model_slide_question website.group_website_publisher 1 1 1 1
8 access_slide_answer_all slide.answer.all model_slide_answer 1 0 0 0 0
9 access_slide_answer_publisher slide.answer.publisher model_slide_answer website.group_website_publisher 1 1 1 1
10 access_slide_tag_all slide.tag.all model_slide_tag 1 0 0 0
11 access_slide_tag_publisher slide.tag.publisher model_slide_tag website.group_website_publisher 1 1 1 1
@@ -106,7 +106,12 @@ odoo.define('website_slides.quiz', function (require) {
'slide_id': self.slide.id,
}
}).then(function (quiz_data) {
self.quiz = quiz_data;
self.quiz = {
questions: quiz_data.slide_questions,
quizAttemptsCount: quiz_data.quiz_attempts_count,
quizKarmaGain: quiz_data.quiz_karma_gain,
quizKarmaWon: quiz_data.quiz_karma_won
};
});
},
@@ -426,27 +426,27 @@
t-att-data-quiz-karma-won="quiz_karma_won"
t-att-data-has-next="1 if next_slide else 0"
t-att-data-next-slide-url="'/slides/slide/%s' % (slug(next_slide)) if next_slide else None">
<div t-foreach="slide.question_ids" t-as="question"
t-att-class="'o_wslides_js_lesson_quiz_question mt-3 %s' % ('completed-disabled' if slide_completed else ('disabled' if not slide.channel_id.is_member else ''))" t-att-data-question-id="question.id" t-att-data-title="question.question">
<div t-foreach="slide_questions" t-as="question"
t-att-class="'o_wslides_js_lesson_quiz_question mt-3 %s' % ('completed-disabled' if slide_completed else ('disabled' if not slide.channel_id.is_member else ''))" t-att-data-question-id="question['id']" t-att-data-title="question['question']">
<div class="h4">
<small class="text-muted"><span t-esc="question_index+1"/>. </small> <span t-esc="question.question"/>
<small class="text-muted"><span t-esc="question_index+1"/>. </small> <span t-esc="question['question']"/>
</div>
<div class="list-group">
<t t-foreach="question.answer_ids" t-as="answer">
<a t-att-data-answer-id="answer.id" href="#"
t-att-data-text="answer.text_value"
t-att-class="'o_wslides_quiz_answer list-group-item list-group-item-action d-flex align-items-center %s' % ('list-group-item-success' if slide_completed and answer.is_correct else '')">
<t t-foreach="question['answers']" t-as="answer">
<a t-att-data-answer-id="answer['id']" href="#"
t-att-data-text="answer['text_value']"
t-att-class="'o_wslides_quiz_answer list-group-item list-group-item-action d-flex align-items-center %s' % ('list-group-item-success' if slide_completed and answer['is_correct'] else '')">
<label class="my-0 d-flex align-items-center justify-content-center mr-2">
<input type="radio"
t-att-name="question.id"
t-att-value="answer.id"
t-att-name="question['id']"
t-att-value="answer['id']"
class="d-none"
t-att-disabled="True if not slide.channel_id.is_member or slide_completed else ''"/>
<i t-att-class="'fa fa-circle text-400 %s' % ('d-none' if slide_completed and answer.is_correct else '')"/>
<i t-att-class="'fa fa-circle text-400 %s' % ('d-none' if slide_completed and answer['is_correct'] else '')"/>
<i class="fa fa-times-circle text-danger d-none"></i>
<i t-att-class="'fa fa-check-circle text-success %s' % ('d-none' if not (slide_completed and answer.is_correct) else '')"></i>
<i t-att-class="'fa fa-check-circle text-success %s' % ('d-none' if not (slide_completed and answer['is_correct']) else '')"></i>
</label>
<span t-esc="answer.text_value"/>
<span t-esc="answer['text_value']"/>
</a>
</t>
</div>