Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion problem_builder/mentoring.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
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,
}

Expand Down
6 changes: 4 additions & 2 deletions problem_builder/public/js/questionnaire.js
Original file line number Diff line number Diff line change
Expand Up @@ -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' ||
Expand All @@ -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');
Expand Down
87 changes: 74 additions & 13 deletions problem_builder/tests/integration/test_mentoring.py
Original file line number Diff line number Diff line change
Expand Up @@ -442,26 +442,87 @@ def assert_state(answer, mcq, mrq, rating, messages):

@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!"),
Expand All @@ -471,7 +532,7 @@ def test_feedback_persistence_tips(self, scenario, tips_selector):
@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')
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<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"]'>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<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>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<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>
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<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>
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<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>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<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>
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<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>
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<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>
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<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>