Commit b2ec081a by Andy Armstrong

Improve handling of submission cancellation

parent 2b754516
...@@ -214,7 +214,7 @@ ...@@ -214,7 +214,7 @@
{% endif %} {% endif %}
<div class="staff-info__status ui-staff__content__section wrapper--ui--collapse"> <div class="staff-info__status ui-staff__content__section wrapper--ui--collapse">
<div class="ui-staff ui-toggle-visibility is--collapsed"> <div class="ui-staff ui-toggle-visibility {% if expanded_view != 'final-grade' %}is--collapsed {% endif %}">
<h2 class="staff-info__title ui-staff__subtitle ui-toggle-visibility__control"> <h2 class="staff-info__title ui-staff__subtitle ui-toggle-visibility__control">
<i class="icon fa fa-caret-right"></i> <i class="icon fa fa-caret-right"></i>
<span>{% trans "Learner's Final Grade" %}</span> <span>{% trans "Learner's Final Grade" %}</span>
...@@ -229,7 +229,7 @@ ...@@ -229,7 +229,7 @@
{% elif workflow_status == "waiting" %} {% elif workflow_status == "waiting" %}
<p>{% trans "The submission is waiting for assessments." %}</p> <p>{% trans "The submission is waiting for assessments." %}</p>
{% elif workflow_status == "cancelled" %} {% elif workflow_status == "cancelled" %}
<p>{% trans "The submission has been cancelled." %}</p> <p>{% trans "The learner's submission has been removed from peer assessment. The learner receives a grade of zero unless you reset the learner's attempts for the problem to allow them to resubmit a response." %}</p>
{% elif workflow_status == None %} {% elif workflow_status == None %}
<p>{% trans "The problem has not been started." %}</p> <p>{% trans "The problem has not been started." %}</p>
{% else %} {% else %}
...@@ -240,7 +240,7 @@ ...@@ -240,7 +240,7 @@
</div> </div>
<div class="staff-info__staff-override ui-staff__content__section wrapper--ui--collapse"> <div class="staff-info__staff-override ui-staff__content__section wrapper--ui--collapse">
<div class="ui-staff ui-toggle-visibility is--collapsed"> <div class="ui-staff ui-toggle-visibility {% if expanded_view != 'staff-override' %}is--collapsed {% endif %}">
<h2 class="staff-info__title ui-staff__subtitle ui-toggle-visibility__control"> <h2 class="staff-info__title ui-staff__subtitle ui-toggle-visibility__control">
<i class="icon fa fa-caret-right"></i> <i class="icon fa fa-caret-right"></i>
<span>{% trans "Submit Assessment Grade Override" %}</span> <span>{% trans "Submit Assessment Grade Override" %}</span>
......
...@@ -214,13 +214,17 @@ class StaffAreaMixin(object): ...@@ -214,13 +214,17 @@ class StaffAreaMixin(object):
""" """
try: try:
student_username = data.params.get('student_username', '') student_username = data.params.get('student_username', '')
path, context = self.get_student_info_path_and_context(student_username) expanded_view = data.params.get('expanded_view', [])
path, context = self.get_student_info_path_and_context(
student_username,
expanded_view=expanded_view
)
return self.render_assessment(path, context) return self.render_assessment(path, context)
except PeerAssessmentInternalError: except PeerAssessmentInternalError:
return self.render_error(self._(u"Error finding assessment workflow cancellation.")) return self.render_error(self._(u"Error finding assessment workflow cancellation."))
def get_student_info_path_and_context(self, student_username): def get_student_info_path_and_context(self, student_username, expanded_view=None):
""" """
Get the proper path and context for rendering the student info Get the proper path and context for rendering the student info
section of the staff area. section of the staff area.
...@@ -295,6 +299,7 @@ class StaffAreaMixin(object): ...@@ -295,6 +299,7 @@ class StaffAreaMixin(object):
'example_based_assessment': example_based_assessment, 'example_based_assessment': example_based_assessment,
'rubric_criteria': copy.deepcopy(self.rubric_criteria_with_labels), 'rubric_criteria': copy.deepcopy(self.rubric_criteria_with_labels),
'student_username': student_username, 'student_username': student_username,
'expanded_view': expanded_view,
} }
if peer_assessments or self_assessment or example_based_assessment: if peer_assessments or self_assessment or example_based_assessment:
......
...@@ -41,9 +41,9 @@ describe("OpenAssessment.GradeView", function() { ...@@ -41,9 +41,9 @@ describe("OpenAssessment.GradeView", function() {
server = new StubServer(); server = new StubServer();
// Create and install the view // Create and install the view
var $grade = $('#openassessment__grade').first(); var gradeElement = $('#openassessment__grade').get(0);
var baseView = new OpenAssessment.BaseView(runtime, $grade, server, {}); var baseView = new OpenAssessment.BaseView(runtime, gradeElement, server, {});
view = new OpenAssessment.GradeView($grade, server, baseView); view = new OpenAssessment.GradeView(gradeElement, server, baseView);
view.installHandlers(); view.installHandlers();
}); });
......
...@@ -32,9 +32,9 @@ describe("OpenAssessment.PeerView", function() { ...@@ -32,9 +32,9 @@ describe("OpenAssessment.PeerView", function() {
var createPeerAssessmentView = function(template) { var createPeerAssessmentView = function(template) {
loadFixtures(template); loadFixtures(template);
var $assessment = $('#openassessment__peer-assessment').first(); var assessmentElement = $('#openassessment__peer-assessment').get(0);
var baseView = new OpenAssessment.BaseView(runtime, $assessment, server, {}); var baseView = new OpenAssessment.BaseView(runtime, assessmentElement, server, {});
var view = new OpenAssessment.PeerView($assessment, server, baseView); var view = new OpenAssessment.PeerView(assessmentElement, server, baseView);
view.installHandlers(); view.installHandlers();
return view; return view;
}; };
......
...@@ -119,9 +119,9 @@ describe("OpenAssessment.ResponseView", function() { ...@@ -119,9 +119,9 @@ describe("OpenAssessment.ResponseView", function() {
}; };
// Create and install the view // Create and install the view
var $response = $('#openassessment__response').first(); var responseElement = $('#openassessment__response').get(0);
var baseView = new OpenAssessment.BaseView(runtime, $response, server, {}); var baseView = new OpenAssessment.BaseView(runtime, responseElement, server, {});
view = new OpenAssessment.ResponseView($response, server, fileUploader, baseView, data); view = new OpenAssessment.ResponseView(responseElement, server, fileUploader, baseView, data);
view.installHandlers(); view.installHandlers();
// Stub the confirmation step // Stub the confirmation step
......
...@@ -37,9 +37,9 @@ describe("OpenAssessment.SelfView", function() { ...@@ -37,9 +37,9 @@ describe("OpenAssessment.SelfView", function() {
server.renderLatex = jasmine.createSpy('renderLatex'); server.renderLatex = jasmine.createSpy('renderLatex');
// Create the object under test // Create the object under test
var $assessment = $("#openassessment__self-assessment").first(); var assessmentElement = $("#openassessment__self-assessment").get(0);
var baseView = new OpenAssessment.BaseView(runtime, $assessment, server, {}); var baseView = new OpenAssessment.BaseView(runtime, assessmentElement, server, {});
view = new OpenAssessment.SelfView($assessment, server, baseView); view = new OpenAssessment.SelfView(assessmentElement, server, baseView);
view.installHandlers(); view.installHandlers();
}); });
......
...@@ -67,9 +67,9 @@ describe('OpenAssessment.StaffAreaView', function() { ...@@ -67,9 +67,9 @@ describe('OpenAssessment.StaffAreaView', function() {
if (serverResponse) { if (serverResponse) {
server.data = serverResponse; server.data = serverResponse;
} }
var $assessment = $('#openassessment').first(); var assessmentElement = $('#openassessment').get(0);
var baseView = new OpenAssessment.BaseView(runtime, $assessment, server, {}); var baseView = new OpenAssessment.BaseView(runtime, assessmentElement, server, {});
var view = new OpenAssessment.StaffAreaView($assessment, server, baseView); var view = new OpenAssessment.StaffAreaView(assessmentElement, server, baseView);
view.load(); view.load();
return view; return view;
}; };
......
...@@ -43,9 +43,9 @@ describe("OpenAssessment.StudentTrainingView", function() { ...@@ -43,9 +43,9 @@ describe("OpenAssessment.StudentTrainingView", function() {
server.renderLatex = jasmine.createSpy('renderLatex') server.renderLatex = jasmine.createSpy('renderLatex')
// Create the object under test // Create the object under test
var $training = $('#openassessment__student-training').first(); var trainingElement = $('#openassessment__student-training').get(0);
var baseView = new OpenAssessment.BaseView(runtime, $training, server, {}); var baseView = new OpenAssessment.BaseView(runtime, trainingElement, server, {});
view = new OpenAssessment.StudentTrainingView($training, server, baseView); view = new OpenAssessment.StudentTrainingView(trainingElement, server, baseView);
view.installHandlers(); view.installHandlers();
}); });
......
...@@ -47,8 +47,12 @@ ...@@ -47,8 +47,12 @@
* Upon request, loads the student info section of the staff area. * Upon request, loads the student info section of the staff area.
* This allows viewing all the submissions and assessments associated * This allows viewing all the submissions and assessments associated
* to the given student's current workflow. * to the given student's current workflow.
*
* @param options An optional set of options to render the section.
* @returns {promise} A promise representing the successful oading
* of the student info section.
*/ */
loadStudentInfo: function() { loadStudentInfo: function(options) {
var view = this; var view = this;
var $staffTools = $('.openassessment__staff-tools', this.element); var $staffTools = $('.openassessment__staff-tools', this.element);
var $form = $staffTools.find('.openassessment_student_info_form'); var $form = $staffTools.find('.openassessment_student_info_form');
...@@ -56,12 +60,13 @@ ...@@ -56,12 +60,13 @@
var showFormError = function(errorMessage) { var showFormError = function(errorMessage) {
$form.find('.form--error').text(errorMessage); $form.find('.form--error').text(errorMessage);
}; };
var deferred = $.Deferred();
// Clear any previous student information // Clear any previous student information
$('.openassessment__student-info', view.element).text(''); $('.openassessment__student-info', view.element).text('');
if (student_username.trim()) { if (student_username.trim()) {
this.server.studentInfo(student_username) this.server.studentInfo(student_username, options)
.done(function(html) { .done(function(html) {
// Clear any error message // Clear any error message
showFormError(''); showFormError('');
...@@ -99,13 +104,17 @@ ...@@ -99,13 +104,17 @@
} }
); );
} }
}).fail(function() { deferred.resolve();
})
.fail(function() {
showFormError(gettext('Unexpected server error.')); showFormError(gettext('Unexpected server error.'));
} deferred.reject();
); });
} else { } else {
showFormError(gettext('A learner name must be provided.')); showFormError(gettext('A learner name must be provided.'));
deferred.reject();
} }
return deferred.promise();
}, },
/** /**
...@@ -221,11 +230,14 @@ ...@@ -221,11 +230,14 @@
// Immediately disable the button to prevent multiple requests. // Immediately disable the button to prevent multiple requests.
this.cancelSubmissionEnabled(false); this.cancelSubmissionEnabled(false);
var view = this; var view = this;
var comments = this.element.find('.cancel_submission_comments').val(); var comments = $('.cancel_submission_comments', this.element).val();
this.server.cancelSubmission(submissionUUID, comments) this.server.cancelSubmission(submissionUUID, comments)
.done(function(msg) { .done(function(msg) {
$('.cancel-submission-error').html(''); $('.cancel-submission-error').html('');
$('.openassessment__staff-info__cancel__submission', view.element).html(msg); view.loadStudentInfo({expanded_view: 'final-grade'})
.done(function() {
$('.openassessment__staff-info__cancel__submission', view.element).html(msg);
});
}) })
.fail(function(errMsg) { .fail(function(errMsg) {
$('.cancel-submission-error').html(errMsg); $('.cancel-submission-error').html(errMsg);
...@@ -316,12 +328,9 @@ ...@@ -316,12 +328,9 @@
view.staffSubmitEnabled(false); view.staffSubmitEnabled(false);
this.server.staffAssess(rubric.optionsSelected(), rubric.criterionFeedback(), rubric.overallFeedback()) this.server.staffAssess(rubric.optionsSelected(), rubric.criterionFeedback(), rubric.overallFeedback())
.done( .done(function() {
function() { view.loadStudentInfo({expanded_view: 'staff-override'});
baseView.loadAssessmentModules(); })
baseView.scrollToTop();
}
)
.fail(function(errorMessage) { .fail(function(errorMessage) {
baseView.toggleActionError('staff', errorMessage); baseView.toggleActionError('staff', errorMessage);
view.staffSubmitEnabled(true); view.staffSubmitEnabled(true);
......
...@@ -100,14 +100,14 @@ if (typeof OpenAssessment.Server === "undefined" || !OpenAssessment.Server) { ...@@ -100,14 +100,14 @@ if (typeof OpenAssessment.Server === "undefined" || !OpenAssessment.Server) {
* @returns {promise} A JQuery promise, which resolves with the HTML of the rendered section * @returns {promise} A JQuery promise, which resolves with the HTML of the rendered section
* fails with an error message. * fails with an error message.
*/ */
studentInfo: function(student_username) { studentInfo: function(student_username, options) {
var url = this.url('render_student_info'); var url = this.url('render_student_info');
return $.Deferred(function(defer) { return $.Deferred(function(defer) {
$.ajax({ $.ajax({
url: url, url: url,
type: "POST", type: "POST",
dataType: "html", dataType: "html",
data: {student_username: student_username} data: _.extend({student_username: student_username}, options)
}) })
.done(function(data) { .done(function(data) {
defer.resolveWith(this, [data]); defer.resolveWith(this, [data]);
......
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