Commit ea3924a3 by Matjaz Gregoric

Hide MRQ question-level feedback on return.

When the pb_mcq_hide_previous_answer is set to True, question-level
feedback should not be displayed when user returns to the page.
parent 313837a5
......@@ -60,7 +60,7 @@ log = logging.getLogger(__name__)
loader = ResourceLoader(__name__)
_default_options_config = {
'pb_mcq_hide_previous_answer': False,
'pb_mcq_hide_previous_answer': False, # this works for both MCQs and MRQs.
'pb_hide_feedback_if_attempts_remain': False,
}
......
......@@ -206,8 +206,6 @@ function MRQBlock(runtime, element) {
var messageView = MessageView(element, mentoring);
display_message(result.message, messageView, options.checkmark);
var questionnaireDOM = $('fieldset.questionnaire', element);
var data = questionnaireDOM.data();
var hide_results = (data.hide_results === 'True' ||
......@@ -216,6 +214,10 @@ function MRQBlock(runtime, element) {
// so set hide_prev_answer to False after initial render.
questionnaireDOM.data('hide_prev_answer', 'False');
if (!hide_results) {
display_message(result.message, messageView, options.checkmark);
}
$.each(result.choices, function(index, choice) {
var choiceInputDOM = $('.choice input[value='+choice.value+']', element);
var choiceDOM = choiceInputDOM.closest('.choice');
......
......@@ -442,26 +442,87 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
@ddt.unpack
@ddt.data(
# MCQ with tips
("feedback_persistence_mcq_tips.xml", '.choice-tips'),
# Like the above but instead of tips in MCQ
# Questionnaire with tips.
("feedback_persistence_mcq_tips.xml", 'MCQ', True, False),
("feedback_persistence_mrq_tips.xml", 'MRQ', True, False),
# Like the above but instead of tips in MCQ/MRQ
# has a question level feedback. This feedback should also be suppressed.
("feedback_persistence_mcq_no_tips.xml", '.feedback')
("feedback_persistence_mcq_general_feedback.xml", 'MCQ', False, True),
("feedback_persistence_mrq_general_feedback.xml", 'MRQ', False, True),
# These examples have both the choice tips and the general feedback.
("feedback_persistence_mcq_general_feedback_and_tips.xml", 'MCQ', True, True),
("feedback_persistence_mrq_general_feedback_and_tips.xml", 'MRQ', True, True),
# And these have neither the tips nor the general feedback.
("feedback_persistence_mcq_no_feedback.xml", 'MCQ', False, False),
("feedback_persistence_mrq_no_feedback.xml", 'MRQ', False, False),
)
def test_feedback_persistence_tips(self, scenario, tips_selector):
def test_feedback_persistence_tips(self, scenario, question_type, has_tips, has_feedback):
tips_selector = '.choice-tips'
feedback_selector = '.feedback'
# Tests whether feedback (global message and choice tips) is hidden on reload.
with mock.patch("problem_builder.mentoring.MentoringBlock.get_options") as patched_options:
patched_options.return_value = {'pb_mcq_hide_previous_answer': True}
mentoring = self.load_scenario(scenario)
mcq = self._get_xblock(mentoring, "feedback_mcq_2")
messages = mentoring.find_element_by_css_selector(tips_selector)
self.assertFalse(messages.is_displayed())
self.click_choice(mcq, "Yes")
questionnaire = self._get_xblock(mentoring, "feedback_questionnaire")
choice = self._get_choice(questionnaire, 0)
choice_label = choice.find_element_by_css_selector('label')
choice_result = choice.find_element_by_css_selector('.choice-result')
tips = mentoring.find_element_by_css_selector(tips_selector)
feedback = mentoring.find_element_by_css_selector(feedback_selector)
self.assertFalse(tips.is_displayed())
self.assertFalse(feedback.is_displayed())
# Select choice.
choice_label.click()
self.click_submit(mentoring)
self.assertTrue(messages.is_displayed())
# If the question has no general feedback and no tips,
# nothing should be displayed.
if not has_feedback and not has_tips:
self.assertFalse(feedback.is_displayed())
self.assertFalse(tips.is_displayed())
# If there is general feedback, but no choice tips,
# general feedback is displayed after submitting the answer.
if has_feedback and not has_tips:
self.assertTrue(feedback.is_displayed())
self.assertFalse(tips.is_displayed())
# If there are tips but no feedback, the result depends on question type:
# - the tip is displayed by MCQs
# - nothing is displayed by MRQs
if has_tips and not has_feedback:
self.assertFalse(feedback.is_displayed())
if question_type == 'MCQ':
self.assertTrue(tips.is_displayed())
elif question_type == 'MRQ':
self.assertFalse(tips.is_displayed())
# If there are both tips and general feedback,
# the result depends on the question type:
# - the tip is displayed by MCQs
# - general feedback is displayed by MRQs.
if has_feedback and has_tips:
if question_type == 'MCQ':
self.assertTrue(tips.is_displayed())
self.assertFalse(feedback.is_displayed())
elif question_type == 'MRQ':
self.assertTrue(feedback.is_displayed())
self.assertFalse(tips.is_displayed())
# Click the result icon; this hides the general feedback and displays
# the choice tip, if present.
choice_result.click()
self.assertFalse(feedback.is_displayed())
if has_tips:
self.assertTrue(tips.is_displayed())
# Reload the page.
mentoring = self.reload_student_view()
messages = mentoring.find_element_by_css_selector(tips_selector)
self.assertFalse(messages.is_displayed())
tips = mentoring.find_element_by_css_selector(tips_selector)
feedback = mentoring.find_element_by_css_selector(feedback_selector)
# After reloading the page, neither the tips nor the feedback should be displayed.
self.assertFalse(tips.is_displayed())
self.assertFalse(feedback.is_displayed())
@ddt.data(
(0, "Yes", "Great!"),
......@@ -471,7 +532,7 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
@ddt.unpack
def test_clicking_result_icon_shows_tips(self, choice_index, choice_text, expected_tip):
mentoring = self.load_scenario("feedback_persistence_mcq_tips.xml")
mcq = self._get_xblock(mentoring, "feedback_mcq_2")
mcq = self._get_xblock(mentoring, "feedback_questionnaire")
question_title = mentoring.find_element_by_css_selector('.question-title')
choice = self._get_choice(mcq, choice_index)
choice_result = choice.find_element_by_css_selector('.choice-result')
......
<vertical_demo>
<problem-builder url_name="feedback" enforce_dependency="false">
<problem-builder url_name="feedback">
<pb-answer name="feedback_answer_1" />
<pb-mcq name="feedback_mcq_2" question="Do you like this MCQ?" correct_choices='["yes"]'>
......
<vertical_demo>
<problem-builder url_name="feedback_tips" enforce_dependency="false">
<problem-builder url_name="mcq_general_feedback">
<pb-mcq name="feedback_mcq_2" question="Do you like this MCQ?" correct_choices='["yes"]' message="Question level Feedback">
<pb-mcq name="feedback_questionnaire" question="Do you like this MCQ?" correct_choices='["yes"]' message="Question level Feedback">
<pb-choice value="yes">Yes</pb-choice>
<pb-choice value="maybenot">Maybe not</pb-choice>
<pb-choice value="understand">I don't understand</pb-choice>
......
<vertical_demo>
<problem-builder url_name="mcq_general_feedback_and_tips">
<pb-mcq name="feedback_questionnaire" question="Do you like this MCQ?" correct_choices='["yes"]' message="Question level Feedback">
<pb-choice value="yes">Yes</pb-choice>
<pb-choice value="maybenot">Maybe not</pb-choice>
<pb-choice value="understand">I don't understand</pb-choice>
<pb-tip values='["yes"]'>Great!</pb-tip>
<pb-tip values='["maybenot"]'>Ah, damn.</pb-tip>
<pb-tip values='["understand"]'><div id="test-custom-html">Really?</div></pb-tip>
</pb-mcq>
</problem-builder>
</vertical_demo>
<vertical_demo>
<problem-builder url_name="mcq_no_feedback">
<pb-mcq name="feedback_questionnaire" question="Do you like this MCQ?" correct_choices='["yes"]'>
<pb-choice value="yes">Yes</pb-choice>
<pb-choice value="maybenot">Maybe not</pb-choice>
<pb-choice value="understand">I don't understand</pb-choice>
</pb-mcq>
</problem-builder>
</vertical_demo>
<vertical_demo>
<problem-builder url_name="feedback_no_tips" enforce_dependency="false">
<problem-builder url_name="mcq_tips">
<pb-mcq name="feedback_mcq_2" question="Do you like this MCQ?" correct_choices='["yes"]'>
<pb-mcq name="feedback_questionnaire" question="Do you like this MCQ?" correct_choices='["yes"]'>
<pb-choice value="yes">Yes</pb-choice>
<pb-choice value="maybenot">Maybe not</pb-choice>
<pb-choice value="understand">I don't understand</pb-choice>
......
<vertical_demo>
<problem-builder url_name="mrq_general_feedback">
<pb-mrq name="feedback_questionnaire" question="What do you like in this MRQ?" required_choices='["elegance","beauty","gracefulness"]' message="Question level feedback">
<pb-choice value="elegance">Its elegance</pb-choice>
<pb-choice value="beauty">Its beauty</pb-choice>
<pb-choice value="gracefulness">Its gracefulness</pb-choice>
<pb-choice value="bugs">Its bugs</pb-choice>
</pb-mrq>
</problem-builder>
</vertical_demo>
<vertical_demo>
<problem-builder url_name="mrq_general_feedback_and_tips">
<pb-mrq name="feedback_questionnaire" question="What do you like in this MRQ?" required_choices='["elegance","beauty","gracefulness"]' message="Question level feedback">
<pb-choice value="elegance">Its elegance</pb-choice>
<pb-choice value="beauty">Its beauty</pb-choice>
<pb-choice value="gracefulness">Its gracefulness</pb-choice>
<pb-choice value="bugs">Its bugs</pb-choice>
<pb-tip values='["elegance"]'>This is something everyone has to like about this MRQ</pb-tip>
<pb-tip values='["beauty"]'>This is something everyone has to like about beauty</pb-tip>
<pb-tip values='["gracefulness"]'>This MRQ is indeed very graceful</pb-tip>
<pb-tip values='["bugs"]'>Nah, there aren't any!</pb-tip>
</pb-mrq>
</problem-builder>
</vertical_demo>
<vertical_demo>
<problem-builder url_name="mrq_no_feedback">
<pb-mrq name="feedback_questionnaire" question="What do you like in this MRQ?" required_choices='["elegance","beauty","gracefulness"]'>
<pb-choice value="elegance">Its elegance</pb-choice>
<pb-choice value="beauty">Its beauty</pb-choice>
<pb-choice value="gracefulness">Its gracefulness</pb-choice>
<pb-choice value="bugs">Its bugs</pb-choice>
</pb-mrq>
</problem-builder>
</vertical_demo>
<vertical_demo>
<problem-builder url_name="mrq_tips">
<pb-mrq name="feedback_questionnaire" question="What do you like in this MRQ?" required_choices='["elegance","beauty","gracefulness"]'>
<pb-choice value="elegance">Its elegance</pb-choice>
<pb-choice value="beauty">Its beauty</pb-choice>
<pb-choice value="gracefulness">Its gracefulness</pb-choice>
<pb-choice value="bugs">Its bugs</pb-choice>
<pb-tip values='["elegance"]'>This is something everyone has to like about this MRQ</pb-tip>
<pb-tip values='["beauty"]'>This is something everyone has to like about beauty</pb-tip>
<pb-tip values='["gracefulness"]'>This MRQ is indeed very graceful</pb-tip>
<pb-tip values='["bugs"]'>Nah, there aren't any!</pb-tip>
</pb-mrq>
</problem-builder>
</vertical_demo>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment