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
1 change: 1 addition & 0 deletions problem_builder/answer.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ class AnswerBlock(SubmittingXBlockMixin, AnswerMixin, QuestionMixin, StudioEdita
"""
CATEGORY = 'pb-answer'
STUDIO_LABEL = _(u"Long Answer")
answerable = True

name = String(
display_name=_("Question ID (name)"),
Expand Down
59 changes: 47 additions & 12 deletions problem_builder/public/js/mentoring_with_steps.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,15 @@ function MentoringWithStepsBlock(runtime, element) {
}
}

function postUpdateStep(response) {
activeStep = response.active_step;
if (activeStep === -1) {
updateNumAttempts();
} else {
updateControls();
}
}

function handleResults(response) {
showFeedback(response);

Expand All @@ -64,14 +73,7 @@ function MentoringWithStepsBlock(runtime, element) {
// Otherwise, get UI ready for showing next step.
var handlerUrl = runtime.handlerUrl(element, 'update_active_step');
$.post(handlerUrl, JSON.stringify(activeStep+1))
.success(function(response) {
activeStep = response.active_step;
if (activeStep === -1) {
updateNumAttempts();
} else {
updateControls();
}
});
.success(postUpdateStep);
}

function updateNumAttempts() {
Expand Down Expand Up @@ -138,6 +140,14 @@ function MentoringWithStepsBlock(runtime, element) {
step.submit(handleResults);
}

function markRead() {
var handlerUrl = runtime.handlerUrl(element, 'update_active_step');
$.post(handlerUrl, JSON.stringify(activeStep+1)).success(function (response) {
postUpdateStep(response);
updateDisplay();
});
}

function getResults() {
var step = steps[activeStep];
step.getResults(handleReviewResults);
Expand Down Expand Up @@ -195,9 +205,18 @@ function MentoringWithStepsBlock(runtime, element) {
showActiveStep();
validateXBlock();
updateNextLabel();
nextDOM.attr('disabled', 'disabled');
var step = steps[activeStep];
if (step.hasQuestion()) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Kelketek these two new blocks are almost identical - would be good to refactor them into method.

nextDOM.attr('disabled', 'disabled');
} else {
nextDOM.removeAttr('disabled');
}
if (isLastStep() && reviewStep) {
reviewDOM.attr('disabled', 'disabled');
if (step.hasQuestion()) {
reviewDOM.attr('disabled', 'disabled');
} else {
reviewDOM.removeAttr('disabled')
}
reviewDOM.show();
}
}
Expand Down Expand Up @@ -261,9 +280,14 @@ function MentoringWithStepsBlock(runtime, element) {
nextDOM.show();
nextDOM.removeAttr('disabled');
}
var step = steps[activeStep];

tryAgainDOM.hide();
submitDOM.show();
if (step.hasQuestion()) {
submitDOM.show();
} else {
submitDOM.hide();
}
submitDOM.attr('disabled', 'disabled');
reviewLinkDOM.show();

Expand Down Expand Up @@ -302,8 +326,19 @@ function MentoringWithStepsBlock(runtime, element) {
} else {
submitDOM.removeAttr('disabled');
}
if (isLastStep()) {
if (isLastStep() && step.hasQuestion()) {
nextDOM.hide();
} else if (isLastStep()) {
reviewDOM.one('click', markRead);
reviewDOM.removeAttr('disabled');
nextDOM.hide()
} else if (!step.hasQuestion()) {
nextDOM.one('click', markRead);
}
if (step.hasQuestion()) {
submitDOM.show();
} else {
submitDOM.hide();
}
}

Expand Down
4 changes: 4 additions & 0 deletions problem_builder/public/js/step.js
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,10 @@ function MentoringStepBlock(runtime, element) {

getStepLabel: function() {
return $('.sb-step', element).data('next-button-label');
},

hasQuestion: function() {
return $('.sb-step', element).data('has-question')
}

};
Expand Down
1 change: 1 addition & 0 deletions problem_builder/questionnaire.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ class QuestionnaireAbstractBlock(
)
editable_fields = ('question', 'message', 'weight', 'display_name', 'show_title')
has_children = True
answerable = True

@lazy
def html_id(self):
Expand Down
4 changes: 4 additions & 0 deletions problem_builder/step.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,10 @@ def allowed_nested_blocks(self):
AnswerRecapBlock, MentoringTableBlock,
]

@property
def has_question(self):
return any(getattr(child, 'answerable', False) for child in self.steps)

@XBlock.json_handler
def submit(self, submissions, suffix=''):
log.info(u'Received submissions: {}'.format(submissions))
Expand Down
2 changes: 1 addition & 1 deletion problem_builder/templates/html/step.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<div class="sb-step" data-next-button-label="{{ self.next_button_label }}">
<div class="sb-step" data-next-button-label="{{ self.next_button_label }}" {% if self.has_question %} data-has-question="true" {% endif %}>
{% if show_title %}
<div class="title">
<h3>
Expand Down
27 changes: 27 additions & 0 deletions problem_builder/tests/integration/test_step_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,7 @@ def extended_feedback_checks(self, step_builder, controls, expected_results):
# It should be possible to visit the MRQ from here
self.wait_until_clickable(controls.next_question)
controls.next_question.click()
self.html_section(step_builder, controls)
self.peek_at_multiple_response_question(
None, step_builder, controls, extended_feedback=True, alternative_review=True
)
Expand All @@ -230,6 +231,24 @@ def test_next_label(self):
self.expect_question_visible(None, step_builder)
self.assertEqual(controls.next_question.get_attribute('value'), "Next Challenge")

def html_section(self, step_builder, controls, last=False):
self.wait_until_hidden(controls.submit)
target_control = controls.review if last else controls.next_question
self.wait_until_clickable(target_control)
target_control.click()

def test_html_last(self):
step_builder, controls = self.load_assessment_scenario("step_builder_html_last.xml")
# Step 1
# Submit free-form answer, go to next step
self.freeform_answer(None, step_builder, controls, 'This is the answer', CORRECT)

# Step 2
# Submit MCQ, go to next step
self.single_choice_question(None, step_builder, controls, 'Maybe not', INCORRECT)

self.html_section(step_builder, controls, last=True)

@data(
{"max_attempts": 0, "extended_feedback": False}, # Unlimited attempts, no extended feedback
{"max_attempts": 1, "extended_feedback": True}, # Limited attempts, extended feedback
Expand All @@ -253,6 +272,9 @@ def test_step_builder(self, params):
# Submit rating, go to next step
self.rating_question(None, step_builder, controls, "5 - Extremely good", CORRECT)

# Step 4, html with no question.
self.html_section(step_builder, controls)

# Last step
# Submit MRQ, go to review
with patch.object(WorkbenchRuntime, 'publish') as patched_method:
Expand Down Expand Up @@ -308,6 +330,8 @@ def test_step_builder(self, params):
# Submit rating, go to next step
self.rating_question(None, step_builder, controls, "1 - Not good at all", INCORRECT)

# Step 4, read only. Go to next step.
self.html_section(step_builder, controls)
# Last step
# Submit MRQ, go to review
user_selection = ("Its elegance", "Its beauty", "Its gracefulness")
Expand Down Expand Up @@ -350,6 +374,7 @@ def test_review_tips(self):
self.freeform_answer(None, step_builder, controls, 'This is the answer', CORRECT)
self.single_choice_question(None, step_builder, controls, 'Maybe not', INCORRECT)
self.rating_question(None, step_builder, controls, "5 - Extremely good", CORRECT)
self.html_section(step_builder, controls)
self.multiple_response_question(None, step_builder, controls, ("Its beauty",), PARTIAL, last=True)

# The review tips for MCQ 2 and the MRQ should be shown:
Expand All @@ -374,6 +399,7 @@ def test_review_tips(self):
self.single_choice_question(None, step_builder, controls, 'Yes', CORRECT)
self.rating_question(None, step_builder, controls, "5 - Extremely good", CORRECT)
user_selection = ("Its elegance", "Its beauty", "Its gracefulness")
self.html_section(step_builder, controls)
self.multiple_response_question(None, step_builder, controls, user_selection, CORRECT, last=True)

# If attempts remain and student got all answers right, show "complete" message
Expand All @@ -390,6 +416,7 @@ def test_review_tips(self):
)
self.single_choice_question(None, step_builder, controls, 'Maybe not', INCORRECT)
self.rating_question(None, step_builder, controls, "1 - Not good at all", INCORRECT)
self.html_section(step_builder, controls)
self.multiple_response_question(None, step_builder, controls, ("Its beauty",), PARTIAL, last=True)

# The review tips will not be shown because no attempts remain:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@
</pb-rating>
</sb-step>

<sb-step display_name="Fourth Step">
<html_demo>Test test test</html_demo>
</sb-step>

<sb-step display_name="Last step">
<pb-mrq name="mrq_1_1" question="What do you like in this MRQ?" required_choices='["gracefulness","elegance","beauty"]' message="Question Feedback Message">
<pb-choice value="elegance">Its elegance</pb-choice>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<step-builder url_name="step-builder" display_name="Step Builder"
max_attempts="1" extended_feedback="True">

<sb-step display_name="First step" next_button_label="Next Challenge">
<pb-answer name="goal" question="What is your goal?" />
</sb-step>

<sb-step display_name="Second step" next_button_label="Next Item">
<pb-mcq name="mcq_1_1" 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-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>
</sb-step>

<sb-step display_name="Last HTML step">
<html_demo>Bla bla bla</html_demo>
</sb-step>

<sb-review-step />

</step-builder>