Commit 527671f1 by Matjaz Gregoric

Merge pull request #116 from open-craft/hide-mrq-feedback

Hide MRQ question-level feedback on return.
parents 313837a5 ea3924a3
...@@ -60,7 +60,7 @@ log = logging.getLogger(__name__) ...@@ -60,7 +60,7 @@ log = logging.getLogger(__name__)
loader = ResourceLoader(__name__) loader = ResourceLoader(__name__)
_default_options_config = { _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, 'pb_hide_feedback_if_attempts_remain': False,
} }
......
...@@ -206,8 +206,6 @@ function MRQBlock(runtime, element) { ...@@ -206,8 +206,6 @@ function MRQBlock(runtime, element) {
var messageView = MessageView(element, mentoring); var messageView = MessageView(element, mentoring);
display_message(result.message, messageView, options.checkmark);
var questionnaireDOM = $('fieldset.questionnaire', element); var questionnaireDOM = $('fieldset.questionnaire', element);
var data = questionnaireDOM.data(); var data = questionnaireDOM.data();
var hide_results = (data.hide_results === 'True' || var hide_results = (data.hide_results === 'True' ||
...@@ -216,6 +214,10 @@ function MRQBlock(runtime, element) { ...@@ -216,6 +214,10 @@ function MRQBlock(runtime, element) {
// so set hide_prev_answer to False after initial render. // so set hide_prev_answer to False after initial render.
questionnaireDOM.data('hide_prev_answer', 'False'); questionnaireDOM.data('hide_prev_answer', 'False');
if (!hide_results) {
display_message(result.message, messageView, options.checkmark);
}
$.each(result.choices, function(index, choice) { $.each(result.choices, function(index, choice) {
var choiceInputDOM = $('.choice input[value='+choice.value+']', element); var choiceInputDOM = $('.choice input[value='+choice.value+']', element);
var choiceDOM = choiceInputDOM.closest('.choice'); var choiceDOM = choiceInputDOM.closest('.choice');
......
...@@ -442,26 +442,87 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -442,26 +442,87 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
@ddt.unpack @ddt.unpack
@ddt.data( @ddt.data(
# MCQ with tips # Questionnaire with tips.
("feedback_persistence_mcq_tips.xml", '.choice-tips'), ("feedback_persistence_mcq_tips.xml", 'MCQ', True, False),
# Like the above but instead of tips in MCQ ("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. # 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. # Tests whether feedback (global message and choice tips) is hidden on reload.
with mock.patch("problem_builder.mentoring.MentoringBlock.get_options") as patched_options: with mock.patch("problem_builder.mentoring.MentoringBlock.get_options") as patched_options:
patched_options.return_value = {'pb_mcq_hide_previous_answer': True} patched_options.return_value = {'pb_mcq_hide_previous_answer': True}
mentoring = self.load_scenario(scenario) mentoring = self.load_scenario(scenario)
mcq = self._get_xblock(mentoring, "feedback_mcq_2") questionnaire = self._get_xblock(mentoring, "feedback_questionnaire")
messages = mentoring.find_element_by_css_selector(tips_selector) choice = self._get_choice(questionnaire, 0)
self.assertFalse(messages.is_displayed()) choice_label = choice.find_element_by_css_selector('label')
self.click_choice(mcq, "Yes") 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.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() mentoring = self.reload_student_view()
messages = mentoring.find_element_by_css_selector(tips_selector) tips = mentoring.find_element_by_css_selector(tips_selector)
self.assertFalse(messages.is_displayed()) 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( @ddt.data(
(0, "Yes", "Great!"), (0, "Yes", "Great!"),
...@@ -471,7 +532,7 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -471,7 +532,7 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
@ddt.unpack @ddt.unpack
def test_clicking_result_icon_shows_tips(self, choice_index, choice_text, expected_tip): def test_clicking_result_icon_shows_tips(self, choice_index, choice_text, expected_tip):
mentoring = self.load_scenario("feedback_persistence_mcq_tips.xml") 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') question_title = mentoring.find_element_by_css_selector('.question-title')
choice = self._get_choice(mcq, choice_index) choice = self._get_choice(mcq, choice_index)
choice_result = choice.find_element_by_css_selector('.choice-result') choice_result = choice.find_element_by_css_selector('.choice-result')
......
<vertical_demo> <vertical_demo>
<problem-builder url_name="feedback" enforce_dependency="false"> <problem-builder url_name="feedback">
<pb-answer name="feedback_answer_1" /> <pb-answer name="feedback_answer_1" />
<pb-mcq name="feedback_mcq_2" question="Do you like this MCQ?" correct_choices='["yes"]'> <pb-mcq name="feedback_mcq_2" question="Do you like this MCQ?" correct_choices='["yes"]'>
......
<vertical_demo> <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="yes">Yes</pb-choice>
<pb-choice value="maybenot">Maybe not</pb-choice> <pb-choice value="maybenot">Maybe not</pb-choice>
<pb-choice value="understand">I don't understand</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> <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="yes">Yes</pb-choice>
<pb-choice value="maybenot">Maybe not</pb-choice> <pb-choice value="maybenot">Maybe not</pb-choice>
<pb-choice value="understand">I don't understand</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