176 lines
6.4 KiB
JavaScript
176 lines
6.4 KiB
JavaScript
/* globals _ */
|
|
// Build StaffDebug object
|
|
var StaffDebug = (function() {
|
|
/* global getCurrentUrl:true */
|
|
var getURL = function(action) {
|
|
var pathname = this.getCurrentUrl();
|
|
return pathname.substr(0, pathname.indexOf('/courseware')) + '/instructor/api/' + action;
|
|
};
|
|
|
|
var sanitizeString = function(string) {
|
|
return string.replace(/[.*+?^:${}()|[\]\\]/g, '\\$&');
|
|
};
|
|
|
|
var getUser = function(locationName) {
|
|
var sanitizedLocationName = sanitizeString(locationName);
|
|
var uname = $('#sd_fu_' + sanitizedLocationName).val();
|
|
if (uname === '') {
|
|
uname = $('#sd_fu_' + sanitizedLocationName).attr('placeholder');
|
|
}
|
|
return uname;
|
|
};
|
|
|
|
var getScore = function(locationName) {
|
|
var sanitizedLocationName = sanitizeString(locationName);
|
|
var score = $('#sd_fs_' + sanitizedLocationName).val();
|
|
if (score === '') {
|
|
score = $('#sd_fs_' + sanitizedLocationName).attr('placeholder');
|
|
}
|
|
return score;
|
|
};
|
|
|
|
var doInstructorDashAction = function(action) {
|
|
var pdata = {
|
|
problem_to_reset: action.location,
|
|
unique_student_identifier: getUser(action.locationName),
|
|
delete_module: action.delete_module,
|
|
only_if_higher: action.only_if_higher,
|
|
score: action.score
|
|
};
|
|
$.ajax({
|
|
type: 'POST',
|
|
url: getURL(action.method),
|
|
data: pdata,
|
|
success: function(data) {
|
|
var text = _.template(action.success_msg, {interpolate: /\{(.+?)\}/g})(
|
|
{user: data.student}
|
|
);
|
|
var html = _.template('<p id="idash_msg" class="success">{text}</p>', {interpolate: /\{(.+?)\}/g})(
|
|
{text: text}
|
|
);
|
|
$('#result_' + sanitizeString(action.locationName)).html(html);
|
|
},
|
|
error: function(request, status, error) {
|
|
var responseJSON;
|
|
try {
|
|
responseJSON = $.parseJSON(request.responseText);
|
|
} catch (e) {
|
|
responseJSON = 'Unknown Error Occurred.';
|
|
}
|
|
var text = _.template('{error_msg} {error}', {interpolate: /\{(.+?)\}/g})(
|
|
{
|
|
error_msg: action.error_msg,
|
|
error: gettext(responseJSON)
|
|
}
|
|
);
|
|
var html = _.template('<p id="idash_msg" class="error">{text}</p>', {interpolate: /\{(.+?)\}/g})(
|
|
{text: text}
|
|
);
|
|
$('#result_' + sanitizeString(action.locationName)).html(html);
|
|
},
|
|
dataType: 'json'
|
|
});
|
|
};
|
|
|
|
var reset = function(locname, location) {
|
|
this.doInstructorDashAction({
|
|
locationName: locname,
|
|
location: location,
|
|
method: 'reset_student_attempts',
|
|
success_msg: gettext('Successfully reset the attempts for user {user}'),
|
|
error_msg: gettext('Failed to reset attempts for user.'),
|
|
delete_module: false
|
|
});
|
|
};
|
|
|
|
var deleteStudentState = function(locname, location) {
|
|
this.doInstructorDashAction({
|
|
locationName: locname,
|
|
location: location,
|
|
method: 'reset_student_attempts',
|
|
success_msg: gettext('Successfully deleted student state for user {user}'),
|
|
error_msg: gettext('Failed to delete student state for user.'),
|
|
delete_module: true
|
|
});
|
|
};
|
|
|
|
var rescore = function(locname, location) {
|
|
this.doInstructorDashAction({
|
|
locationName: locname,
|
|
location: location,
|
|
method: 'rescore_problem',
|
|
success_msg: gettext('Successfully rescored problem for user {user}'),
|
|
error_msg: gettext('Failed to rescore problem for user.'),
|
|
only_if_higher: false
|
|
});
|
|
};
|
|
|
|
var rescoreIfHigher = function(locname, location) {
|
|
this.doInstructorDashAction({
|
|
locationName: locname,
|
|
location: location,
|
|
method: 'rescore_problem',
|
|
success_msg: gettext('Successfully rescored problem to improve score for user {user}'),
|
|
error_msg: gettext('Failed to rescore problem to improve score for user.'),
|
|
only_if_higher: true
|
|
});
|
|
};
|
|
|
|
var overrideScore = function(locname, location) {
|
|
this.doInstructorDashAction({
|
|
locationName: locname,
|
|
location: location,
|
|
method: 'override_problem_score',
|
|
success_msg: gettext('Successfully overrode problem score for {user}'),
|
|
error_msg: gettext('Could not override problem score for {user}.'),
|
|
score: getScore(locname)
|
|
});
|
|
};
|
|
|
|
getCurrentUrl = function() {
|
|
return window.location.pathname;
|
|
};
|
|
|
|
return {
|
|
reset: reset,
|
|
deleteStudentState: deleteStudentState,
|
|
rescore: rescore,
|
|
rescoreIfHigher: rescoreIfHigher,
|
|
overrideScore: overrideScore,
|
|
|
|
// export for testing
|
|
doInstructorDashAction: doInstructorDashAction,
|
|
getCurrentUrl: getCurrentUrl,
|
|
getURL: getURL,
|
|
getUser: getUser,
|
|
getScore: getScore,
|
|
sanitizeString: sanitizeString
|
|
};
|
|
}());
|
|
|
|
// Register click handlers
|
|
$(document).ready(function() {
|
|
var $courseContent = $('.course-content');
|
|
$courseContent.on('click', '.staff-debug-reset', function() {
|
|
StaffDebug.reset($(this).parent().data('location-name'), $(this).parent().data('location'));
|
|
return false;
|
|
});
|
|
$courseContent.on('click', '.staff-debug-sdelete', function() {
|
|
StaffDebug.deleteStudentState($(this).parent().data('location-name'), $(this).parent().data('location'));
|
|
return false;
|
|
});
|
|
$courseContent.on('click', '.staff-debug-rescore', function() {
|
|
StaffDebug.rescore($(this).parent().data('location-name'), $(this).parent().data('location'));
|
|
return false;
|
|
});
|
|
$courseContent.on('click', '.staff-debug-rescore-if-higher', function() {
|
|
StaffDebug.rescoreIfHigher($(this).parent().data('location-name'), $(this).parent().data('location'));
|
|
return false;
|
|
});
|
|
|
|
$courseContent.on('click', '.staff-debug-override-score', function() {
|
|
StaffDebug.overrideScore($(this).parent().data('location-name'), $(this).parent().data('location'));
|
|
return false;
|
|
});
|
|
});
|