// ==UserScript== // @name Canvas quiz essay answer submission download for Turnitin plagiarism check // @author WenChen Hol // @namespace https://github.com/clearnz/canvas-report-tools/ // @description For Canvas users, this tool generates a zip file download of the all quiz essay answers, for Turnitin to check for plagiarism // @downloadURL https://github.com/clearnz/canvas-report-tools/raw/master/quiz-essay-answers.user.js // @include https://*/courses/*/quizzes/* // @require https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js // @require https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js // @require https://flexiblelearning.auckland.ac.nz/javascript/filesaver.js // @require https://flexiblelearning.auckland.ac.nz/javascript/jszip.min.js // @version 0.6 // @grant none // ==/UserScript== // based on code from James Jones' Canvancement https://github.com/jamesjonesmath/canvancement (function () { 'use strict'; var userData = { }; // questionsArray to store questions //var questionsArray = []; // answersArray to store answers of each questions //var answersArray = []; var pending = - 1; var fetched = 0; var needsFetched = 0; var reporttype; var ajaxPool; var courseId; var quizId; var today = new Date(); var dd = today.getDate(); var mm = today.getMonth() + 1; var yyyy = today.getFullYear(); var zip = new JSZip(); var debug = 0; var resultUrlArray = []; if (dd < 10) { dd = '0' + dd; } if (mm < 10) { mm = '0' + mm; } //courseId = getCourseId(); // quizId = getQuizId(); today = (yyyy-2000 ) + '-' + mm + '-' + dd + '-' + Math.floor(Date.now() /1000) ; var aborted = false; addQuizEssayAnswersButton(); var ansId = 0; function addQuizEssayAnswersButton() { if ($('#quiz-answers-report').length === 0) { $('.page-action-list').append('
" );
pending++;
$.getJSON(url, function (udata, status, jqXHR) {
url = nextURL(jqXHR.getResponseHeader('Link'));
for (var i = 0; i < udata.length; i++) {
var section = udata[i];
//return if no students
if ( i==0 && section.students===null ){
pending--;
continue;
/*alert( "No student found" );
$('#jj_progress_dialog').dialog('close');
$('#quiz-essay-answers-report').one('click', {
type: 2
}, quizEssayAnswersReport);
resetData();
throw new Error('Failed to load list of students');*/
}
try {
if (section.students.length > 0) {
for (var j = 0; j < section.students.length; j++) {
// login_id === upi
var user = section.students[j];
var splitname = user.sortable_name.split(',');
user.firstname = splitname[1].trim();
user.surname = splitname[0].trim();
userData[user.id] = user;
} // end for
} // end if length>0
} catch(e){ continue; }
}
if (url) {
getStudents( url, courseId, quizId );
}
pending--;
if (pending <= 0) {
let urlAns = '/api/v1/courses/' + courseId + '/quizzes/'+ quizId + '/submissions?include[]=submission&per_page=50';
getAnswers( urlAns, courseId, quizId );
}
}).fail(function () {
pending--;
$('#jj_progress_dialog').dialog('close');
throw new Error('Failed to load list of students');
});
} catch (e) {
errorHandler(e);
$('#jj_progress_dialog').dialog('close');
}
}
function getAnswers( url, courseId, quizId ) { //cycles through the student list
let quiz_submissions = [];
let tmpName = "";
try {
if (aborted) {
throw new Error('Aborted');
}
if (debug) console.log( "student Data:", userData );
if (debug) console.log( "getting answers:", url );
jQuery("#doing").html( "Fetching question answers
" );
pending++;
$.getJSON(url, function (udata, status, jqXHR) {
url = nextURL(jqXHR.getResponseHeader('Link'));
quiz_submissions = udata.quiz_submissions;
if (debug) console.log( "quiz_submissions:", quiz_submissions );
if ( quiz_submissions.length==0 || quiz_submissions===null ){
pending--;
alert( "No submission found" );
$('#jj_progress_dialog').dialog('close');
$('#quiz-essay-answers-report').one('click', {
type: 2
}, quizEssayAnswersReport);
resetData();
throw new Error('Failed to load list of students');
}
needsFetched = quiz_submissions.length;
for (var i = 0; i < quiz_submissions.length; i++) {
var submission = quiz_submissions[i];
let studentid = submission.user_id;
progressbar(i, quiz_submissions.length);
if (debug) console.log( submission, studentid );
try {
tmpName = userData[ studentid ].short_name.replace(/ /g, "");
} catch(e){
tmpName = "";
continue;
}
if (debug) console.log( "submission:", submission );
if (debug) console.log( "tmpName:", tmpName );
try {
if ( "result_url" in submission && submission.result_url!="" ) {
resultUrlArray.push( [ submission.result_url, tmpName+"-"+studentid ] );
} else if ( "html_url" in submission && submission.html_url!="" ) {
resultUrlArray.push( [submission.html_url, tmpName+"-"+studentid] );
}
} catch(e){ continue; }
}
if (url) {
getAnswers( url, courseId, quizId );
}
pending--;
if (pending <= 0) {
if (debug) console.log( "resultUrlArray", resultUrlArray );
getQuizAnswerReport( courseId, quizId );
}
}).fail(function () {
pending--;
throw new Error('Failed to load student submissions');
});
} catch (e) {
errorHandler(e);
}
}
function getQuizAnswerReport( courseId, quizId ) { //cycles through student list
pending = 0;
fetched = 0;
let url = "";
let tmpName= '';
getQuizAns();
//for (var i=0; i