quizzer
Version:
Quizzer is a webserver for collaborative writing lab support. Based on a _fail early, fail often? approach to written language, the tool is particularly suited to second-language learners. The workflow (essay - error - quiz - exam) treats mistakes as an o
46 lines (44 loc) • 2.08 kB
JavaScript
(function () {
var cogClass = function () {};
cogClass.prototype.exec = function (params, request, response) {
var oops = this.utils.apiError;
var classID = params.classid;
var db = this.sys.db;
var sql = 'SELECT quizNumber,examName,CASE WHEN sent IS NULL OR sent=0 THEN -1 ELSE COUNT(pending) END AS pending '
+ 'FROM quizzes '
+ 'LEFT JOIN ('
+ 'SELECT quizNumber AS pending '
+ 'FROM memberships '
+ 'JOIN students USING(studentID) '
+ 'JOIN classes USING(classID) '
+ 'JOIN quizzes ON quizzes.classID=classes.classID '
+ 'JOIN questions ON questions.quizID=quizzes.quizID '
+ 'LEFT JOIN answers ON answers.questionID=questions.questionID AND answers.studentID=memberships.studentID '
+ 'WHERE memberships.classID=? AND answers.questionID IS NULL AND (privacy IS NULL OR privacy=0) '
+ 'GROUP BY memberships.classID,quizNumber,memberships.studentID'
+ ') AS res ON res.pending=quizNumber '
+ 'WHERE classID=? '
+ "GROUP BY classID,quizNumber "
+ "ORDER BY quizNumber;"
db.all(sql,[classID,classID],function(err,rows){
if (err||!rows) {return oops(response,err,'class/readquizzes')};
var retRows = [];
var hasNew = false;
var maxval = 0;
for (var i=0,ilen=rows.length;i<ilen;i+=1) {
var row = rows[i];
if (row.pending == -1) {
hasNew = true;
}
retRows.push({name:row.examName,number:row.quizNumber,isnew:row.pending});
maxval = row.quizNumber;
}
if (rows.length && !hasNew) {
retRows.push({number:maxval+1,isnew:-1});
}
response.writeHead(200, {'Content-Type': 'application/json'});
response.end(JSON.stringify(retRows));
});
}
exports.cogClass = cogClass;
})();