<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.8" -->
<?xml-stylesheet href="https://xcend.de/lib/exe/css.php?s=feed" type="text/css"?>
<rss version="2.0">
    <channel xmlns:g="http://base.google.com/ns/1.0">
        <title>Transcend stats:proc</title>
        <description></description>
        <link>https://xcend.de/</link>
        <lastBuildDate>Thu, 16 Apr 2026 16:16:08 +0000</lastBuildDate>
        <generator>FeedCreator 1.8</generator>
        <image>
            <url>https://xcend.de/lib/tpl/dokuwiki/images/favicon.ico</url>
            <title>Transcend</title>
            <link>https://xcend.de/</link>
        </image>
        <item>
            <title>Add Participant</title>
            <link>https://xcend.de/stats/proc/addparticipant</link>
            <description>Add Participant


addParticipant(ident uid, ident id, ident studentId) {
  assume exists /account[uid]/student &amp;&amp; /account[uid]/student/id = studentId &amp;&amp; /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];
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:34:41 +0000</pubDate>
        </item>
        <item>
            <title>Add Result (Sheet)</title>
            <link>https://xcend.de/stats/proc/addresult_sheet</link>
            <description>Add Result (Sheet)


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 &gt;= 0 &amp;&amp; points &lt;= /exercise[id]…</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:34:55 +0000</pubDate>
        </item>
        <item>
            <title>Add Result (Task)</title>
            <link>https://xcend.de/stats/proc/addresult_task</link>
            <description>Add Result (Task)


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 &gt;= 0 &amp;&amp; points &lt;= /exam[id]/task[taskId]/maxPoints;

  insert /exam[id]/participant[studentId] &lt;result task=[taskId] points=[poin…</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:34:41 +0000</pubDate>
        </item>
        <item>
            <title>Add Student ID</title>
            <link>https://xcend.de/stats/proc/addstudentid</link>
            <description>Add Student ID


addStudentId(ident uid, ident username, ident id) {
  assume exists /account[uid]/admin;

  assume exists /account[username]; # implicitly true in OO implementations
  assume not exists /account[username]/student;
  assume count(id, /account/student/id) = 0;
 
  insert /account[username] &lt;student id=[id] /&gt;;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:32:41 +0000</pubDate>
        </item>
        <item>
            <title>Assign Team</title>
            <link>https://xcend.de/stats/proc/assignteam</link>
            <description>Assign Team


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;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:34:55 +0000</pubDate>
        </item>
        <item>
            <title>Authenticate</title>
            <link>https://xcend.de/stats/proc/authenticate</link>
            <description>Authenticate


authenticate(ident username, string password) {
  assume exists /account[username];
  
  assume /account[username]/password = password;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:32:42 +0000</pubDate>
        </item>
        <item>
            <title>Change Attributes (Account)</title>
            <link>https://xcend.de/stats/proc/changeattributes_account</link>
            <description>Change Attributes (Account)


# the current implementation also changes the username, i.e. it would need an additional parameter,
# I can't support it and I would forbid it anyway.
changeAttributes(ident uid, ident username, string firstName, string lastName) {
  assume exists /account[uid]/admin || uid = username;

  assume exists /account[username]; # implicitly true in OO implementations
 
  update /account[username]/firstName firstName;
  update /account[username]/lastName lastName;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:32:42 +0000</pubDate>
        </item>
        <item>
            <title>Change Attributes (Exam)</title>
            <link>https://xcend.de/stats/proc/changeattributes_exam</link>
            <description>Change Attributes (Exam)


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;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:32:42 +0000</pubDate>
        </item>
        <item>
            <title>Change Attributes (Exercise)</title>
            <link>https://xcend.de/stats/proc/changeattributes_exercise</link>
            <description>Change Attributes (Exercise)


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;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:32:42 +0000</pubDate>
        </item>
        <item>
            <title>Change Attributes (Group)</title>
            <link>https://xcend.de/stats/proc/changeattributes_group</link>
            <description>Change Attributes (Group)


changeAttributes(ident uid, ident id, ident groupId, string day, string time, string location, integer maxSize) {
  assume exists /account[uid]/assistant[id];
  
  assume exists /exercise[id]/group[groupId]; # implicitly true in OO implementations
 
  assume maxSize &gt;= 0;
  assume /exercise[id]/group[groupId]/curSize &lt;= maxSize;

  update /exercise[id]/group[groupId]/day day;
  update /exercise[id]/group[groupId]/time time;
  update /exercise[id]/group[groupId]/locati…</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:33:47 +0000</pubDate>
        </item>
        <item>
            <title>Change Attributes (Sheet)</title>
            <link>https://xcend.de/stats/proc/changeattributes_sheet</link>
            <description>Change Attributes (Sheet)


changeAttributes(ident uid, ident id, ident sheetId, double maxPoints) {
  assume exists /account[uid]/assistant[id];
  
  assume exists /exercise[id]/sheet[sheetId]; # implies the existence of the exercise
  
  assume maxPoints &gt;= 0;
  assume /exercise[id]/student[x]/result[sheetId]/points &lt;= maxPoints;
  
  update /exercise[id]/sheet[sheetId]/maxPoints maxPoints;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:34:55 +0000</pubDate>
        </item>
        <item>
            <title>Change Attributes (Task)</title>
            <link>https://xcend.de/stats/proc/changeattributes_task</link>
            <description>Change Attributes (Task)


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 &gt;= 0;
  assume /exam[id]/participant[x]/result[taskId]/points &lt;= maxPoints;
  
  update /exam[id]/task[taskId]/maxPoints maxPoints;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:34:41 +0000</pubDate>
        </item>
        <item>
            <title>Change Password</title>
            <link>https://xcend.de/stats/proc/changepassword</link>
            <description>Change Password


changePassword(ident uid, ident username, string password) {
  assume exists /account[uid]/admin || uid = username;

  assume exists /account[username]; # implicitly true in OO implementations
 
  update /account[username]/password password;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:32:42 +0000</pubDate>
        </item>
        <item>
            <title>Change Result (Sheet)</title>
            <link>https://xcend.de/stats/proc/changeresult_sheet</link>
            <description>Change Result (Sheet)


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 &gt;= 0 &amp;&amp; points &lt;= /exercise[id]/sheet[sheetId]/maxPoints;

  assume exists /exercise[id]/student[st…</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:34:55 +0000</pubDate>
        </item>
        <item>
            <title>Change Result (Task)</title>
            <link>https://xcend.de/stats/proc/changeresult_task</link>
            <description>Change Result (Task)


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 &gt;= 0 &amp;&amp; points &lt;= /exam[id]/task[taskId]/maxPoints;

  assume exists /exam[id]/participant[studentId]/result[taskId];
 
  update /exam[id]/participant[studentId]/result[taskId]/points points;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:34:41 +0000</pubDate>
        </item>
        <item>
            <title>Close Registration</title>
            <link>https://xcend.de/stats/proc/closeregistration</link>
            <description>Close Registration


closeRegistration(ident uid, ident id) {
  assume exists /account[uid]/examiner[id];
  
  assume exists /exam[id];
  
  assume /exam[id]/free;
  
  update /exam[id]/free false;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:32:42 +0000</pubDate>
        </item>
        <item>
            <title>Close Sign-Up</title>
            <link>https://xcend.de/stats/proc/closesignup</link>
            <description>Close Sign-Up


closeSignUp(ident uid, ident id) {
  assume exists /account[uid]/assistant[id];
  
  assume exists /exercise[id];
  
  assume /exercise[id]/open;
  
  update /exercise[id]/open false;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:32:42 +0000</pubDate>
        </item>
        <item>
            <title>Create Account</title>
            <link>https://xcend.de/stats/proc/createaccount</link>
            <description>Create Account


# This doesn't take account validation into consideration at all. It probably has to be allowed to replace an unvalidated account.
createAccount(ident uid, ident username, string lastName, string firstName, string email, string password) {
  assume exists /account[uid]/admin;

  assume not exists /account[username];
  
  insert / &lt;account username=[username] lastName=[lastName] firstName=[firstName] email=[email] password=[password] /&gt;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:40:41 +0000</pubDate>
        </item>
        <item>
            <title>Create Empty Stat System</title>
            <link>https://xcend.de/stats/proc/createemptystats</link>
            <description>Create Empty Stat System


createEmptyStats() {
  remove /stats; # procedures only operate on valid documents, so we have to get rid of &quot;whatever was there&quot; before
  insert / 
    &lt;stats revision=&quot;0&quot;&gt;
      &lt;account username=&quot;admin&quot; lastName=&quot;admin&quot; firstName=&quot;admin&quot; email=&quot;admin@stats.system&quot; password=&quot;some hash of 'admin'&quot;&gt;
        &lt;admin /&gt;
      &lt;/account&gt;
    &lt;/stats&gt;;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:39:12 +0000</pubDate>
        </item>
        <item>
            <title>Create Exam</title>
            <link>https://xcend.de/stats/proc/createexam</link>
            <description>Create Exam


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 /
    &lt;exam id=[id] title=[title] date=[date] time=[time] location=[location] free=[false] published=[false] exercise=[eid] /&gt;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:42:49 +0000</pubDate>
        </item>
        <item>
            <title>Create Exercise</title>
            <link>https://xcend.de/stats/proc/createexercise</link>
            <description>Create Exercise


createExercise(ident uid, ident id, string lecture, string term) {
  assume exists /account[uid]/admin;

  assume not exists /exercise[id];
  
  insert / &lt;exercise id=[id] lecture=[lecture] term=[term] open=[false] /&gt;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:41:41 +0000</pubDate>
        </item>
        <item>
            <title>Create Grade</title>
            <link>https://xcend.de/stats/proc/creategrade</link>
            <description>Create Grade


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] &amp;&amp; /exam[id]/grade[x]/value &lt; value -&gt; /exam[id]/grade[x]/minPoints &gt; minPoints;
  as…</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:43:13 +0000</pubDate>
        </item>
        <item>
            <title>Create Group</title>
            <link>https://xcend.de/stats/proc/creategroup</link>
            <description>Create Group


createGroup(ident uid, ident id, ident groupId, string day, string time, string location, integer maxSize) {
  assume exists /account[uid]/assistant[id];
  
  assume exists /exercise[id];
  assume not exists /exercise[id]/group[groupId];
  
  assume maxSize &gt;= 0;
  assume day = &quot;Monday&quot; || day = &quot;Tuesday&quot; || ...;
  
  insert /exercise[id] &lt;group id=[groupId] day=[day] time=[time] location=[location] curSize=[0] maxSize=[maxSize] /&gt;;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:42:20 +0000</pubDate>
        </item>
        <item>
            <title>Create Sheet</title>
            <link>https://xcend.de/stats/proc/createsheet</link>
            <description>Create Sheet


createSheet(ident uid, ident id, ident sheetId, double maxPoints) {
  assume exists /account[uid]/assistant[id];
  
  assume exists /exercise[id];
  assume not exists /exercise[id]/sheet[sheetId];
  
  assume maxPoints &gt;= 0;
  
  insert /exercise[id] &lt;sheet id=[sheetId] maxPoints=[maxPoints] /&gt;;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:41:54 +0000</pubDate>
        </item>
        <item>
            <title>Create Student Account</title>
            <link>https://xcend.de/stats/proc/createstudentaccount</link>
            <description>Create Student Account


createStudentAccount(ident username, ident studentId, string lastName, string firstName, string email, string password, string code) {
  assume not exists /account[username];
  assume count(studentId, /account/student/id) = 0;
  
  insert /
    &lt;account username=[username] lastName=[lastName] firstName=[firstName] email=[email] password=[password] code=[code]&gt;
      &lt;student id=[studentId] /&gt;
    &lt;/account&gt;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:40:48 +0000</pubDate>
        </item>
        <item>
            <title>Create Task</title>
            <link>https://xcend.de/stats/proc/createtask</link>
            <description>Create Task


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 &gt;= 0;
  
  insert /exam[id] &lt;task id=[taskId] maxPoints=[maxPoints] /&gt;;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:42:54 +0000</pubDate>
        </item>
        <item>
            <title>Delete Account</title>
            <link>https://xcend.de/stats/proc/deleteaccount</link>
            <description>Delete Account


deleteAccount(ident uid, ident username) {
  assume exists /account[uid]/admin;
  assume uid != username; # or do we want to allow an admin to delete himself?

  assume exists /account[username];
  
  assume size(/account[username]/examiner) = 0;
  assume size(/account[username]/assistant) = 0;
  assume size(/account[username]/tutor) = 0;

  # not yet a constraint of the implementation, but is seems practically relevant :-)
  if exists /account[username]/admin then
    assume si…</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:34:55 +0000</pubDate>
        </item>
        <item>
            <title>Delete Exam</title>
            <link>https://xcend.de/stats/proc/deleteexam</link>
            <description>Delete Exam


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];
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:34:42 +0000</pubDate>
        </item>
        <item>
            <title>Delete Exercise</title>
            <link>https://xcend.de/stats/proc/deleteexercise</link>
            <description>Delete Exercise


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];
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:34:55 +0000</pubDate>
        </item>
        <item>
            <title>Delete Grade</title>
            <link>https://xcend.de/stats/proc/deletegrade</link>
            <description>Delete Grade


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];
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:34:05 +0000</pubDate>
        </item>
        <item>
            <title>Delete Group</title>
            <link>https://xcend.de/stats/proc/deletegroup</link>
            <description>Delete Group


deleteGroup(ident uid, ident id, ident groupId) {
  assume exists /account[uid]/assistant[id];
  
  assume exists /exercise[id]/group[groupId];
  
  assume size(/exercise[id]/group[groupId]/tutor) = 0;
  assume count(groupId, /exercise[id]/student/group)) = 0;
  
  remove /exercise[id]/group[groupId];
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:34:55 +0000</pubDate>
        </item>
        <item>
            <title>Delete Sheet</title>
            <link>https://xcend.de/stats/proc/deletesheet</link>
            <description>Delete Sheet


deleteSheet(ident uid, ident id, ident sheetId) {
  assume exists /account[uid]/assistant[id];
  
  assume exists /exercise[id]/sheet[sheetId]; # implies existence of the exercise
  
  assume size(/exercise[id]/student/result[sheetId]) = 0;
  
  remove /exercise[id]/sheet[sheetId];
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:34:55 +0000</pubDate>
        </item>
        <item>
            <title>Delete Task</title>
            <link>https://xcend.de/stats/proc/deletetask</link>
            <description>Delete Task


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];
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:34:42 +0000</pubDate>
        </item>
        <item>
            <title>Grant Admin Rights</title>
            <link>https://xcend.de/stats/proc/grantadminrights</link>
            <description>Grant Admin Rights


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] &lt;admin /&gt;;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:32:43 +0000</pubDate>
        </item>
        <item>
            <title>Grant Assistant Rights</title>
            <link>https://xcend.de/stats/proc/grantassistantrights</link>
            <description>Grant Assistant Rights


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] &lt;assistant exercise=[exerciseId] /&gt;;
  insert /ex…</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:32:43 +0000</pubDate>
        </item>
        <item>
            <title>Grant Examiner Rights</title>
            <link>https://xcend.de/stats/proc/grantexaminerrights</link>
            <description>Grant Examiner Rights


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] &lt;examiner exam=[examId] /&gt;;
  insert /exam[examId] &lt;examiner account=[userna…</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:32:43 +0000</pubDate>
        </item>
        <item>
            <title>Grant Tutor Rights</title>
            <link>https://xcend.de/stats/proc/granttutorrights</link>
            <description>Grant Tutor Rights


grantTutorRights(ident uid, ident username, ident exerciseId, ident groupId) {
  assume exists /account[uid]/assistant[exerciseId];
  
  assume exists /account[username]; # implicitly true in OO implementations
  assume exists /exercise[exerciseId]/group[groupId];
  
  assume not exists /account[username]/tutor[exerciseId]/group[groupId]);
  assume not exists /exercise[exerciseId]/group[groupId]/tutor[username];
    # implied by integrity and the assumption before

  if not …</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:33:48 +0000</pubDate>
        </item>
        <item>
            <title>Hide Results</title>
            <link>https://xcend.de/stats/proc/hideresults</link>
            <description>Hide Results


hideResults(ident uid, ident id) {
  assume exists /account[uid]/examiner[id];
 
  assume exists /exam[id];
 
  assume /exam[id]/published;
 
  update /exam[id]/published false;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:32:43 +0000</pubDate>
        </item>
        <item>
            <title>Leave Team</title>
            <link>https://xcend.de/stats/proc/leaveteam</link>
            <description>Leave Team


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;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:34:55 +0000</pubDate>
        </item>
        <item>
            <title>Open Registration</title>
            <link>https://xcend.de/stats/proc/openregistration</link>
            <description>Open Registration


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;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:32:43 +0000</pubDate>
        </item>
        <item>
            <title>Open Sign-Up</title>
            <link>https://xcend.de/stats/proc/opensignup</link>
            <description>Open Sign-Up


openSignUp(ident uid, ident id) {
  assume exists /account[uid]/assistant[id];
  
  assume exists /exercise[id];
  
  assume not /exercise[id]/open;
  
  update /exercise[id]/open true;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:32:43 +0000</pubDate>
        </item>
        <item>
            <title>Publish Results</title>
            <link>https://xcend.de/stats/proc/publishresults</link>
            <description>Publish Results


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;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:32:43 +0000</pubDate>
        </item>
        <item>
            <title>Register Student</title>
            <link>https://xcend.de/stats/proc/registerstudent</link>
            <description>Register Student


registerStudent(ident uid, ident id, ident studentId) {
  assume count (studentId, /account/student/id) = 1;

  assume exists /exercise[id] &amp;&amp; /exercise[id]/open &amp;&amp; 
         exists /account[uid]/student &amp;&amp; /account[uid]/student/id = studentId
      || exists /account[uid]/assistant[id];

  assume exists /exercise[id];
  assume not exists /exercise[id]/student[studentId];
  
  insert /exercise[id] &lt;student id=[studentId] /&gt;;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:44:48 +0000</pubDate>
        </item>
        <item>
            <title>Remove Participant</title>
            <link>https://xcend.de/stats/proc/removeparticipant</link>
            <description>Remove Participant


removeParticipant(ident uid, ident id, ident studentId) {
  assume exists /account[uid]/student &amp;&amp; /account[uid]/student/id = studentId &amp;&amp; /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];
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:34:42 +0000</pubDate>
        </item>
        <item>
            <title>Remove Result (Sheet)</title>
            <link>https://xcend.de/stats/proc/removeresult_sheet</link>
            <description>Remove Result (Sheet)


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];
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:34:56 +0000</pubDate>
        </item>
        <item>
            <title>Remove Result (Task)</title>
            <link>https://xcend.de/stats/proc/removeresult_task</link>
            <description>Remove Result (Task)


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];
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:34:42 +0000</pubDate>
        </item>
        <item>
            <title>Remove Student ID</title>
            <link>https://xcend.de/stats/proc/removestudentid</link>
            <description>Remove Student ID


removeStudentId(ident uid, ident username) {
  assume exists /account[uid]/admin;

  assume exists /account[username]/student; # implies the account exists, which is implicitly true anyway

  assume size(/exercise/student[/account[username]/student/id]) = 0;
  assume size(/exam/participant[/account[username]/student/id]) = 0;

  remove /account[username]/student;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:34:56 +0000</pubDate>
        </item>
        <item>
            <title>Request Reset</title>
            <link>https://xcend.de/stats/proc/requestreset</link>
            <description>Request Reset


requestReset(ident username, string reset) {
  assume exists /account[username];
  
  assume not exists /account[username]/code; # account is already validated
    
  if not exists /account[username]/reset then
    insert /account[username]/reset;
  fi
  update /account[username]/reset reset;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:32:44 +0000</pubDate>
        </item>
        <item>
            <title>Reset Password</title>
            <link>https://xcend.de/stats/proc/resetpassword</link>
            <description>Reset Password


resetPassword(ident username, string reset, string password) {
  assume exists /account[username]/reset; # reset code was requested before, implies account exists
  assume /account[username]/reset = reset; 

  remove /account[username]/reset;
  update /account[username]/password password;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:32:44 +0000</pubDate>
        </item>
        <item>
            <title>Revoke Admin Rights</title>
            <link>https://xcend.de/stats/proc/revokeadminrights</link>
            <description>Revoke Admin Rights


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) &gt; 1; # kind of a practical constraint

  remove /account[username]/admin;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:32:44 +0000</pubDate>
        </item>
        <item>
            <title>Revoke Assistant Rights</title>
            <link>https://xcend.de/stats/proc/revokeassistantrights</link>
            <description>Revoke Assistant Rights


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];
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:32:44 +0000</pubDate>
        </item>
        <item>
            <title>Revoke Examiner Rights</title>
            <link>https://xcend.de/stats/proc/revokeexaminerrights</link>
            <description>Revoke Examiner Rights


revokeExaminerRights(ident uid, ident username, ident examId) {
  assume exists /account[uid]/admin;

  assume exists /account[username]/examiner[examId]; # implies the account exists, which is implicitly true anyway
  assume exists /exam[examId]/examiner[username]; # implied by integrity and the assumption before

  remove /account[username]/examiner[examId];
  remove /exam[examId]/examiner[username];
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:32:44 +0000</pubDate>
        </item>
        <item>
            <title>Revoke Tutor Rights</title>
            <link>https://xcend.de/stats/proc/revoketutorrights</link>
            <description>Revoke Tutor Rights


revokeTutorRights(ident uid, ident username, ident exerciseId, ident groupId) {
  assume exists /account[uid]/assistant[exerciseId];
  
  assume exists /account[username]/tutor[exerciseId]/group[groupId];
  assume exists /exercise[exerciseId]/group[groupId]/tutor[username];
    # implied by integrity and the assumption before

  remove /account[username]/tutor[exerciseId]/group[groupId];
  if size(/account[username]/tutor[exerciseId]/group) = 0 then # should this be an addi…</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:33:48 +0000</pubDate>
        </item>
        <item>
            <title>Sign-Out Group</title>
            <link>https://xcend.de/stats/proc/signoutgroup</link>
            <description>Sign-Out Group


signOutGroup(ident uid, ident id, ident studentId) {
  assume exists /exercise[id] &amp;&amp; /exercise[id]/open &amp;&amp; 
         exists /account[uid]/student &amp;&amp; /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]/stud…</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:34:56 +0000</pubDate>
        </item>
        <item>
            <title>Sign-Up Group</title>
            <link>https://xcend.de/stats/proc/signupgroup</link>
            <description>Sign-Up Group


signUpGroup(ident uid, ident id, ident studentId, ident groupId) {
  assume exists /exercise[id] &amp;&amp; /exercise[id]/open &amp;&amp; 
         exists /account[uid]/student &amp;&amp; /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]/…</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:34:56 +0000</pubDate>
        </item>
        <item>
            <title>Unregister Student</title>
            <link>https://xcend.de/stats/proc/unregisterstudent</link>
            <description>Unregister Student


unregisterStudent(ident uid, ident id, ident studentId) {
  assume exists /exercise[id] &amp;&amp; /exercise[id]/open &amp;&amp; 
         exists /account[uid]/student &amp;&amp; /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…</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:34:56 +0000</pubDate>
        </item>
        <item>
            <title>Validate Account</title>
            <link>https://xcend.de/stats/proc/validateaccount</link>
            <description>Validate Account


validateAccount(ident username, string code) {
  assume exists /account[username]/code; # implies existence of the account
  
  assume /account[username]/code = code;
  
  remove /account[username]/code;
}</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
        <category>stats:proc</category>
            <pubDate>Wed, 10 Jul 2013 12:32:44 +0000</pubDate>
        </item>
    </channel>
</rss>
