This is an old revision of the document!
Administrators mostly have access to the procedures at the top level, i.e. The Whole Stat System, and those in the section User Accounts and Roles.
To be able to list this procedure somewhere, it is listed here. However, it is not actually a procedure which you would call for an existing system, obviously.
createEmptyStats() { remove /stats; # procedures only operate on valid documents, so we have to get rid of "whatever was there" before insert / <stats revision="0"> <account username="admin" lastName="admin" firstName="admin" email="admin@stats.system" password="some hash of 'admin'"> <admin /> </account> </stats>; }
createExercise(ident uid, ident id, string lecture, string term) { assume exists /account[uid]/admin; assume not exists /exercise[id]; insert / <exercise id=[id] lecture=[lecture] term=[term] open=[false] /> }
createExam(ident uid, ident id, ident eid, string title, string date, string time, string location) { assume exists /account[uid]/admin; assume not exists /exam[id]; assume exists /exercise[eid]; insert / <exam id=[id] title=[title] date=[date] time=[time] location=[location] free=[false] published=[false] exercise=[eid] /> }
changeAttributes(ident uid, ident id, string lecture, string term) { assume exists /account[uid]/admin || exists /account[uid]/assistant[id]; assume exists /exercise[id]; # implicitly true in OO implementations update /exercise[id]/lecture lecture; update /exercise[id]/term term; }
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; }
deleteExercise(ident uid, ident id) { assume exists /account[uid]/admin; assume exists /exercise[id]; assume size(/exercise[id]/assistant) = 0; assume size(/exercise[id]/group/tutor) = 0; assume size(/exercise[id]/student) = 0; # don't allow to delete if students are there remove /exercise[id]; }
deleteExam(ident uid, ident id) { assume exists /account[uid]/admin; assume exists /exam[id]; assume size(/exam[id]/examiner) = 0; assume size(/exam[id]/participant) = 0; # don't allow to delete if participants are there remove /exam[id]; }
grantAdminRights(ident uid, ident username) { assume exists /account[uid]/admin; assume exists /account[username]; # implicitly true in OO implementations assume not exists /account[username]/admin; insert /account[username] <admin />; }
grantAssistantRights(ident uid, ident username, ident exerciseId) { assume exists /account[uid]/admin; assume exists /account[username]; # implicitly true in OO implementations assume exists /exercise[exerciseId]; assume not exists /account[username]/assistant[exerciseId]); assume not exists /exercise[exerciseId]/assistant[username]; # implied by integrity and the assumption before insert /account[username] <assistant exercise=[exerciseId] />; insert /exercise[exerciseId] <assistant account=[username] />; }
grantExaminerRights(ident uid, ident username, ident examId) { assume exists /account[uid]/admin; assume exists /account[username]; # implicitly true in OO implementations assume exists /exam[examId]; assume not exists /account[username]/examiner[examId]); assume not exists /exam[examId]/examiner[username]); # implied by integrity and the assumption before insert /account[username] <examiner exam=[examId] />; insert /exam[examId] <examiner account=[username] />; }
revokeAdminRights(ident uid, ident username) { assume exists /account[uid]/admin; assume exists /account[username]/admin; # implies the account exists, which is implicitly true anyway assume size(/account/admin) > 1; # kind of a practical constraint remove /account[username]/admin; }
revokeAssistantRights(ident uid, ident username, ident exerciseId) { assume exists /account[uid]/admin; assume exists /account[username]/assistant[exerciseId]; # implies the account exists, which is implicitly true anyway assume exists /exercise[exerciseId]/assistant[username]; # implied by integrity and the assumption before remove /account[username]/assistant[exerciseId]; remove /exercise[exerciseId]/assistant[username]; }