Examiners have access to most procedures from the Exam Management and Grades section.
Parameter: Exam Identifier
The examiner right grants access to the complete exam tree with the corresponding id, from the Exam Management and Grades section. Nothing else really has to be bound to this role.
changeAttributes(ident uid, ident id, string title, string date, string time, string location) { assume exists /account[uid]/admin || exists /account[uid]/examiner[id]; assume exists /exam[id]; # implicitly true in OO implementations update /exam[id]/title title; update /exam[id]/date date; update /exam[id]/time time; update /exam[id]/location location; }
createTask(ident uid, ident id, ident taskId, double maxPoints) { assume exists /account[uid]/examiner[id]; assume exists /exam[id]; # implicitly true in OO implementations assume not exists /exam[id]/task[taskId]; assume maxPoints >= 0; insert /exam[id] <task id=[taskId] maxPoints=[maxPoints] />; }
createGrade(ident uid, ident id, ident gradeId, string name, double value, double minPoints) { assume exists /account[uid]/examiner[id]; assume exists /exam[id]; # implicitly true in OO implementations assume not exists /exam[id]/grade[gradeId]; assume count(value, /exam[id]/grade/value) = 0; assume count(minPoints, /exam[id]/grade/minPoints) = 0; assume exists /exam[id]/grade[x] && /exam[id]/grade[x]/value < value -> /exam[id]/grade[x]/minPoints > minPoints; assume exists /exam[id]/grade[x] && value < /exam[id]/grade[x]/value -> minPoints > /exam[id]/grade[x]/minPoints; insert /exam[id] <grade id=[gradeId] name=[name] value=[value] minPoints=[minPoints] />; }
changeAttributes(ident uid, ident id, ident taskId, double maxPoints) { assume exists /account[uid]/examiner[id]; assume exists /exam[id]/task[taskId]; # implies the existence of the exam assume maxPoints >= 0; assume /exam[id]/participant[x]/result[taskId]/points <= maxPoints; update /exam[id]/task[taskId]/maxPoints maxPoints; }
deleteTask(ident uid, ident id, ident taskId) { assume exists /account[uid]/examiner[id]; assume exists /exam[id]/task[taskId]; # implies the exam exists, which is implicitly true anyway assume size(/exam[id]/participant/result[taskId]) = 0; remove /exam[id]/task[taskId]; }
deleteGrade(ident uid, ident id, ident gradeId) { assume exists /account[uid]/examiner[id]; assume exists /exam[id]/grade[gradeId]; # implies the exam exists, which is implicitly true anyway remove /exam[id]/grade[gradeId]; }
openRegistration(ident uid, ident id) { assume exists /account[uid]/examiner[id]; assume exists /exam[id]; assume not /exam[id]/free; update /exam[id]/free true; }
closeRegistration(ident uid, ident id) { assume exists /account[uid]/examiner[id]; assume exists /exam[id]; assume /exam[id]/free; update /exam[id]/free false; }
addParticipant(ident uid, ident id, ident studentId) { assume exists /account[uid]/student && /account[uid]/student/id = studentId && /exam[id]/free || exists /account[uid]/examiner[id]; assume exists /exam[id]; # implicitly true in OO implementations assume count (studentId, /account/student/id) = 1; assume not exists /exam[id]/participant[studentId]; insert /exam[id]/participant[studentId]; }
removeParticipant(ident uid, ident id, ident studentId) { assume exists /account[uid]/student && /account[uid]/student/id = studentId && /exam[id]/free || exists /account[uid]/examiner[id]; assume exists /exam[id]/participant[studentId]; # implies the exam exists, which is implicitly true anyway assume size(/exam[id]/participant[studentId]/result) = 0; # don't allow to remove if results are there remove /exam[id]/participant[studentId]; }
addResult(ident uid, ident id, ident studentId, ident taskId, double points) { assume exists /account[uid]/examiner[id]; assume exists /exam[id]/participant[studentId]; # can also be implicitly true in an OO language assume exists /exam[id]/task[taskId]; assume not exists /exam[id]/participant[studentId]/result[taskId]; assume points >= 0 && points <= /exam[id]/task[taskId]/maxPoints; insert /exam[id]/participant[studentId] <result task=[taskId] points=[points] />; }
changeResult(ident uid, ident id, ident studentId, ident taskId, double points) { assume exists /account[uid]/examiner[id]; assume exists /exam[id]/participant[studentId]; assume exists /exam[id]/task[taskId]; assume points >= 0 && points <= /exam[id]/task[taskId]/maxPoints; assume exists /exam[id]/participant[studentId]/result[taskId]; update /exam[id]/participant[studentId]/result[taskId]/points points; }
removeResult(ident uid, ident id, ident studentId, ident taskId) { assume exists /account[uid]/examiner[id]; assume exists /exam[id]/participant[studentId]/result[taskId]; # implies the exam, account, student role and task exist by integrity remove /exam[id]/participant[studentId]/result[taskId]; }
publishResults(ident uid, ident id) { assume exists /account[uid]/examiner[id]; assume exists /exam[id]; assume not /exam[id]/published; update /exam[id]/published true; }
hideResults(ident uid, ident id) { assume exists /account[uid]/examiner[id]; assume exists /exam[id]; assume /exam[id]/published; update /exam[id]/published false; }