bcae00759ed9d1c8f8e4f3e21948de56b57bdbe3
[moodle.git] / mod / workshop / assessments.php
1 <?php  // $Id: lib.php,v 1.1 22 Aug 2003
3 /*************************************************
4     ACTIONS handled are:
6     addcomment
7     addstockcomment
8     adminconfirmdelete
9     admindelete
10     adminlist
11     agreeassessment
12     assesssubmission
13     displaygradingform
14     editcomment
15     editelements (teachers only)
16     gradeallassessments (teachers only)
17     gradeassessment (teachers only)
18     insertcomment
19     insertelements (for teachers)
20     listungradedstudentsubmissions (for teachers)
21     listungradedteachersubmissions (for teachers)
22     listteachersubmissions
23     regradestudentassessments (for teachers)
24     updateassessment
25     updatecomment
26     updategrading
27     userconfirmdelete
28     userdelete
29     viewassessment
31 ************************************************/
33     require("../../config.php");
34     require("lib.php"); 
35     require("locallib.php");
37     require_variable($id);    // Course Module ID
39     // get some useful stuff...
40     if (! $cm = get_record("course_modules", "id", $id)) {
41         error("Course Module ID was incorrect");
42     }
43     if (! $course = get_record("course", "id", $cm->course)) {
44         error("Course is misconfigured");
45     }
46     if (! $workshop = get_record("workshop", "id", $cm->instance)) {
47         error("Course module is incorrect");
48     }
50     require_login($course->id);
51     
52     $navigation = "";
53     if ($course->category) {
54         $navigation = "<a href=\"../../course/view.php?id=$course->id\">$course->shortname</a> ->";
55     }
57     $strworkshops = get_string("modulenameplural", "workshop");
58     $strworkshop  = get_string("modulename", "workshop");
59     $strassessments = get_string("assessments", "workshop");
61     // ... print the header and...
62     print_header_simple("$workshop->name", "",
63                  "<a href=\"index.php?id=$course->id\">$strworkshops</a> -> 
64                   <a href=\"view.php?id=$cm->id\">$workshop->name</a> -> $strassessments", 
65                   "", "", true);
67     //...get the action 
68     require_variable($action);
69     
71     /*************** add comment to assessment (by author, assessor or teacher) ***************************/
72     if ($action == 'addcomment') {
73         
74         print_heading_with_help(get_string("addacomment", "workshop"), "addingacomment", "workshop");
75         // get assessment record
76         if (!$assessmentid = $_REQUEST['aid']) { // comes from link or hidden form variable
77             error("Assessment id not given");
78             }
79         $assessment = get_record("workshop_assessments", "id", $assessmentid);
80         if (!$submission = get_record("workshop_submissions", "id", $assessment->submissionid)) {
81             error("Submission not found");
82             }
83         ?>
84         <form name="commentform" action="assessments.php" method="post">
85         <input type="hidden" name="action" value="insertcomment" />
86         <input type="hidden" name="id" value="<?php echo $cm->id ?>" />
87         <input type="hidden" name="aid" value="<?php echo $_REQUEST['aid'] ?>" />
88         <center>
89         <table cellpadding="5" border="1">
90         <?php
92         // now get the comment
93         echo "<tr valign=\"top\">\n";
95         echo "  <td align=\"right\"><b>". get_string("comment", "workshop").":</b></td>\n";
97         echo "  <td>\n";
99         echo "      <textarea name=\"comments\" rows=\"5\" cols=\"75\">\n";
100         echo "</textarea>\n";
102         echo "  </td></tr></table>\n";
103         echo "<input type=\"submit\" value=\"".get_string("savemycomment", "workshop")."\" />\n";
104         echo "</center></form>\n";
105         echo "<center><b>".get_string("assessment", "workshop"). "</b></center>\n";
106         workshop_print_assessment($workshop, $assessment);
107         }
111     /*************** add stock comment (by teacher ) ***************************/
112     elseif ($action == 'addstockcomment') {
114         require_variable($aid);
115         require_variable($elementno);
117         if (!isteacher($course->id)) {
118             error("Only teachers can look at this page");
119         }
120     
121         if (!$assessment = get_record("workshop_assessments", "id", $aid)) {
122             error("workshop assessment is misconfigured");
123         }
124         $form = data_submitted("nomatch"); // probably always come from the same page, change this statement
125     
126         // store the comment in the stock comments table
127         if ($elementno == 99) { // it's the general comment
128             $form->feedback_99 = $form->generalcomment;
129         }
130         $comment->workshopid = $workshop->id;
131         $comment->elementno = $elementno;
132         $comment->comments = $form->{"feedback_$elementno"};
133         if (!(trim($comment->comments))) {
134             // no comment given - just redisplay assessment form
135             workshop_print_assessment($workshop, $assessment, true, true, $form->returnto);
136             print_footer($course);
137             exit();
138         }
139   
140         if (!$element->id = insert_record("workshop_stockcomments", $comment)) {
141             error("Could not insert comment into comment bank");
142         }
144         // now upate the assessment (just the elements, the assessment itself is not updated)
146         // first get the assignment elements for maxscores and weights...
147         $elementsraw = get_records("workshop_elements", "workshopid", $workshop->id, "elementno ASC");
148         if (count($elementsraw) < $workshop->nelements) {
149             print_string("noteonassignmentelements", "workshop");
150         }
151         if ($elementsraw) {
152             foreach ($elementsraw as $element) {
153                 $elements[] = $element;   // to renumber index 0,1,2...
154             }
155         } else {
156             $elements = null;
157         }
159         $timenow = time();
160         // don't fiddle about, delete all the old and add the new!
161         delete_records("workshop_grades", "assessmentid",  $assessment->id);
162         
163     
164         //determine what kind of grading we have
165         switch ($workshop->gradingstrategy) {
166             case 0: // no grading
167                 // Insert all the elements that contain something
168                 for ($i = 0; $i < $workshop->nelements; $i++) {
169                     unset($element);
170                     $element->workshopid = $workshop->id;
171                     $element->assessmentid = $assessment->id;
172                     $element->elementno = $i;
173                     $element->feedback   = $form->{"feedback_$i"};
174                     if (!$element->id = insert_record("workshop_grades", $element)) {
175                         error("Could not insert workshop grade!");
176                     }
177                 }
178                 $grade = 0; // set to satisfy save to db
179                 break;
180                 
181             case 1: // accumulative grading
182                 // Insert all the elements that contain something
183                 foreach ($form->grade as $key => $thegrade) {
184                     unset($element);
185                     $element->workshopid = $workshop->id;
186                     $element->assessmentid = $assessment->id;
187                     $element->elementno = $key;
188                     $element->feedback   = $form->{"feedback_$key"};
189                     $element->grade = $thegrade;
190                     if (!$element->id = insert_record("workshop_grades", $element)) {
191                         error("Could not insert workshop grade!");
192                         }
193                     }
194                 // now work out the grade...
195                 $rawgrade=0;
196                 $totalweight=0;
197                 foreach ($form->grade as $key => $grade) {
198                     $maxscore = $elements[$key]->maxscore;
199                     $weight = $WORKSHOP_EWEIGHTS[$elements[$key]->weight];
200                     if ($weight > 0) { 
201                         $totalweight += $weight;
202                     }
203                     $rawgrade += ($grade / $maxscore) * $weight;
204                     // echo "\$key, \$maxscore, \$weight, \$totalweight, \$grade, \$rawgrade : $key, $maxscore, $weight, $totalweight, $grade, $rawgrade<br />";
205                 }
206                 $grade = 100.0 * ($rawgrade / $totalweight);
207                 break;
209             case 2: // error banded graded
210                 // Insert all the elements that contain something
211                 $error = 0.0; 
212                 for ($i =0; $i < $workshop->nelements; $i++) {
213                     unset($element);
214                     $element->workshopid = $workshop->id;
215                     $element->assessmentid = $assessment->id;
216                     $element->elementno = $i;
217                     $element->feedback   = $form->{"feedback_$i"};
218                     $element->grade = $form->grade[$i];
219                     if (!$element->id = insert_record("workshop_grades", $element)) {
220                         error("Could not insert workshop grade!");
221                     }
222                     if (empty($form->grade[$i])){
223                         $error += $WORKSHOP_EWEIGHTS[$elements[$i]->weight];
224                     }
225                 }
226                 // now save the adjustment
227                 unset($element);
228                 $i = $workshop->nelements;
229                 $element->workshopid = $workshop->id;
230                 $element->assessmentid = $assessment->id;
231                 $element->elementno = $i;
232                 $element->grade = $form->grade[$i];
233                 if (!$element->id = insert_record("workshop_grades", $element)) {
234                     error("Could not insert workshop grade!");
235                 }
236                 $grade = ($elements[intval($error + 0.5)]->maxscore + $form->grade[$i]) * 100 / $workshop->grade;
237                 // do sanity check
238                 if ($grade < 0) {
239                     $grade = 0;
240                 } elseif ($grade > 100) {
241                     $grade = 100;
242                 }
243                 echo "<b>".get_string("weightederrorcount", "workshop", intval($error + 0.5))."</b>\n";
244                 break;
245             
246             case 3: // criteria grading
247                 // save in the selected criteria value in element zero, 
248                 unset($element);
249                 $element->workshopid = $workshop->id;
250                 $element->assessmentid = $assessment->id;
251                 $element->elementno = 0;
252                 $element->grade = $form->grade[0];
253                 if (!$element->id = insert_record("workshop_grades", $element)) {
254                     error("Could not insert workshop grade!");
255                 }
256                 // now save the adjustment in element one
257                 unset($element);
258                 $element->workshopid = $workshop->id;
259                 $element->assessmentid = $assessment->id;
260                 $element->elementno = 1;
261                 $element->grade = $form->grade[1];
262                 if (!$element->id = insert_record("workshop_grades", $element)) {
263                     error("Could not insert workshop grade!");
264                 }
265                 $grade = ($elements[$form->grade[0]]->maxscore + $form->grade[1]);
266                 break;
268             case 4: // rubric grading (identical to accumulative grading)
269                 // Insert all the elements that contain something
270                 foreach ($form->grade as $key => $thegrade) {
271                     unset($element);
272                     $element->workshopid = $workshop->id;
273                     $element->assessmentid = $assessment->id;
274                     $element->elementno = $key;
275                     $element->feedback   = $form->{"feedback_$key"};
276                     $element->grade = $thegrade;
277                     if (!$element->id = insert_record("workshop_grades", $element)) {
278                         error("Could not insert workshop grade!");
279                     }
280                 }
281                 // now work out the grade...
282                 $rawgrade=0;
283                 $totalweight=0;
284                 foreach ($form->grade as $key => $grade) {
285                     $maxscore = $elements[$key]->maxscore;
286                     $weight = $WORKSHOP_EWEIGHTS[$elements[$key]->weight];
287                     if ($weight > 0) { 
288                         $totalweight += $weight;
289                     }
290                     $rawgrade += ($grade / $maxscore) * $weight;
291                 }
292                 $grade = 100.0 * ($rawgrade / $totalweight);
293                 break;
295         } // end of switch
296             
297     
298         // any comment?
299         if (!empty($form->generalcomment)) { // update the object (no need to update the db record)
300             $assessment->generalcomment = $form->generalcomment;
301         }
302         
303         // redisplay form, going back to original returnto address
304         workshop_print_assessment($workshop, $assessment, true, true, $form->returnto);
305         
306         // add_to_log($course->id, "workshop", "assess", "assessments.php?action=viewassessment&amp;id=$cm->id&amp;aid=$assessment->id", "$assessment->id", "$cm->id");
307         
308     }
311     /******************* admin confirm delete ************************************/
312     elseif ($action == 'adminconfirmdelete' ) {
314         if (!isteacher($course->id)) {
315             error("Only teachers can look at this page");
316             }
317         if (empty($_GET['aid'])) {
318             error("Admin confirm delete: assessment id missing");
319             }
320             
321         notice_yesno(get_string("confirmdeletionofthisitem","workshop", get_string("assessment", "workshop")), 
322              "assessments.php?action=admindelete&amp;id=$cm->id&amp;aid=$_GET[aid]", "submissions.php?action=adminlist&amp;id=$cm->id");
323         }
324     
326     /******************* admin delete ************************************/
327     elseif ($action == 'admindelete' ) {
329         if (!isteacher($course->id)) {
330             error("Only teachers can look at this page");
331             }
332         if (empty($_GET['aid'])) {
333             error("Admin delete: submission id missing");
334             }
335             
336         print_string("deleting", "workshop");
337         // first delete all the associated records...
338         delete_records("workshop_comments", "assessmentid", $_GET['aid']);
339         delete_records("workshop_grades", "assessmentid", $_GET['aid']);
340         // ...now delete the assessment...
341         delete_records("workshop_assessments", "id", $_GET['aid']);
342         
343         print_continue("submissions.php?id=$cm->id&amp;action=adminlist");
344         }
345     
347     /*********************** admin list of asssessments (of a submission) (by teachers)**************/
348     elseif ($action == 'adminlist') {
350         if (!isteacher($course->id)) {
351             error("Only teachers can look at this page");
352             }
353             
354         if (empty($_GET['sid'])) {
355             error ("Workshop asssessments: adminlist called with no sid");
356             }
357         $submission = get_record("workshop_submissions", "id", $_GET['sid']);
358         workshop_print_assessments_for_admin($workshop, $submission);
359         print_continue("submissions.php?action=adminlist&amp;id=$cm->id");
360         }
363     /*********************** admin list of asssessments by a student (used by teachers only )******************/
364     elseif ($action == 'adminlistbystudent') {
366         if (!isteacher($course->id)) {
367             error("Only teachers can look at this page");
368             }
369             
370         if (empty($_GET['userid'])) {
371             error ("Workshop asssessments: adminlistbystudent called with no userid");
372             }
373         $user = get_record("user", "id", $_GET['userid']);
374         workshop_print_assessments_by_user_for_admin($workshop, $user);
375         print_continue("submissions.php?action=adminlist&amp;id=$cm->id");
376         }
379     /*************** agree (to) assessment (by student) ***************************/
380     elseif ($action == 'agreeassessment') {
381         $timenow = time();
382         // assessment id comes from link or hidden form variable
383         if (!$assessment = get_record("workshop_assessments", "id", $_REQUEST['aid'])) { 
384             error("Assessment : agree assessment failed");
385             }
386         //save time of agreement
387         set_field("workshop_assessments", "timeagreed", $timenow, "id", $assessment->id);
388         echo "<centre><b>".get_string("savedok", "workshop")."</b></center><br />\n";
389             
390         add_to_log($course->id, "workshop", "agree", "assessments.php?action=viewassessment&amp;id=$cm->id&amp;aid=$assessment->id", "$assessment->id");
391         print_continue("view.php?id=$cm->id");
392         }
396     /*************** Assess submission (by teacher or student) ***************************/
397     elseif ($action == 'assesssubmission') {
399         require_variable($sid);
400         
401         optional_variable($allowcomments);
402         if (!isset($allowcomments)) {
403             $allowcomments = false;
404             }
405     
406         if (! $submission = get_record("workshop_submissions", "id", $sid)) {
407             error("Assess submission is misconfigured - no submission record!");
408             }
409         
410         // there can be an assessment record (for teacher submissions), if there isn't...
411         if (!$assessment = get_record("workshop_assessments", "submissionid", $submission->id, "userid", 
412                     $USER->id)) {
413             // if it's the teacher see if the user has done a self assessment if so copy it
414             if (isteacher($course->id) and  ($assessment = get_record("workshop_assessments", "submissionid", 
415                             $submission->id, "userid", $submission->userid))) {
416                 $assessment = workshop_copy_assessment($assessment, $submission, true);
417                 // need to set owner of assessment
418                 set_field("workshop_assessments", "userid", $USER->id, "id", $assessment->id);
419                 $assessment->resubmission = 0; // not set by workshop_copy_assessment
420                 $assessment->timegraded = 0; // not set by workshop_copy_assessment
421                 $assessment->timeagreed = 0; // not set by workshop_copy_assessment
422             } else {
423                 $yearfromnow = time() + 365 * 86400;
424                 // ...create one and set timecreated way in the future, this is reset when record is updated
425                 $assessment->workshopid = $workshop->id;
426                 $assessment->submissionid = $submission->id;
427                 $assessment->userid = $USER->id;
428                 $assessment->timecreated = $yearfromnow;
429                 $assessment->grade = -1; // set impossible grade
430                 $assessment->timegraded = 0;
431                 $assessment->timeagreed = 0;
432                 $assessment->resubmission = 0;
433                 if (!$assessment->id = insert_record("workshop_assessments", $assessment)) {
434                     error("Could not insert workshop assessment!");
435                 }
436                 // if it's the teacher and the workshop is error banded set all the elements to Yes
437                 if (isteacher($course->id) and ($workshop->gradingstrategy == 2)) {
438                     for ($i =0; $i < $workshop->nelements; $i++) {
439                         unset($element);
440                         $element->workshopid = $workshop->id;
441                         $element->assessmentid = $assessment->id;
442                         $element->elementno = $i;
443                         $element->feedback = '';
444                         $element->grade = 1;
445                         if (!$element->id = insert_record("workshop_grades", $element)) {
446                             error("Could not insert workshop grade!");
447                         }
448                     }
449                     // now set the adjustment
450                     unset($element);
451                     $i = $workshop->nelements;
452                     $element->workshopid = $workshop->id;
453                     $element->assessmentid = $assessment->id;
454                     $element->elementno = $i;
455                     $element->grade = 0;
456                     if (!$element->id = insert_record("workshop_grades", $element)) {
457                         error("Could not insert workshop grade!");
458                     }
459                 }
460             }
461         }
462         
463         print_heading_with_help(get_string("assessthissubmission", "workshop"), "grading", "workshop");
464         
465         // show assessment and allow changes
466         workshop_print_assessment($workshop, $assessment, true, $allowcomments, $_SERVER["HTTP_REFERER"]);
467     }
470     /*************** display grading form (viewed by student) *********************************/
471     elseif ($action == 'displaygradingform') {
473         print_heading_with_help(get_string("specimenassessmentform", "workshop"), "specimen", "workshop");
474     
475         workshop_print_assessment($workshop); // called with no assessment
476         print_continue("view.php?id=$cm->id");
477     }
480     /*************** edit comment on assessment (by author, assessor or teacher) ***************************/
481     elseif ($action == 'editcomment') {
482         
483         print_heading_with_help(get_string("editacomment", "workshop"), "editingacomment", "workshop");
484         // get the comment record...
485         if (!$comment = get_record("workshop_comments", "id", $_GET['cid'])) {
486             error("Edit Comment: Comment not found");
487             }
488         if (!$assessment = get_record("workshop_assessments", "id", $comment->assessmentid)) {
489             error("Edit Comment: Assessment not found");
490             }
491         if (!$submission = get_record("workshop_submissions", "id", $assessment->submissionid)) {
492             error("Edit Comment: Submission not found");
493             }
494         ?>
495         <form name="gradingform" action="assessments.php" method="post">
496         <input type="hidden" name="action" value="updatecomment" />
497         <input type="hidden" name="id" value="<?php echo $cm->id ?>" />
498         <input type="hidden" name="cid" value="<?php echo $_GET['cid'] ?>" />
499         <center>
500         <table cellpadding="5" border="1">
501         <?php
503         // now show the comment
504         echo "<tr valign=\"top\">\n";
505         echo "  <td align=\"right\"><b>". get_string("comment", "workshop").":</b></td>\n";
506         echo "  <td>\n";
507         echo "      <textarea name=\"comments\" rows=\"5\" cols=\"75\">\n";
508         if (isset($comment->comments)) {
509             echo $comment->comments;
510             }
511         echo "      </textarea>\n";
512         echo "  </td></tr></table>\n";
513         echo "<input type=\"submit\" value=\"".get_string("savemycomment", "workshop")."\" />\n";
514         echo "</center></form>\n";
515         workshop_print_assessment($workshop, $assessment);
516         }
519     /*********************** edit assessment elements (for teachers) ***********************/
520     elseif ($action == 'editelements') {
522         if (!isteacher($course->id)) {
523             error("Only teachers can look at this page");
524         }
526         $count = count_records("workshop_grades", "workshopid", $workshop->id);
527         if ($count) {
528             notify(get_string("warningonamendingelements", "workshop"));
529         }
530         // set up heading, form and table
531         print_heading_with_help(get_string("editingassessmentelements", "workshop"), "elements", "workshop");
532         ?>
533         <form name="form" method="post" action="assessments.php">
534         <input type="hidden" name="id" value="<?php echo $cm->id ?>" />
535         <input type="hidden" name="action" value="insertelements" />
536         <center><table cellpadding="5" border="1">
537         <?php
538         
539         // get existing elements, if none set up appropriate default ones
540         if ($elementsraw = get_records("workshop_elements", "workshopid", $workshop->id, "elementno ASC" )) {
541             foreach ($elementsraw as $element) {
542                 $elements[] = $element;   // to renumber index 0,1,2...
543             }
544         }
545         // check for missing elements (this happens either the first time round or when the number of elements is icreased)
546         for ($i=0; $i<$workshop->nelements; $i++) {
547             if (!isset($elements[$i])) {
548                 $elements[$i]->description = '';
549                 $elements[$i]->scale =0;
550                 $elements[$i]->maxscore = 0;
551                 $elements[$i]->weight = 11;
552             }
553         }
554         
555         switch ($workshop->gradingstrategy) {
556             case 0: // no grading
557                 for ($i=0; $i<$workshop->nelements; $i++) {
558                     $iplus1 = $i+1;
559                     echo "<tr valign=\"top\">\n";
560                     echo "  <td align=\"right\"><b>". get_string("element","workshop")." $iplus1:</b></td>\n";
561                     echo "<td><textarea name=\"description[]\" rows=\"3\" cols=\"75\">".$elements[$i]->description."</textarea>\n";
562                     echo "  </td></tr>\n";
563                     echo "<tr valign=\"top\">\n";
564                     echo "  <td colspan=\"2\" bgcolor=\"$THEME->cellheading2\">&nbsp;</td>\n";
565                     echo "</tr>\n";
566                 }
567                 break;
569             case 1: // accumulative grading
570                 // set up scales name
571                 foreach ($WORKSHOP_SCALES as $KEY => $SCALE) {
572                     $SCALES[] = $SCALE['name'];
573                 }
574                 for ($i=0; $i<$workshop->nelements; $i++) {
575                     $iplus1 = $i+1;
576                     echo "<tr valign=\"top\">\n";
577                     echo "  <td align=\"right\"><b>". get_string("element","workshop")." $iplus1:</b></td>\n";
578                     echo "<td><textarea name=\"description[]\" rows=\"3\" cols=\"75\">".$elements[$i]->description."</textarea>\n";
579                     echo "  </td></tr>\n";
580                     echo "<tr valign=\"top\">\n";
581                     echo "  <td align=\"right\"><b>". get_string("typeofscale", "workshop"). ":</b></td>\n";
582                     echo "<td valign=\"top\">\n";
583                     choose_from_menu($SCALES, "scale[]", $elements[$i]->scale, "");
584                     if ($elements[$i]->weight == '') { // not set
585                         $elements[$i]->weight = 11; // unity
586                     }
587                     echo "</td></tr>\n";
588                     echo "<tr valign=\"top\"><td align=\"right\"><b>".get_string("elementweight", "workshop").":</b></td><td>\n";
589                     workshop_choose_from_menu($WORKSHOP_EWEIGHTS, "weight[]", $elements[$i]->weight, "");
590                     echo "      </td>\n";
591                     echo "</tr>\n";
592                     echo "<tr valign=\"top\">\n";
593                     echo "  <td colspan=\"2\" bgcolor=\"$THEME->cellheading2\">&nbsp;</td>\n";
594                     echo "</tr>\n";
595                 }
596                 break;
597                 
598             case 2: // error banded grading
599                 for ($i=0; $i<$workshop->nelements; $i++) {
600                     $iplus1 = $i+1;
601                     echo "<tr valign=\"top\">\n";
602                     echo "  <td align=\"right\"><b>". get_string("element","workshop")." $iplus1:</b></td>\n";
603                     echo "<td><textarea name=\"description[$i]\" rows=\"3\" cols=\"75\">".$elements[$i]->description."</textarea>\n";
604                     echo "  </td></tr>\n";
605                     if ($elements[$i]->weight == '') { // not set
606                         $elements[$i]->weight = 11; // unity
607                         }
608                     echo "</tr>\n";
609                     echo "<tr valign=\"top\"><td align=\"right\"><b>".get_string("elementweight", "workshop").":</b></td><td>\n";
610                     workshop_choose_from_menu($WORKSHOP_EWEIGHTS, "weight[]", $elements[$i]->weight, "");
611                     echo "      </td>\n";
612                     echo "</tr>\n";
613                     echo "<tr valign=\"top\">\n";
614                     echo "  <td colspan=\"2\" bgcolor=\"$THEME->cellheading2\">&nbsp;</td>\n";
615                     echo "</tr>\n";
616                 }
617                 echo "</center></table><br />\n";
618                 echo "<center><b>".get_string("gradetable","workshop")."</b></center>\n";
619                 echo "<center><table cellpadding=\"5\" border=\"1\"><tr><td align=\"CENTER\">".
620                     get_string("numberofnegativeresponses", "workshop");
621                 echo "</td><td>". get_string("suggestedgrade", "workshop")."</td></tr>\n";
622                 for ($j = $workshop->grade; $j >= 0; $j--) {
623                     $numbers[$j] = $j;
624                 }
625                 for ($i=0; $i<=$workshop->nelements; $i++) {
626                     echo "<tr><td align=\"CENTER\">$i</td><td align=\"CENTER\">";
627                     if (!isset($elements[$i])) {  // the "last one" will be!
628                         $elements[$i]->description = "";
629                         $elements[$i]->maxscore = 0;
630                     }
631                     choose_from_menu($numbers, "maxscore[$i]", $elements[$i]->maxscore, "");
632                     echo "</td></tr>\n";
633                 }
634                 echo "</table></center>\n";
635                 break;
636                 
637             case 3: // criterion grading
638                 for ($j = 100; $j >= 0; $j--) {
639                     $numbers[$j] = $j;
640                 }
641                 for ($i=0; $i<$workshop->nelements; $i++) {
642                     $iplus1 = $i+1;
643                     echo "<tr valign=\"top\">\n";
644                     echo "  <td align=\"right\"><b>". get_string("criterion","workshop")." $iplus1:</b></td>\n";
645                     echo "<td><textarea name=\"description[$i]\" rows=\"3\" cols=\"75\">".$elements[$i]->description."</textarea>\n";
646                     echo "  </td></tr>\n";
647                     echo "<tr><td><b>". get_string("suggestedgrade", "workshop").":</b></td><td>\n";
648                     choose_from_menu($numbers, "maxscore[$i]", $elements[$i]->maxscore, "");
649                     echo "</td></tr>\n";
650                     echo "<tr valign=\"top\">\n";
651                     echo "  <td colspan=\"2\" bgcolor=\"$THEME->cellheading2\">&nbsp;</td>\n";
652                     echo "</tr>\n";
653                 }
654                 break;
656             case 4: // rubric
657                 for ($j = 100; $j >= 0; $j--) {
658                     $numbers[$j] = $j;
659                 }
660                 if ($rubricsraw = get_records("workshop_rubrics", "workshopid", $workshop->id)) {
661                     foreach ($rubricsraw as $rubric) {
662                         $rubrics[$rubric->elementno][$rubric->rubricno] = $rubric->description;   // reindex 0,1,2...
663                     }
664                 }
665                 for ($i=0; $i<$workshop->nelements; $i++) {
666                     $iplus1 = $i+1;
667                     echo "<tr valign=\"top\">\n";
668                     echo "  <td align=\"right\"><b>". get_string("element","workshop")." $iplus1:</b></td>\n";
669                     echo "<td><textarea name=\"description[$i]\" rows=\"3\" cols=\"75\">".$elements[$i]->description."</textarea>\n";
670                     echo "  </td></tr>\n";
671                     echo "<tr valign=\"top\"><td align=\"right\"><b>".get_string("elementweight", "workshop").":</b></td><td>\n";
672                     workshop_choose_from_menu($WORKSHOP_EWEIGHTS, "weight[]", $elements[$i]->weight, "");
673                     echo "      </td>\n";
674                     echo "</tr>\n";
676                     for ($j=0; $j<5; $j++) {
677                         $jplus1 = $j+1;
678                         if (empty($rubrics[$i][$j])) {
679                             $rubrics[$i][$j] = "";
680                         }
681                         echo "<tr valign=\"top\">\n";
682                         echo "  <td align=\"right\"><b>". get_string("grade","workshop")." $j:</b></td>\n";
683                         echo "<td><textarea name=\"rubric[$i][$j]\" rows=\"3\" cols=\"75\">".$rubrics[$i][$j]."</textarea>\n";
684                         echo "  </td></tr>\n";
685                         }
686                     echo "<tr valign=\"top\">\n";
687                     echo "  <td colspan=\"2\" bgcolor=\"$THEME->cellheading2\">&nbsp;</td>\n";
688                     echo "</tr>\n";
689                     }
690                 break;
691             }
692         // close table and form
694         ?>
695         </table><br />
696         <input type="submit" value="<?php  print_string("savechanges") ?>" />
697         <input type="submit" name="cancel" value="<?php  print_string("cancel") ?>" />
698         </center>
699         </form>
700         <?php
701     }
702     
703     
704     /*************** grade all assessments (by teacher) ***************************/
705     elseif ($action == 'gradeallassessments') {
706         
707         if (!isteacher($course->id)) {
708             error("Only teachers can look at this page");
709         }
711         print_heading(get_string("gradingallassessments", "workshop"));
712         workshop_grade_assessments($workshop);
713         print_continue("view.php?id=$cm->id");
714     }
717     /*************** grade (student's) assessment (by teacher) ***************************/
718     elseif ($action == 'gradeassessment') {
720         if (!isteacher($course->id)) {
721             error("Only teachers can look at this page");
722         }
724         print_heading_with_help(get_string("gradeassessment", "workshop"), "gradingassessments", "workshop");
725         // get assessment record
726         if (!$assessmentid = $_GET['aid']) {
727             error("Assessment id not given");
728         }
729         $assessment = get_record("workshop_assessments", "id", $assessmentid);
730         if (!$submission = get_record("workshop_submissions", "id", $assessment->submissionid)) {
731             error("Submission not found");
732         }
733         // get the teacher's assessment first
734         if ($teachersassessment = workshop_get_submission_assessment($submission, $USER)) {
735             echo "<center><b>".get_string("teacherassessments", "workshop", $course->teacher)."</b></center>\n";
736             workshop_print_assessment($workshop, $teachersassessment);
737         }
738         // now the student's assessment (don't allow changes)
739         $user = get_record("user", "id", $assessment->userid);
740         echo "<center><b>".get_string("assessmentby", "workshop", $user->firstname." ".$user->lastname)."</b></center>\n";
741         workshop_print_assessment($workshop, $assessment);
742         
743         include('assessment_grading_form.html');
744         die;
745     }
748     /*************** insert (new) comment (by author, assessor or teacher) ***************************/
749     elseif ($action == 'insertcomment') {
750         $timenow = time();
752         $form = (object)$_POST;
753         
754         if (!$assessment = get_record("workshop_assessments", "id", $_POST['aid'])) {
755             error("Unable to insert comment");
756             }
757         // save the comment...
758         $comment->workshopid = $workshop->id;
759         $comment->assessmentid   = $assessment->id;
760         $comment->userid   = $USER->id;
761         $comment->timecreated   = $timenow;
762         $comment->comments   = $form->comments;
763         if (!$comment->id = insert_record("workshop_comments", $comment)) {
764             error("Could not insert workshop comment!");
765             }
766             
767         add_to_log($course->id, "workshop", "comment", "view.php?id=$cm->id", "$comment->id");
769         print_continue("assessments.php?action=viewassessment&amp;id=$cm->id&amp;aid=$assessment->id");
770         }
773     /*********************** insert/update assignment elements (for teachers)***********************/
774     elseif ($action == 'insertelements') {
776         if (!isteacher($course->id)) {
777             error("Only teachers can look at this page");
778         }
780         $form = (object)$HTTP_POST_VARS;
781         
782         // let's not fool around here, dump the junk!
783         delete_records("workshop_elements", "workshopid", $workshop->id);
784         
785         // determine wich type of grading
786         switch ($workshop->gradingstrategy) {
787             case 0: // no grading
788                 // Insert all the elements that contain something
789                 foreach ($form->description as $key => $description) {
790                     if ($description) {
791                         unset($element);
792                         $element->description   = $description;
793                         $element->workshopid = $workshop->id;
794                         $element->elementno = $key;
795                         if (!$element->id = insert_record("workshop_elements", $element)) {
796                             error("Could not insert workshop element!");
797                         }
798                     }
799                 }
800                 break;
801                 
802             case 1: // accumulative grading
803                 // Insert all the elements that contain something
804                 foreach ($form->description as $key => $description) {
805                     if ($description) {
806                         unset($element);
807                         $element->description   = $description;
808                         $element->workshopid = $workshop->id;
809                         $element->elementno = $key;
810                         if (isset($form->scale[$key])) {
811                             $element->scale = $form->scale[$key];
812                             switch ($WORKSHOP_SCALES[$form->scale[$key]]['type']) {
813                                 case 'radio' :  $element->maxscore = $WORKSHOP_SCALES[$form->scale[$key]]['size'] - 1;
814                                                         break;
815                                 case 'selection' :  $element->maxscore = $WORKSHOP_SCALES[$form->scale[$key]]['size'];
816                                                         break;
817                             }
818                         }
819                         if (isset($form->weight[$key])) {
820                             $element->weight = $form->weight[$key];
821                         }
822                         if (!$element->id = insert_record("workshop_elements", $element)) {
823                             error("Could not insert workshop element!");
824                         }
825                     }
826                 }
827                 break;
828                 
829             case 2: // error banded grading...
830             case 3: // ...and criterion grading
831                 // Insert all the elements that contain something, the number of descriptions is one less than the number of grades
832                 foreach ($form->maxscore as $key => $themaxscore) {
833                     unset($element);
834                     $element->workshopid = $workshop->id;
835                     $element->elementno = $key;
836                     $element->maxscore = $themaxscore;
837                     if (isset($form->description[$key])) {
838                         $element->description   = $form->description[$key];
839                     }
840                     if (isset($form->weight[$key])) {
841                         $element->weight = $form->weight[$key];
842                     }
843                     if (!$element->id = insert_record("workshop_elements", $element)) {
844                         error("Could not insert workshop element!");
845                     }
846                 }
847                 break;
848                 
849             case 4: // ...and criteria grading
850                 // Insert all the elements that contain something
851                 foreach ($form->description as $key => $description) {
852                     unset($element);
853                     $element->workshopid = $workshop->id;
854                     $element->elementno = $key;
855                     $element->description   = $description;
856                     $element->weight = $form->weight[$key];
857                     for ($j=0;$j<5;$j++) {
858                         if (empty($form->rubric[$key][$j]))
859                             break;
860                     }
861                     $element->maxscore = $j - 1;
862                     if (!$element->id = insert_record("workshop_elements", $element)) {
863                         error("Could not insert workshop element!");
864                     }
865                 }
866                 // let's not fool around here, dump the junk!
867                 delete_records("workshop_rubrics", "workshopid", $workshop->id);
868                 for ($i=0;$i<$workshop->nelements;$i++) {
869                     for ($j=0;$j<5;$j++) {
870                         unset($element);
871                         if (empty($form->rubric[$i][$j])) {  // OK to have an element with fewer than 5 items
872                              break;
873                          }
874                         $element->workshopid = $workshop->id;
875                         $element->elementno = $i;
876                         $element->rubricno = $j;
877                         $element->description   = $form->rubric[$i][$j];
878                         if (!$element->id = insert_record("workshop_rubrics", $element)) {
879                             error("Could not insert workshop element!");
880                         }
881                     }
882                 }
883                 break;
884         } // end of switch
886         redirect("view.php?id=$cm->id", get_string("savedok","workshop"));
887     }
890     /*********************** list assessments for grading (Student submissions)(by teachers)***********************/
891     elseif ($action == 'listungradedstudentsubmissions') {
893         if (!isteacher($course->id)) {
894             error("Only teachers can look at this page");
895             }
896         workshop_list_ungraded_assessments($workshop, "student");
897         print_continue("view.php?id=$cm->id");
898         }
901     /*********************** list assessments for grading (Teacher submissions) (by teachers)***********************/
902     elseif ($action == 'listungradedteachersubmissions') {
904         if (!isteacher($course->id)) {
905             error("Only teachers can look at this page");
906             }
907         workshop_list_ungraded_assessments($workshop, "teacher");
908         print_continue("view.php?id=$cm->id");
909         }
912     /****************** list teacher submissions ***********************/
913     elseif ($action == 'listteachersubmissions') {
915         workshop_list_teacher_submissions($workshop, $USER);
916         print_continue("view.php?id=$cm->id");
917     }
920     /******************* regrade student assessments ************************************/
921     elseif ($action == 'regradestudentassessments' ) {
923         $timenow = time();
924         if (!isteacher($course->id)) {
925             error("Only teachers can look at this page");
926         }
927         // get all the submissions...
928         if ($submissions = get_records("workshop_submissions", "workshopid", $workshop->id)) {
929             foreach ($submissions as $submission) {
930                 // ...if cold...
931                 if (($submission->timecreated + $CFG->maxeditingtime) < $timenow) {
932                     // ...clear assessment count so workshop_grade_assessments() can do its thing
933                     set_field("workshop_submissions", "nassessments", 0, "id", $submission->id);
934                 }
935             }
936         }
937         echo "<pre>";
938         workshop_grade_assessments($workshop);
939         print_continue("submissions.php?id=$cm->id&action=adminlist");
940     }
941     
943     /*************** remove stock comment (by teacher ) ***************************/
944     elseif ($action == 'removestockcomment') {
946         require_variable($aid);
947         require_variable($stockcommentid);
949         if (!isteacher($course->id)) {
950             error("Only teachers can look at this page");
951         }
952     
953         if (!$assessment = get_record("workshop_assessments", "id", $aid)) {
954             error("workshop assessment is misconfigured");
955         }
956         $form = data_submitted("nomatch"); // probably always come from the same page, change this statement
957     
958         // delete the comment from the stock comments table
959         if (!delete_records("workshop_stockcomments", "id", $stockcommentid)) {
960             error("Could not remove comment from the comment bank");
961         }
963         // now upate the assessment (just the elements, the assessment itself is not updated)
965         // first get the assignment elements for maxscores and weights...
966         $elementsraw = get_records("workshop_elements", "workshopid", $workshop->id, "elementno ASC");
967         if (count($elementsraw) < $workshop->nelements) {
968             print_string("noteonassignmentelements", "workshop");
969         }
970         if ($elementsraw) {
971             foreach ($elementsraw as $element) {
972                 $elements[] = $element;   // to renumber index 0,1,2...
973             }
974         } else {
975             $elements = null;
976         }
978         $timenow = time();
979         // don't fiddle about, delete all the old and add the new!
980         delete_records("workshop_grades", "assessmentid",  $assessment->id);
981         
982     
983         //determine what kind of grading we have
984         switch ($workshop->gradingstrategy) {
985             case 0: // no grading
986                 // Insert all the elements that contain something
987                 for ($i =0; $i < $workshop->nelements; $i++) {
988                     unset($element);
989                     $element->workshopid = $workshop->id;
990                     $element->assessmentid = $assessment->id;
991                     $element->elementno = $i;
992                     $element->feedback   = $form->{"feedback_$i"};
993                     if (!$element->id = insert_record("workshop_grades", $element)) {
994                         error("Could not insert workshop grade!");
995                     }
996                 }
997                 $grade = 0; // set to satisfy save to db
998                 break;
999                 
1000             case 1: // accumulative grading
1001                 // Insert all the elements that contain something
1002                 foreach ($form->grade as $key => $thegrade) {
1003                     unset($element);
1004                     $element->workshopid = $workshop->id;
1005                     $element->assessmentid = $assessment->id;
1006                     $element->elementno = $key;
1007                     $element->feedback   = $form->{"feedback_$key"};
1008                     $element->grade = $thegrade;
1009                     if (!$element->id = insert_record("workshop_grades", $element)) {
1010                         error("Could not insert workshop grade!");
1011                         }
1012                     }
1013                 // now work out the grade...
1014                 $rawgrade=0;
1015                 $totalweight=0;
1016                 foreach ($form->grade as $key => $grade) {
1017                     $maxscore = $elements[$key]->maxscore;
1018                     $weight = $WORKSHOP_EWEIGHTS[$elements[$key]->weight];
1019                     if ($weight > 0) { 
1020                         $totalweight += $weight;
1021                     }
1022                     $rawgrade += ($grade / $maxscore) * $weight;
1023                     // echo "\$key, \$maxscore, \$weight, \$totalweight, \$grade, \$rawgrade : $key, $maxscore, $weight, $totalweight, $grade, $rawgrade<br />";
1024                 }
1025                 $grade = 100.0 * ($rawgrade / $totalweight);
1026                 break;
1028             case 2: // error banded graded
1029                 // Insert all the elements that contain something
1030                 $error = 0.0; 
1031                 for ($i =0; $i < $workshop->nelements; $i++) {
1032                     unset($element);
1033                     $element->workshopid = $workshop->id;
1034                     $element->assessmentid = $assessment->id;
1035                     $element->elementno = $i;
1036                     $element->feedback   = $form->{"feedback_$i"};
1037                     $element->grade = $form->grade[$i];
1038                     if (!$element->id = insert_record("workshop_grades", $element)) {
1039                         error("Could not insert workshop grade!");
1040                     }
1041                     if (empty($form->grade[$i])){
1042                         $error += $WORKSHOP_EWEIGHTS[$elements[$i]->weight];
1043                     }
1044                 }
1045                 // now save the adjustment
1046                 unset($element);
1047                 $i = $workshop->nelements;
1048                 $element->workshopid = $workshop->id;
1049                 $element->assessmentid = $assessment->id;
1050                 $element->elementno = $i;
1051                 $element->grade = $form->grade[$i];
1052                 if (!$element->id = insert_record("workshop_grades", $element)) {
1053                     error("Could not insert workshop grade!");
1054                 }
1055                 $grade = ($elements[intval($error + 0.5)]->maxscore + $form->grade[$i]) * 100 / $workshop->grade;
1056                 // do sanity check
1057                 if ($grade < 0) {
1058                     $grade = 0;
1059                 } elseif ($grade > 100) {
1060                     $grade = 100;
1061                 }
1062                 echo "<b>".get_string("weightederrorcount", "workshop", intval($error + 0.5))."</b>\n";
1063                 break;
1064             
1065             case 3: // criteria grading
1066                 // save in the selected criteria value in element zero, 
1067                 unset($element);
1068                 $element->workshopid = $workshop->id;
1069                 $element->assessmentid = $assessment->id;
1070                 $element->elementno = 0;
1071                 $element->grade = $form->grade[0];
1072                 if (!$element->id = insert_record("workshop_grades", $element)) {
1073                     error("Could not insert workshop grade!");
1074                 }
1075                 // now save the adjustment in element one
1076                 unset($element);
1077                 $element->workshopid = $workshop->id;
1078                 $element->assessmentid = $assessment->id;
1079                 $element->elementno = 1;
1080                 $element->grade = $form->grade[1];
1081                 if (!$element->id = insert_record("workshop_grades", $element)) {
1082                     error("Could not insert workshop grade!");
1083                 }
1084                 $grade = ($elements[$form->grade[0]]->maxscore + $form->grade[1]);
1085                 break;
1087             case 4: // rubric grading (identical to accumulative grading)
1088                 // Insert all the elements that contain something
1089                 foreach ($form->grade as $key => $thegrade) {
1090                     unset($element);
1091                     $element->workshopid = $workshop->id;
1092                     $element->assessmentid = $assessment->id;
1093                     $element->elementno = $key;
1094                     $element->feedback   = $form->{"feedback_$key"};
1095                     $element->grade = $thegrade;
1096                     if (!$element->id = insert_record("workshop_grades", $element)) {
1097                         error("Could not insert workshop grade!");
1098                     }
1099                 }
1100                 // now work out the grade...
1101                 $rawgrade=0;
1102                 $totalweight=0;
1103                 foreach ($form->grade as $key => $grade) {
1104                     $maxscore = $elements[$key]->maxscore;
1105                     $weight = $WORKSHOP_EWEIGHTS[$elements[$key]->weight];
1106                     if ($weight > 0) { 
1107                         $totalweight += $weight;
1108                     }
1109                     $rawgrade += ($grade / $maxscore) * $weight;
1110                 }
1111                 $grade = 100.0 * ($rawgrade / $totalweight);
1112                 break;
1114         } // end of switch
1115             
1116     
1117         // any comment?
1118         if (!empty($form->generalcomment)) { // update the object (no need to update the db record)
1119             $assessment->generalcomment = $form->generalcomment;
1120         }
1121         
1122         // redisplay form, going back to original returnto address
1123         workshop_print_assessment($workshop, $assessment, true, true, $form->returnto);
1124         
1125         // add_to_log($course->id, "workshop", "assess", "assessments.php?action=viewassessment&amp;id=$cm->id&amp;aid=$assessment->id", "$assessment->id", "$cm->id");
1126         
1127     }
1130     /*************** update assessment (by teacher or student) ***************************/
1131     elseif ($action == 'updateassessment') {
1133         require_variable($aid);
1134         if (! $assessment = get_record("workshop_assessments", "id", $aid)) {
1135             error("workshop assessment is misconfigured");
1136         }
1138         // first get the assignment elements for maxscores and weights...
1139         $elementsraw = get_records("workshop_elements", "workshopid", $workshop->id, "elementno ASC");
1140         if (count($elementsraw) < $workshop->nelements) {
1141             print_string("noteonassignmentelements", "workshop");
1142         }
1143         if ($elementsraw) {
1144             foreach ($elementsraw as $element) {
1145                 $elements[] = $element;   // to renumber index 0,1,2...
1146             }
1147         } else {
1148             $elements = null;
1149         }
1151         $timenow = time();
1152         // don't fiddle about, delete all the old and add the new!
1153         delete_records("workshop_grades", "assessmentid",  $assessment->id);
1154         
1155         $form = data_submitted("nomatch"); // probably always come from the same page, change this statement
1156         
1157         //determine what kind of grading we have
1158         switch ($workshop->gradingstrategy) {
1159             case 0: // no grading
1160                 // Insert all the elements that contain something
1161                 for ($i = 0; $i < $workshop->nelements; $i++) {
1162                     unset($element);
1163                     $element->workshopid = $workshop->id;
1164                     $element->assessmentid = $assessment->id;
1165                     $element->elementno = $i;
1166                     $element->feedback = $form->{"feedback_$i"};
1167                     if (!$element->id = insert_record("workshop_grades", $element)) {
1168                         error("Could not insert workshop grade!");
1169                     }
1170                 }
1171                 $grade = 0; // set to satisfy save to db
1172                 break;
1173                 
1174             case 1: // accumulative grading
1175                 // Insert all the elements that contain something
1176                 foreach ($form->grade as $key => $thegrade) {
1177                     unset($element);
1178                     $element->workshopid = $workshop->id;
1179                     $element->assessmentid = $assessment->id;
1180                     $element->elementno = $key;
1181                     $element->feedback   = $form->{"feedback_$key"};
1182                     $element->grade = $thegrade;
1183                     if (!$element->id = insert_record("workshop_grades", $element)) {
1184                         error("Could not insert workshop grade!");
1185                         }
1186                     }
1187                 // now work out the grade...
1188                 $rawgrade=0;
1189                 $totalweight=0;
1190                 foreach ($form->grade as $key => $grade) {
1191                     $maxscore = $elements[$key]->maxscore;
1192                     $weight = $WORKSHOP_EWEIGHTS[$elements[$key]->weight];
1193                     if ($weight > 0) { 
1194                         $totalweight += $weight;
1195                     }
1196                     $rawgrade += ($grade / $maxscore) * $weight;
1197                     // echo "\$key, \$maxscore, \$weight, \$totalweight, \$grade, \$rawgrade : $key, $maxscore, $weight, $totalweight, $grade, $rawgrade<br />";
1198                 }
1199                 $grade = 100.0 * ($rawgrade / $totalweight);
1200                 break;
1202             case 2: // error banded graded
1203                 // Insert all the elements that contain something
1204                 $error = 0.0; 
1205                 for ($i =0; $i < $workshop->nelements; $i++) {
1206                     unset($element);
1207                     $element->workshopid = $workshop->id;
1208                     $element->assessmentid = $assessment->id;
1209                     $element->elementno = $i;
1210                     $element->feedback   = $form->{"feedback_$i"};
1211                     $element->grade = $form->grade[$i];
1212                     if (!$element->id = insert_record("workshop_grades", $element)) {
1213                         error("Could not insert workshop grade!");
1214                     }
1215                     if (empty($form->grade[$i])){
1216                         $error += $WORKSHOP_EWEIGHTS[$elements[$i]->weight];
1217                     }
1218                 }
1219                 // now save the adjustment
1220                 unset($element);
1221                 $i = $workshop->nelements;
1222                 $element->workshopid = $workshop->id;
1223                 $element->assessmentid = $assessment->id;
1224                 $element->elementno = $i;
1225                 $element->grade = $form->grade[$i];
1226                 if (!$element->id = insert_record("workshop_grades", $element)) {
1227                     error("Could not insert workshop grade!");
1228                 }
1229                 $grade = ($elements[intval($error + 0.5)]->maxscore + $form->grade[$i]) * 100 / $workshop->grade;
1230                 // do sanity check
1231                 if ($grade < 0) {
1232                     $grade = 0;
1233                 } elseif ($grade > 100) {
1234                     $grade = 100;
1235                 }
1236                 echo "<b>".get_string("weightederrorcount", "workshop", intval($error + 0.5))."</b>\n";
1237                 break;
1238             
1239             case 3: // criteria grading
1240                 // save in the selected criteria value in element zero, 
1241                 unset($element);
1242                 $element->workshopid = $workshop->id;
1243                 $element->assessmentid = $assessment->id;
1244                 $element->elementno = 0;
1245                 $element->grade = $form->grade[0];
1246                 if (!$element->id = insert_record("workshop_grades", $element)) {
1247                     error("Could not insert workshop grade!");
1248                 }
1249                 // now save the adjustment in element one
1250                 unset($element);
1251                 $element->workshopid = $workshop->id;
1252                 $element->assessmentid = $assessment->id;
1253                 $element->elementno = 1;
1254                 $element->grade = $form->grade[1];
1255                 if (!$element->id = insert_record("workshop_grades", $element)) {
1256                     error("Could not insert workshop grade!");
1257                 }
1258                 $grade = ($elements[$form->grade[0]]->maxscore + $form->grade[1]);
1259                 break;
1261             case 4: // rubric grading (identical to accumulative grading)
1262                 // Insert all the elements that contain something
1263                 foreach ($form->grade as $key => $thegrade) {
1264                     unset($element);
1265                     $element->workshopid = $workshop->id;
1266                     $element->assessmentid = $assessment->id;
1267                     $element->elementno = $key;
1268                     $element->feedback = $form->{"feedback_$key"};
1269                     $element->grade = $thegrade;
1270                     if (!$element->id = insert_record("workshop_grades", $element)) {
1271                         error("Could not insert workshop grade!");
1272                     }
1273                 }
1274                 // now work out the grade...
1275                 $rawgrade=0;
1276                 $totalweight=0;
1277                 foreach ($form->grade as $key => $grade) {
1278                     $maxscore = $elements[$key]->maxscore;
1279                     $weight = $WORKSHOP_EWEIGHTS[$elements[$key]->weight];
1280                     if ($weight > 0) { 
1281                         $totalweight += $weight;
1282                     }
1283                     $rawgrade += ($grade / $maxscore) * $weight;
1284                 }
1285                 $grade = 100.0 * ($rawgrade / $totalweight);
1286                 break;
1288         } // end of switch
1289             
1290         // update the time of the assessment record (may be re-edited)...
1291         set_field("workshop_assessments", "timecreated", $timenow, "id", $assessment->id);
1292         
1293         if (!$submission = get_record("workshop_submissions", "id", $assessment->submissionid)) {
1294             error ("Updateassessment: submission record not found");
1295         }
1296         
1297         // if the workshop does need peer agreement AND it's self assessment then set timeagreed
1298         if ($workshop->agreeassessments and ($submission->userid == $assessment->userid)) {
1299             set_field("workshop_assessments", "timeagreed", $timenow, "id", $assessment->id);
1300         }
1301         
1302         // set grade...
1303         set_field("workshop_assessments", "grade", $grade, "id", $assessment->id);
1304         // ...and clear the timegraded but set the graddinggrade to maximum, may to reduced subsequently...
1305         set_field("workshop_assessments", "timegraded", 0, "id", $assessment->id);
1306         set_field("workshop_assessments", "gradinggrade", 100, "id", $assessment->id);
1307         // ...and the resubmission flag
1308         set_field("workshop_assessments", "resubmission", 0, "id", $assessment->id);
1310         // if there's examples or peer assessments clear the counter in the submission so that
1311         // the cron job will regrade this assessment (and the other assessments fo the submission)
1312         if ($workshop->ntassessments or $workshop->nsassessments) {
1313             set_field("workshop_submissions", "nassessments", 0, "id", $submission->id);
1314         } else { // it could be self assessment....
1315             // now see if there's a corresponding assessment so that the gradinggrade can be set
1316             if (isteacher($course->id)) {
1317                 // see if there's are student assessments, if so set their gradinggrade
1318                 if ($assessments = workshop_get_assessments($submission)) {
1319                     foreach($assessments as $studentassessment) {
1320                         // skip if it's not a student assessment
1321                         if (!isstudent($course->id, $studentassessment->userid)) {
1322                             continue;
1323                         }
1324                         $gradinggrade = workshop_compare_assessments($workshop, $assessment, $studentassessment);
1325                         set_field("workshop_assessments", "timegraded", $timenow, "id", $studentassessment->id);
1326                         set_field("workshop_assessments", "gradinggrade", $gradinggrade, "id", $studentassessment->id);
1327                     }
1328                 }
1329             } else { //it's a student assessment, see if there's a corresponding teacher's assessment
1330                 if ($assessments = workshop_get_assessments($submission)) {
1331                     foreach($assessments as $teacherassessment) {
1332                         if (isteacher($course->id, $teacherassessment->userid)) {
1333                             $gradinggrade = workshop_compare_assessments($workshop, $assessment, $teacherassessment);
1334                             set_field("workshop_assessments", "timegraded", $timenow, "id", $assessment->id);
1335                             set_field("workshop_assessments", "gradinggrade", $gradinggrade, "id", $assessment->id);
1336                             break; // only look for the first teacher assessment
1337                         }
1338                     }
1339                 }
1340             }
1341         }
1342         
1343         // any comment?
1344         if (!empty($form->generalcomment)) {
1345             set_field("workshop_assessments", "generalcomment", $form->generalcomment, "id", $assessment->id);
1346         }
1347             
1348         add_to_log($course->id, "workshop", "assess",
1349                 "assessments.php?action=viewassessment&amp;id=$cm->id&amp;aid=$assessment->id", "$assessment->id", "$cm->id");
1350         
1351         // set up return address
1352         if (!$returnto = $form->returnto) {
1353             $returnto = "view.php?id=$cm->id";
1354         }
1355             
1356         // show grade if grading strategy is not zero
1357         if ($workshop->gradingstrategy) {
1358             redirect($returnto, get_string("thegradeis", "workshop").": ".
1359                     number_format($grade * $workshop->grade / 100, 2).
1360                     " (".get_string("maximumgrade")." ".number_format($workshop->grade).")");
1361         }
1362         else {
1363             redirect($returnto);
1364         }
1365     }
1368     /****************** update comment (by author, assessor or teacher) ********************/
1369     elseif ($action == 'updatecomment') {
1370         $timenow = time();
1372         $form = (object)$_POST;
1373         
1374         // get the comment record...
1375         if (!$comment = get_record("workshop_comments", "id", $_POST['cid'])) {
1376             error("Update to Comment failed");
1377         }
1378         if (!$assessment = get_record("workshop_assessments", "id", $comment->assessmentid)) {
1379             error("Update Comment: Assessment not found");
1380         }
1381         //save the comment for the assessment...
1382         if (isset($form->comments)) {
1383             set_field("workshop_comments", "comments", $form->comments, "id", $comment->id);
1384             set_field("workshop_comments", "timecreated", $timenow, "id", $comment->id);
1385             // ..and kick to comment into life (probably not needed but just in case)
1386             set_field("workshop_comments", "mailed", 0, "id", $comment->id);
1387             echo "<centre><b>".get_string("savedok", "workshop")."</b></center><br />\n";
1388             
1389             add_to_log($course->id, "workshop", "comment", 
1390                     "assessments.php?action=viewassessment&amp;id=$cm->id&amp;aid=$assessment->id", "$comment->id");
1391         }
1393         print_continue("assessments.php?action=viewassessment&amp;id=$cm->id&amp;aid=$assessment->id");
1394     }
1397     /****************** update grading (by teacher) ***************************/
1398     elseif ($action == 'updategrading') {
1399         $timenow = time();
1401         if (!isteacher($course->id)) {
1402             error("Only teachers can look at this page");
1403         }
1405         $form = (object)$_POST;
1406         
1407         if (!$assessment = get_record("workshop_assessments", "id", $_POST['aid'])) {
1408             error("Update Grading failed");
1409         }
1410         //save the comment and grade for the assessment 
1411         if (isset($form->teachercomment)) {
1412             set_field("workshop_assessments", "teachercomment", $form->teachercomment, "id", $assessment->id);
1413             set_field("workshop_assessments", "gradinggrade", $form->gradinggrade, "id", $assessment->id);
1414             set_field("workshop_assessments", "timegraded", $timenow, "id", $assessment->id);
1415             set_field("workshop_assessments", "mailed", 0, "id", $assessment->id);
1416             set_field("workshop_assessments", "teachergraded", 1, "id", $assessment->id);
1417             echo "<centre><b>".get_string("savedok", "workshop")."</b></centre><br />\n";
1418             
1419             add_to_log($course->id, "workshop", "grade", 
1420                  "assessments.php?action=viewassessment&amp;id=$cm->id&amp;aid=$assessment->id", "$assessment->id", "$cm->id");
1421         }
1422         switch ($form->stype) {
1423             case "student" : 
1424                 redirect("assessments.php?action=listungradedstudentsubmissions&amp;id=$cm->id");
1425                 break;
1426             case "teacher" : 
1427                 redirect("assessments.php?action=listungradedteachersubmissions&amp;id=$cm->id");
1428                 break;
1429         }
1430     }
1433     /****************** user confirm delete ************************************/
1434     elseif ($action == 'userconfirmdelete' ) {
1436         if (empty($_GET['aid'])) {
1437             error("User confirm delete: assessment id missing");
1438         }
1439             
1440         notice_yesno(get_string("confirmdeletionofthisitem","workshop", 
1441                 get_string("assessment", "workshop")), 
1442                 "assessments.php?action=userdelete&amp;id=$cm->id&amp;aid=$_GET[aid]", "view.php?id=$cm->id");
1443     }
1444     
1446     /****************** user delete ************************************/
1447     elseif ($action == 'userdelete' ) {
1449         if (empty($_GET['aid'])) {
1450             error("User delete: assessment id missing");
1451         }
1452             
1453         print_string("deleting", "workshop");
1454         // first delete all the associated records...
1455         delete_records("workshop_comments", "assessmentid", $_GET['aid']);
1456         delete_records("workshop_grades", "assessmentid", $_GET['aid']);
1457         // ...now delete the assessment...
1458         delete_records("workshop_assessments", "id", $_GET['aid']);
1459         
1460         print_continue("view.php?id=$cm->id");
1461     }
1462     
1464     /****************** view all assessments ***********************/
1465     elseif ($action == 'viewallassessments') {
1466         
1467         if (!$submission = get_record("workshop_submissions", "id", $_GET['sid'])) {
1468             error("View All Assessments: submission record not found");
1469         }       
1470             
1471         if ($assessments = workshop_get_assessments($submission)) {
1472             foreach ($assessments as $assessment) {
1473                 workshop_print_assessment($workshop, $assessment);
1474             }
1475         }
1476         // only called from list all submissions
1477         print_continue("submissions.php?action=listallsubmissions&amp;id=$cm->id");
1478     }
1481     /****************** view assessment *****************************/
1482     elseif ($action == 'viewassessment') {
1484         optional_variable($allowcomments);
1485         if (!isset($allowcomments)) {
1486             $allowcomments = false;
1487         }
1488     
1489         // get the assessment record
1490         if (!$assessment = get_record("workshop_assessments", "id", $_GET['aid'])) {
1491             error("Assessment record not found");
1492         }       
1494         // show assessment but don't allow changes
1495         workshop_print_assessment($workshop, $assessment, false, $allowcomments);
1496         
1497         if (isteacher($course->id) and !isteacher($course->id, $assessment->userid)) {
1498             print_heading('<a href="assessments.php?action=gradeassessment&amp;id='.$cm->id.'&amp;stype=student&amp;aid='.$assessment->id.'">'.
1499                 get_string('assessthisassessment', 'workshop').'</a>');
1500         }
1501         
1502         print_continue("view.php?id=$cm->id");
1503     }
1506     /*************** no man's land **************************************/
1507     else {
1508         error("Fatal Error: Unknown Action: ".$action."\n");
1509     }
1511     print_footer($course);
1512  
1513 ?>