Commit ef0812a6 by Tim Krones

Show review tips if there are some attempts left.

parent a69d4861
...@@ -948,6 +948,35 @@ class MentoringWithExplicitStepsBlock(BaseMentoringBlock, StudioContainerWithNes ...@@ -948,6 +948,35 @@ class MentoringWithExplicitStepsBlock(BaseMentoringBlock, StudioContainerWithNes
return Score(score, int(round(score * 100)), correct, incorrect, partially_correct) 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): def get_message_content(self, message_type, or_default=False):
for child_id in self.children: for child_id in self.children:
if child_isinstance(self, child_id, MentoringMessageBlock): if child_isinstance(self, child_id, MentoringMessageBlock):
......
...@@ -5,9 +5,10 @@ function MentoringWithStepsBlock(runtime, element) { ...@@ -5,9 +5,10 @@ function MentoringWithStepsBlock(runtime, element) {
); );
var activeStep = $('.mentoring', element).data('active-step'); var activeStep = $('.mentoring', element).data('active-step');
var gradeTemplate = _.template($('#xblock-grade-template').html()); 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 attemptsTemplate = _.template($('#xblock-attempts-template').html());
var reviewStep, checkmark, submitDOM, nextDOM, reviewDOM, tryAgainDOM, var reviewStep, checkmark, submitDOM, nextDOM, reviewDOM, tryAgainDOM,
assessmentMessageDOM, gradeDOM, attemptsDOM, submitXHR; assessmentMessageDOM, gradeDOM, attemptsDOM, reviewTipsDOM, submitXHR;
function isLastStep() { function isLastStep() {
return (activeStep === steps.length-1); return (activeStep === steps.length-1);
...@@ -56,6 +57,14 @@ function MentoringWithStepsBlock(runtime, element) { ...@@ -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) { function handleResults(response) {
// Update active step so next step is shown on page reload (even if user does not click "Next Step") // Update active step so next step is shown on page reload (even if user does not click "Next Step")
updateActiveStep(activeStep+1); updateActiveStep(activeStep+1);
...@@ -64,6 +73,7 @@ function MentoringWithStepsBlock(runtime, element) { ...@@ -64,6 +73,7 @@ function MentoringWithStepsBlock(runtime, element) {
if (response.attempt_complete) { if (response.attempt_complete) {
updateNumAttempts(); updateNumAttempts();
updateGrade(); updateGrade();
updateReviewTips();
} }
// Update UI // Update UI
...@@ -114,6 +124,7 @@ function MentoringWithStepsBlock(runtime, element) { ...@@ -114,6 +124,7 @@ function MentoringWithStepsBlock(runtime, element) {
assessmentMessageDOM.html(''); assessmentMessageDOM.html('');
gradeDOM.html(''); gradeDOM.html('');
attemptsDOM.html(''); attemptsDOM.html('');
reviewTipsDOM.empty().hide();
} }
function updateDisplay() { function updateDisplay() {
...@@ -142,6 +153,17 @@ function MentoringWithStepsBlock(runtime, element) { ...@@ -142,6 +153,17 @@ function MentoringWithStepsBlock(runtime, element) {
reviewStep.show(); reviewStep.show();
var data = gradeDOM.data(); var data = gradeDOM.data();
gradeDOM.html(gradeTemplate(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(); submitDOM.hide();
nextDOM.hide(); nextDOM.hide();
reviewDOM.hide(); reviewDOM.hide();
...@@ -247,6 +269,7 @@ function MentoringWithStepsBlock(runtime, element) { ...@@ -247,6 +269,7 @@ function MentoringWithStepsBlock(runtime, element) {
assessmentMessageDOM = $('.assessment-message', element); assessmentMessageDOM = $('.assessment-message', element);
gradeDOM = $('.grade', element); gradeDOM = $('.grade', element);
attemptsDOM = $('.attempts', element); attemptsDOM = $('.attempts', element);
reviewTipsDOM = $('.assessment-review-tips', element);
var options = { var options = {
onChange: onChange onChange: onChange
......
...@@ -20,7 +20,8 @@ ...@@ -20,7 +20,8 @@
data-score="{{ self.score.percentage }}" data-score="{{ self.score.percentage }}"
data-correct_answer="{{ self.score.correct|length }}" data-correct_answer="{{ self.score.correct|length }}"
data-incorrect_answer="{{ self.score.incorrect|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>
<div class="submit"> <div class="submit">
...@@ -35,6 +36,9 @@ ...@@ -35,6 +36,9 @@
</div> </div>
</div> </div>
<div class="assessment-review-tips"></div>
</div> </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