Commit ef0812a6 by Tim Krones

Show review tips if there are some attempts left.

parent a69d4861
......@@ -948,6 +948,35 @@ class MentoringWithExplicitStepsBlock(BaseMentoringBlock, StudioContainerWithNes
return Score(score, int(round(score * 100)), correct, incorrect, partially_correct)
@property
def review_tips(self):
""" Get review tips, shown for wrong answers. """
review_tips = []
status_cache = dict()
steps = self.get_steps()
for step in steps:
status_cache.update(dict(step.student_results))
for question in self.get_questions():
result = status_cache.get(question.name)
if result and result.get('status') != 'correct':
# The student got this wrong. Check if there is a review tip to show.
tip_html = question.get_review_tip()
if tip_html:
if hasattr(self.runtime, 'replace_jump_to_id_urls'):
tip_html = self.runtime.replace_jump_to_id_urls(tip_html)
review_tips.append(tip_html)
return review_tips
@property
def review_tips_json(self):
return json.dumps(self.review_tips)
@XBlock.json_handler
def get_review_tips(self, data, suffix):
return {
'review_tips': self.review_tips
}
def get_message_content(self, message_type, or_default=False):
for child_id in self.children:
if child_isinstance(self, child_id, MentoringMessageBlock):
......
......@@ -5,9 +5,10 @@ function MentoringWithStepsBlock(runtime, element) {
);
var activeStep = $('.mentoring', element).data('active-step');
var gradeTemplate = _.template($('#xblock-grade-template').html());
var reviewTipsTemplate = _.template($('#xblock-review-tips-template').html()); // Tips about specific questions the user got wrong
var attemptsTemplate = _.template($('#xblock-attempts-template').html());
var reviewStep, checkmark, submitDOM, nextDOM, reviewDOM, tryAgainDOM,
assessmentMessageDOM, gradeDOM, attemptsDOM, submitXHR;
assessmentMessageDOM, gradeDOM, attemptsDOM, reviewTipsDOM, submitXHR;
function isLastStep() {
return (activeStep === steps.length-1);
......@@ -56,6 +57,14 @@ function MentoringWithStepsBlock(runtime, element) {
});
}
function updateReviewTips() {
var handlerUrl = runtime.handlerUrl(element, 'get_review_tips');
$.post(handlerUrl, JSON.stringify({}))
.success(function(response) {
gradeDOM.data('assessment_review_tips', response.review_tips);
});
}
function handleResults(response) {
// Update active step so next step is shown on page reload (even if user does not click "Next Step")
updateActiveStep(activeStep+1);
......@@ -64,6 +73,7 @@ function MentoringWithStepsBlock(runtime, element) {
if (response.attempt_complete) {
updateNumAttempts();
updateGrade();
updateReviewTips();
}
// Update UI
......@@ -114,6 +124,7 @@ function MentoringWithStepsBlock(runtime, element) {
assessmentMessageDOM.html('');
gradeDOM.html('');
attemptsDOM.html('');
reviewTipsDOM.empty().hide();
}
function updateDisplay() {
......@@ -142,6 +153,17 @@ function MentoringWithStepsBlock(runtime, element) {
reviewStep.show();
var data = gradeDOM.data();
gradeDOM.html(gradeTemplate(data));
// Review tips
if (someAttemptsLeft()) {
if (data.assessment_review_tips.length > 0) {
// on-assessment-review-question messages specific to questions the student got wrong:
reviewTipsDOM.html(reviewTipsTemplate({
tips: data.assessment_review_tips
}));
reviewTipsDOM.show();
}
}
submitDOM.hide();
nextDOM.hide();
reviewDOM.hide();
......@@ -247,6 +269,7 @@ function MentoringWithStepsBlock(runtime, element) {
assessmentMessageDOM = $('.assessment-message', element);
gradeDOM = $('.grade', element);
attemptsDOM = $('.attempts', element);
reviewTipsDOM = $('.assessment-review-tips', element);
var options = {
onChange: onChange
......
......@@ -20,7 +20,8 @@
data-score="{{ self.score.percentage }}"
data-correct_answer="{{ self.score.correct|length }}"
data-incorrect_answer="{{ self.score.incorrect|length }}"
data-partially_correct_answer="{{ self.score.partially_correct|length }}">
data-partially_correct_answer="{{ self.score.partially_correct|length }}"
data-assessment_review_tips="{{ self.review_tips_json }}">
</div>
<div class="submit">
......@@ -35,6 +36,9 @@
</div>
</div>
<div class="assessment-review-tips"></div>
</div>
</div>
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