This is an old revision of the document!
This page describes a minor part of the STAT System XCend Schema, namely the students who signed up for an exercise. It is therefore a part of Exercise Management and Sheets.
element students {
element student * id { [ exists //accounts/account/student[./id] ] # 1.6, 2.11
attribute group ? { ident [ exists ..exercise/groups/group[.] ]} # 1.7
attribute team ? { ident [ exists ../group ]}
element result * sheet { [ exists ..exercise/sheets/sheet[./sheet] ] # 1.8, 2.12
attribute points { double [ . >= 0 && . <= ..exercise/sheets/sheet[../sheet]/maxPoints ]} # 3.3
}
}
}
Before a student can sign up for a group, he has to register for the exercise in general. (Which is not a student method in the current implementation.)
registerStudent(ident uid, ident id, ident studentId) {
assume count (studentId, /account/student/id) = 1;
assume exists /exercise[id] && /exercise[id]/open &&
exists /account[uid]/student && /account[uid]/student/id = studentId
|| exists /account[uid]/assistant[id];
assume exists /exercise[id];
assume not exists /exercise[id]/student[studentId];
insert /exercise[id] <student id=[studentId] />;
}
unregisterStudent(ident uid, ident id, ident studentId) {
assume exists /exercise[id] && /exercise[id]/open &&
exists /account[uid]/student && /account[uid]/student/id = studentId
|| exists /account[uid]/assistant[id];
assume exists /exercise[id]/student[studentId]; # implies the exercise exists
assume size(/exercise[id]/student[studentId]/result) = 0; # don't allow unregistering if results are there
assume not exists /exercise[id]/student[studentId]/group; # don't allow if signed in a group
remove /exercise[id]/student[studentId];
}
One of the main things a student can do by himself, signing into and out of groups.
signUpGroup(ident uid, ident id, ident studentId, ident groupId) {
assume exists /exercise[id] && /exercise[id]/open &&
exists /account[uid]/student && /account[uid]/student/id = studentId
|| exists /account[uid]/assistant[id];
assume exists /exercise[id]/student[studentId]; # implies the existence of the exercise
assume exists /exercise[id]/group[groupId]; # also implies it, but once is really enough
assume not exists /exercise[id]/student[studentId]/group;
assume /exercise[id]/group[groupId]/curSize < /exercise[id]/group[groupId]/maxSize;
insert /exercise[id]/student[studentId]/group groupId;
update /exercise[id]/group[groupId]/curSize (/exercise[id]/group[groupId]/curSize + 1);
}
signOutGroup(ident uid, ident id, ident studentId) {
assume exists /exercise[id] && /exercise[id]/open &&
exists /account[uid]/student && /account[uid]/student/id = studentId
|| exists /account[uid]/assistant[id];
assume exists /exercise[id]/student[studentId]/group;
# implies existence of the exercise and student, even the group
update /exercise[id]/group[/exercise[id]/student[studentId]/group]/curSize
(/exercise[id]/group[/exercise[id]/student[studentId]/group]/curSize - 1)
remove /exercise[id]/student[studentId]/group;
}
The tutors assign teams to the students of their groups.
assignTeam(ident uid, ident id, ident studentId, ident teamId) {
assume exists /account[uid]/tutor[id]/group[/exercise[id]/student[studentId]/group];
# implies the existence of the student, the exercise, the group and enough rights by a tutor account
assume not exists /exercise[id]/student[studentId]/team;
insert /exercise[id]/student[studentId]/team teamId;
}
leaveTeam(ident uid, ident id, ident studentId) {
assume exists /account[uid]/tutor[id]/group[/exercise[id]/student[studentId]/group];
# implies the existence of the student, the exercise, the group and enough rights by a tutor account
assume exists /exercise[id]/student[studentId]/team;
remove /exercise[id]/student[studentId]/team;
}
addResult(ident uid, ident id, ident studentId, ident sheetId, double points) {
assume exists /account[uid]/assistant[id]
|| exists /account[uid]/tutor[id]/group[/exercise[id]/student[studentId]/group];
assume exists /exercise[id]/student[studentId]; # implies the existence of the exercise
assume exists /exercise[id]/sheet[sheetId]; # dito
assume not exists /exercise[id]/student[studentId]/result[sheetId];
assume points >= 0 && points <= /exercise[id]/sheet[sheetId]/maxPoints;
insert /exercise[id]/student[studentId] <result sheet=[sheetId] points=[points] />;
}
changeResult(ident uid, ident id, ident studentId, ident sheetId, double points) {
assume exists /account[uid]/assistant[id]
|| exists /account[uid]/tutor[id]/group[/exercise[id]/student[studentId]/group];
assume exists /exercise[id]/student[studentId]; # implies the existence of the exercise
assume exists /exercise[id]/sheet[sheetId]; # dito
assume points >= 0 && points <= /exercise[id]/sheet[sheetId]/maxPoints;
assume exists /exercise[id]/student[studentId]/result[sheetId];
update /exercise[id]/student[studentId]/result[sheetId]/points points;
}
removeResult(ident uid, ident id, ident studentId, ident sheetId) {
assume exists /account[uid]/assistant[id]
|| exists /account[uid]/tutor[id]/group[/exercise[id]/student[studentId]/group];
assume exists /exercise[id]/student[studentId]/result[sheetId]; # implies the existence of pretty much everything
remove /exercise[id]/student[studentId]/result[sheetId];
}