3 /*************************************************
14 editelements (teachers only)
15 gradeallassessments (teachers only)
16 gradeassessment (teachers only)
18 insertelements (for teachers)
19 listungradedstudentsubmissions (for teachers)
20 listungradedteachersubmissions (for teachers)
21 listteachersubmissions
22 regradestudentassessments (for teachers)
27 ************************************************/
29 require("../../config.php");
31 require("locallib.php");
33 $action = required_param('action', PARAM_ALPHA
);
34 $id = optional_param('id', 0, PARAM_INT
); // Course Module ID
35 $wid = optional_param('wid', 0, PARAM_INT
); // Workshop ID
36 $aid = optional_param('aid', 0, PARAM_INT
);
37 $userid = optional_param('userid', 0, PARAM_INT
);
38 $cid = optional_param('cid', 0, PARAM_INT
); // comment id
39 $sid = optional_param('sid', 0, PARAM_INT
); // submission id
40 $elementno = optional_param('elementno', -1, PARAM_INT
);
41 $stockcommentid = optional_param('stockcommentid', 0, PARAM_INT
);
43 // get some useful stuff...
45 if (! $cm = get_coursemodule_from_id('workshop', $id)) {
46 error("Course Module ID was incorrect");
48 if (! $workshop = get_record("workshop", "id", $cm->instance
)) {
49 error("Course module is incorrect");
52 if (! $workshop = get_record("workshop", "id", $wid)) {
53 error("Workshop id is incorrect");
55 if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id
, $workshop->course
)) {
56 error("No coursemodule found");
61 if (! $course = get_record("course", "id", $cm->course
)) {
62 error("Course is misconfigured");
65 require_login($course->id
, false, $cm);
66 $context = get_context_instance(CONTEXT_MODULE
, $cm->id
);
68 $strworkshops = get_string("modulenameplural", "workshop");
69 $strworkshop = get_string("modulename", "workshop");
70 $strassessments = get_string("assessments", "workshop");
72 // ... print the header and...
75 $navlinks[] = array('name' => $strworkshops, 'link' => "index.php?id=$course->id", 'type' => 'activity');
76 $navlinks[] = array('name' => format_string($workshop->name
,true), 'link' => "view.php?id=$cm->id", 'type' => 'activityinstance');
77 $navlinks[] = array('name' => $strassessments, 'link' => '', 'type' => 'title');
78 $navigation = build_navigation($navlinks);
80 print_header_simple(format_string($workshop->name
), "", $navigation,
83 /*************** add comment to assessment (by author, assessor or teacher) ***************************/
84 if ($action == 'addcomment') {
86 print_heading_with_help(get_string("addacomment", "workshop"), "addingacomment", "workshop");
87 // get assessment record
88 if (!$assessmentid = $aid) { // comes from link or hidden form variable
89 error("Assessment id not given");
91 $assessment = get_record("workshop_assessments", "id", $assessmentid);
92 if (!$submission = get_record("workshop_submissions", "id", $assessment->submissionid
)) {
93 error("Submission not found");
96 <form id
="commentform" action
="assessments.php" method
="post">
97 <input type
="hidden" name
="action" value
="insertcomment" />
98 <input type
="hidden" name
="id" value
="<?php echo $cm->id ?>" />
99 <input type
="hidden" name
="aid" value
="<?php echo $aid ?>" />
100 <div
class="boxaligncenter">
101 <table cellpadding
="5" border
="1">
104 // now get the comment
105 echo "<tr valign=\"top\">\n";
107 echo " <td align=\"right\"><b>". get_string("comment", "workshop").":</b></td>\n";
111 echo " <textarea name=\"comments\" rows=\"5\" cols=\"75\">\n";
112 echo "</textarea>\n";
114 echo " </td></tr></table>\n";
115 echo "<input type=\"submit\" value=\"".get_string("savemycomment", "workshop")."\" />\n";
116 echo "</div></form>\n";
117 echo "<div style=\"text-align:center\"><b>".get_string("assessment", "workshop"). "</b></div>\n";
118 workshop_print_assessment($workshop, $assessment);
122 /*************** add stock comment (by teacher ) ***************************/
123 elseif ($action == 'addstockcomment') {
125 if (empty($aid) or ($elementno<0)) {
126 error("Workshop Assessment ID and/or Element Number missing");
129 require_capability('mod/workshop:manage', $context);
131 if (!$assessment = get_record("workshop_assessments", "id", $aid)) {
132 error("workshop assessment is misconfigured");
134 $form = data_submitted('nomatch'); //Nomatch because we can come from assess.php
136 // store the comment in the stock comments table
137 if ($elementno == 99) { // it's the general comment
138 $form->feedback_99
= $form->generalcomment
;
140 $comment->workshopid
= $workshop->id
;
141 $comment->elementno
= $elementno;
142 $comment->comments
= clean_param($form->{"feedback_$elementno"}, PARAM_CLEAN
);
143 if (!(trim($comment->comments
))) {
144 // no comment given - just redisplay assessment form
145 workshop_print_assessment($workshop, $assessment, true, true, $form->returnto
);
146 print_footer($course);
150 if (!$element->id
= insert_record("workshop_stockcomments", $comment)) {
151 error("Could not insert comment into comment bank");
154 // now upate the assessment (just the elements, the assessment itself is not updated)
156 // first get the assignment elements for maxscores and weights...
157 $elementsraw = get_records("workshop_elements", "workshopid", $workshop->id
, "elementno ASC");
158 if (count($elementsraw) < $workshop->nelements
) {
159 print_string("noteonassignmentelements", "workshop");
162 foreach ($elementsraw as $element) {
163 $elements[] = $element; // to renumber index 0,1,2...
170 // don't fiddle about, delete all the old and add the new!
171 delete_records("workshop_grades", "assessmentid", $assessment->id
);
174 //determine what kind of grading we have
175 switch ($workshop->gradingstrategy
) {
176 case 0: // no grading
177 // Insert all the elements that contain something
178 for ($i = 0; $i < $workshop->nelements
; $i++
) {
180 $element->workshopid
= $workshop->id
;
181 $element->assessmentid
= $assessment->id
;
182 $element->elementno
= $i;
183 $element->feedback
= clean_param($form->{"feedback_$i"}, PARAM_CLEAN
);
184 if (!$element->id
= insert_record("workshop_grades", $element)) {
185 error("Could not insert workshop grade!");
188 $grade = 0; // set to satisfy save to db
191 case 1: // accumulative grading
192 // Insert all the elements that contain something
193 foreach ($form->grade
as $key => $thegrade) {
195 $element->workshopid
= $workshop->id
;
196 $element->assessmentid
= $assessment->id
;
197 $element->elementno
= clean_param($key, PARAM_INT
);
198 $element->feedback
= clean_param($form->{"feedback_$key"}, PARAM_CLEAN
);
199 $element->grade
= $thegrade;
200 if (!$element->id
= insert_record("workshop_grades", $element)) {
201 error("Could not insert workshop grade!");
204 // now work out the grade...
207 foreach ($form->grade
as $key => $grade) {
208 $maxscore = $elements[$key]->maxscore
;
209 $weight = $WORKSHOP_EWEIGHTS[$elements[$key]->weight
];
211 $totalweight +
= $weight;
213 $rawgrade +
= ($grade / $maxscore) * $weight;
214 // echo "\$key, \$maxscore, \$weight, \$totalweight, \$grade, \$rawgrade : $key, $maxscore, $weight, $totalweight, $grade, $rawgrade<br />";
216 $grade = 100.0 * ($rawgrade / $totalweight);
219 case 2: // error banded graded
220 // Insert all the elements that contain something
222 for ($i =0; $i < $workshop->nelements
; $i++
) {
224 $element->workshopid
= $workshop->id
;
225 $element->assessmentid
= $assessment->id
;
226 $element->elementno
= $i;
227 $element->feedback
= clean_param($form->{"feedback_$i"}, PARAM_CLEAN
);
228 $element->grade
= $form->grade
[$i];
229 if (!$element->id
= insert_record("workshop_grades", $element)) {
230 error("Could not insert workshop grade!");
232 if (empty($form->grade
[$i])){
233 $error +
= $WORKSHOP_EWEIGHTS[$elements[$i]->weight
];
236 // now save the adjustment
238 $i = $workshop->nelements
;
239 $element->workshopid
= $workshop->id
;
240 $element->assessmentid
= $assessment->id
;
241 $element->elementno
= $i;
242 $element->grade
= $form->grade
[$i];
243 if (!$element->id
= insert_record("workshop_grades", $element)) {
244 error("Could not insert workshop grade!");
246 $grade = ($elements[intval($error +
0.5)]->maxscore +
$form->grade
[$i]) * 100 / $workshop->grade
;
250 } elseif ($grade > 100) {
253 echo "<b>".get_string("weightederrorcount", "workshop", intval($error +
0.5))."</b>\n";
256 case 3: // criteria grading
257 // save in the selected criteria value in element zero,
259 $element->workshopid
= $workshop->id
;
260 $element->assessmentid
= $assessment->id
;
261 $element->elementno
= 0;
262 $element->grade
= $form->grade
[0];
263 if (!$element->id
= insert_record("workshop_grades", $element)) {
264 error("Could not insert workshop grade!");
266 // now save the adjustment in element one
268 $element->workshopid
= $workshop->id
;
269 $element->assessmentid
= $assessment->id
;
270 $element->elementno
= 1;
271 $element->grade
= $form->grade
[1];
272 if (!$element->id
= insert_record("workshop_grades", $element)) {
273 error("Could not insert workshop grade!");
275 $grade = ($elements[$form->grade
[0]]->maxscore +
$form->grade
[1]);
278 case 4: // rubric grading (identical to accumulative grading)
279 // Insert all the elements that contain something
280 foreach ($form->grade
as $key => $thegrade) {
282 $element->workshopid
= $workshop->id
;
283 $element->assessmentid
= $assessment->id
;
284 $element->elementno
= clean_param($key, PARAM_INT
);
285 $element->feedback
= clean_param($form->{"feedback_$key"}, PARAM_CLEAN
);
286 $element->grade
= $thegrade;
287 if (!$element->id
= insert_record("workshop_grades", $element)) {
288 error("Could not insert workshop grade!");
291 // now work out the grade...
294 foreach ($form->grade
as $key => $grade) {
295 $maxscore = $elements[$key]->maxscore
;
296 $weight = $WORKSHOP_EWEIGHTS[$elements[$key]->weight
];
298 $totalweight +
= $weight;
300 $rawgrade +
= ($grade / $maxscore) * $weight;
302 $grade = 100.0 * ($rawgrade / $totalweight);
309 if (!empty($form->generalcomment
)) { // update the object (no need to update the db record)
310 $assessment->generalcomment
= clean_param($form->generalcomment
, PARAM_CLEAN
);
313 // redisplay form, going back to original returnto address
314 workshop_print_assessment($workshop, $assessment, true, true, $form->returnto
);
316 // add_to_log($course->id, "workshop", "assess", "viewassessment.php?id=$cm->id&aid=$assessment->id", "$assessment->id", "$cm->id");
321 /******************* confirm delete ************************************/
322 elseif ($action == 'confirmdelete' ) {
325 error("Confirm delete: assessment id missing");
328 notice_yesno(get_string("confirmdeletionofthisitem","workshop", get_string("assessment", "workshop")),
329 "assessments.php?action=delete&id=$cm->id&aid=$aid", "submissions.php?action=adminlist&id=$cm->id");
333 /******************* delete ************************************/
334 elseif ($action == 'delete' ) {
337 error("Delete: submission id missing");
340 print_string("deleting", "workshop");
341 // first delete all the associated records...
342 delete_records("workshop_comments", "assessmentid", $aid);
343 delete_records("workshop_grades", "assessmentid", $aid);
344 // ...now delete the assessment...
345 delete_records("workshop_assessments", "id", $aid);
347 print_continue("view.php?id=$cm->id");
351 /*********************** admin list of asssessments (of a submission) (by teachers)**************/
352 elseif ($action == 'adminlist') {
354 require_capability('mod/workshop:manage', $context);
357 error ("Workshop asssessments: adminlist called with no sid");
359 $submission = get_record("workshop_submissions", "id", $sid);
360 workshop_print_assessments_for_admin($workshop, $submission);
361 print_continue("submissions.php?action=adminlist&id=$cm->id");
365 /*********************** admin list of asssessments by a student (used by teachers only )******************/
366 elseif ($action == 'adminlistbystudent') {
368 require_capability('mod/workshop:manage', $context);
370 if (empty($userid)) {
371 error ("Workshop asssessments: adminlistbystudent called with no userid");
373 $user = get_record("user", "id", $userid);
374 workshop_print_assessments_by_user_for_admin($workshop, $user);
375 print_continue("submissions.php?action=adminlist&id=$cm->id");
379 /*************** agree (to) assessment (by student) ***************************/
380 elseif ($action == 'agreeassessment') {
382 // assessment id comes from link or hidden form variable
383 if (!$assessment = get_record("workshop_assessments", "id", $aid)) {
384 error("Assessment : agree assessment failed");
386 //save time of agreement
387 set_field("workshop_assessments", "timeagreed", $timenow, "id", $assessment->id
);
388 echo "<div style=\"text-align:center\"><b>".get_string("savedok", "workshop")."</b></div><br />\n";
390 add_to_log($course->id
, "workshop", "agree", "viewassessment.php?id=$cm->id&aid=$assessment->id", "$assessment->id");
391 print_continue("view.php?id=$cm->id");
396 /*************** display grading form (viewed by student) *********************************/
397 elseif ($action == 'displaygradingform') {
399 print_heading_with_help(get_string("specimenassessmentform", "workshop"), "specimen", "workshop");
401 workshop_print_assessment($workshop); // called with no assessment
402 print_continue("view.php?id=$cm->id");
406 /*************** edit comment on assessment (by author, assessor or teacher) ***************************/
407 elseif ($action == 'editcomment') {
409 print_heading_with_help(get_string("editacomment", "workshop"), "editingacomment", "workshop");
410 // get the comment record...
411 if (!$comment = get_record("workshop_comments", "id", $cid)) {
412 error("Edit Comment: Comment not found");
414 if (!$assessment = get_record("workshop_assessments", "id", $comment->assessmentid
)) {
415 error("Edit Comment: Assessment not found");
417 if (!$submission = get_record("workshop_submissions", "id", $assessment->submissionid
)) {
418 error("Edit Comment: Submission not found");
421 <form id
="gradingform" action
="assessments.php" method
="post">
422 <input type
="hidden" name
="action" value
="updatecomment" />
423 <input type
="hidden" name
="id" value
="<?php echo $cm->id ?>" />
424 <input type
="hidden" name
="cid" value
="<?php echo $cid ?>" />
425 <div
class="boxaligncenter">
426 <table cellpadding
="5" border
="1">
429 // now show the comment
430 echo "<tr valign=\"top\">\n";
431 echo " <td align=\"right\"><b>". get_string("comment", "workshop").":</b></td>\n";
433 echo " <textarea name=\"comments\" rows=\"5\" cols=\"75\">\n";
434 if (isset($comment->comments
)) {
435 echo $comment->comments
;
437 echo " </textarea>\n";
438 echo " </td></tr></table>\n";
439 echo "<input type=\"submit\" value=\"".get_string("savemycomment", "workshop")."\" />\n";
440 echo "</div></form>\n";
441 workshop_print_assessment($workshop, $assessment);
445 /*********************** edit assessment elements (for teachers) ***********************/
446 elseif ($action == 'editelements') {
448 require_capability('mod/workshop:manage', $context);
450 $count = count_records("workshop_grades", "workshopid", $workshop->id
);
452 notify(get_string("warningonamendingelements", "workshop"));
454 // set up heading, form and table
455 print_heading_with_help(get_string("editingassessmentelements", "workshop"), "elements", "workshop");
457 <form id
="form" method
="post" action
="assessments.php">
458 <input type
="hidden" name
="id" value
="<?php echo $cm->id ?>" />
459 <input type
="hidden" name
="action" value
="insertelements" />
460 <div
class="boxaligncenter"><table cellpadding
="5" border
="1">
463 // get existing elements, if none set up appropriate default ones
464 if ($elementsraw = get_records("workshop_elements", "workshopid", $workshop->id
, "elementno ASC" )) {
465 foreach ($elementsraw as $element) {
466 $elements[] = $element; // to renumber index 0,1,2...
469 // check for missing elements (this happens either the first time round or when the number of elements is icreased)
470 for ($i=0; $i<$workshop->nelements
; $i++
) {
471 if (!isset($elements[$i])) {
472 $elements[$i]->description
= '';
473 $elements[$i]->scale
=0;
474 $elements[$i]->maxscore
= 0;
475 $elements[$i]->weight
= 11;
479 switch ($workshop->gradingstrategy
) {
480 case 0: // no grading
481 for ($i=0; $i<$workshop->nelements
; $i++
) {
483 echo "<tr valign=\"top\">\n";
484 echo " <td align=\"right\"><b>". get_string("element","workshop")." $iplus1:</b></td>\n";
485 echo "<td><textarea name=\"description[]\" rows=\"3\" cols=\"75\">".$elements[$i]->description
."</textarea>\n";
486 echo " </td></tr>\n";
487 echo "<tr valign=\"top\">\n";
488 echo " <td colspan=\"2\" class=\"workshopassessmentheading\"> </td>\n";
493 case 1: // accumulative grading
494 // set up scales name
495 foreach ($WORKSHOP_SCALES as $KEY => $SCALE) {
496 $SCALES[] = $SCALE['name'];
498 for ($i=0; $i<$workshop->nelements
; $i++
) {
500 echo "<tr valign=\"top\">\n";
501 echo " <td align=\"right\"><b>". get_string("element","workshop")." $iplus1:</b></td>\n";
502 echo "<td><textarea name=\"description[]\" rows=\"3\" cols=\"75\">".$elements[$i]->description
."</textarea>\n";
503 echo " </td></tr>\n";
504 echo "<tr valign=\"top\">\n";
505 echo " <td align=\"right\"><b>". get_string("typeofscale", "workshop"). ":</b></td>\n";
506 echo "<td valign=\"top\">\n";
507 choose_from_menu($SCALES, "scale[]", $elements[$i]->scale
, "");
508 if ($elements[$i]->weight
== '') { // not set
509 $elements[$i]->weight
= 11; // unity
512 echo "<tr valign=\"top\"><td align=\"right\"><b>".get_string("elementweight", "workshop").":</b></td><td>\n";
513 workshop_choose_from_menu($WORKSHOP_EWEIGHTS, "weight[]", $elements[$i]->weight
, "");
516 echo "<tr valign=\"top\">\n";
517 echo " <td colspan=\"2\" class=\"workshopassessmentheading\"> </td>\n";
522 case 2: // error banded grading
523 for ($i=0; $i<$workshop->nelements
; $i++
) {
525 echo "<tr valign=\"top\">\n";
526 echo " <td align=\"right\"><b>". get_string("element","workshop")." $iplus1:</b></td>\n";
527 echo "<td><textarea name=\"description[$i]\" rows=\"3\" cols=\"75\">".$elements[$i]->description
."</textarea>\n";
528 echo " </td></tr>\n";
529 if ($elements[$i]->weight
== '') { // not set
530 $elements[$i]->weight
= 11; // unity
533 echo "<tr valign=\"top\"><td align=\"right\"><b>".get_string("elementweight", "workshop").":</b></td><td>\n";
534 workshop_choose_from_menu($WORKSHOP_EWEIGHTS, "weight[]", $elements[$i]->weight
, "");
537 echo "<tr valign=\"top\">\n";
538 echo " <td colspan=\"2\" class=\"workshopassessmentheading\"> </td>\n";
541 echo "</div></table><br />\n";
542 echo "<div style=\"text-align:center\"><b>".get_string("gradetable","workshop")."</b></div>\n";
543 echo "<div class=\"boxaligncenter\"><table cellpadding=\"5\" border=\"1\"><tr><td align=\"CENTER\">".
544 get_string("numberofnegativeresponses", "workshop");
545 echo "</td><td>". get_string("suggestedgrade", "workshop")."</td></tr>\n";
546 for ($j = $workshop->grade
; $j >= 0; $j--) {
549 for ($i=0; $i<=$workshop->nelements
; $i++
) {
550 echo "<tr><td align=\"CENTER\">$i</td><td align=\"CENTER\">";
551 if (!isset($elements[$i])) { // the "last one" will be!
552 $elements[$i]->description
= "";
553 $elements[$i]->maxscore
= 0;
555 choose_from_menu($numbers, "maxscore[$i]", $elements[$i]->maxscore
, "");
558 echo "</table></div>\n";
561 case 3: // criterion grading
562 for ($j = 100; $j >= 0; $j--) {
565 for ($i=0; $i<$workshop->nelements
; $i++
) {
567 echo "<tr valign=\"top\">\n";
568 echo " <td align=\"right\"><b>". get_string("criterion","workshop")." $iplus1:</b></td>\n";
569 echo "<td><textarea name=\"description[$i]\" rows=\"3\" cols=\"75\">".$elements[$i]->description
."</textarea>\n";
570 echo " </td></tr>\n";
571 echo "<tr><td><b>". get_string("suggestedgrade", "workshop").":</b></td><td>\n";
572 choose_from_menu($numbers, "maxscore[$i]", $elements[$i]->maxscore
, "");
574 echo "<tr valign=\"top\">\n";
575 echo " <td colspan=\"2\" class=\"workshopassessmentheading\"> </td>\n";
581 for ($j = 100; $j >= 0; $j--) {
584 if ($rubricsraw = get_records("workshop_rubrics", "workshopid", $workshop->id
)) {
585 foreach ($rubricsraw as $rubric) {
586 $rubrics[$rubric->elementno
][$rubric->rubricno
] = $rubric->description
; // reindex 0,1,2...
589 for ($i=0; $i<$workshop->nelements
; $i++
) {
591 echo "<tr valign=\"top\">\n";
592 echo " <td align=\"right\"><b>". get_string("element","workshop")." $iplus1:</b></td>\n";
593 echo "<td><textarea name=\"description[$i]\" rows=\"3\" cols=\"75\">".$elements[$i]->description
."</textarea>\n";
594 echo " </td></tr>\n";
595 echo "<tr valign=\"top\"><td align=\"right\"><b>".get_string("elementweight", "workshop").":</b></td><td>\n";
596 workshop_choose_from_menu($WORKSHOP_EWEIGHTS, "weight[]", $elements[$i]->weight
, "");
600 for ($j=0; $j<5; $j++
) {
602 if (empty($rubrics[$i][$j])) {
603 $rubrics[$i][$j] = "";
605 echo "<tr valign=\"top\">\n";
606 echo " <td align=\"right\"><b>". get_string("grade","workshop")." $j:</b></td>\n";
607 echo "<td><textarea name=\"rubric[$i][$j]\" rows=\"3\" cols=\"75\">".$rubrics[$i][$j]."</textarea>\n";
608 echo " </td></tr>\n";
610 echo "<tr valign=\"top\">\n";
611 echo " <td colspan=\"2\" class=\"workshopassessmentheading\"> </td>\n";
616 // close table and form
620 <input type
="submit" value
="<?php print_string("savechanges
") ?>" />
621 <input type
="submit" name
="cancel" value
="<?php print_string("cancel
") ?>" />
628 /*************** grade all assessments (by teacher) ***************************/
629 elseif ($action == 'gradeallassessments') {
631 require_capability('mod/workshop:manage', $context);
633 print_heading(get_string("gradingallassessments", "workshop"));
634 workshop_grade_assessments($workshop);
635 print_continue("view.php?id=$cm->id");
639 /*************** grade (student's) assessment (by teacher) ***************************/
640 elseif ($action == 'gradeassessment') {
642 require_capability('mod/workshop:manage', $context);
644 print_heading_with_help(get_string("gradeassessment", "workshop"), "gradingassessments", "workshop");
645 // get assessment record
646 if (!$assessmentid = $aid) {
647 error("Assessment id not given");
649 $assessment = get_record("workshop_assessments", "id", $assessmentid);
650 if (!$submission = get_record("workshop_submissions", "id", $assessment->submissionid
)) {
651 error("Submission not found");
653 // get the teacher's assessment first
654 if ($teachersassessment = workshop_get_submission_assessment($submission, $USER)) {
655 echo "<div style=\"text-align:center\"><b>".get_string("teacherassessments", "workshop", $course->teacher
)."</b></div>\n";
656 workshop_print_assessment($workshop, $teachersassessment);
658 // now the student's assessment (don't allow changes)
659 $user = get_record("user", "id", $assessment->userid
);
660 echo "<div style=\"text-align:center\"><b>".get_string("assessmentby", "workshop", $user->firstname
." ".$user->lastname
)."</b></div>\n";
661 workshop_print_assessment($workshop, $assessment);
663 include('assessment_grading_form.html');
668 /*************** insert (new) comment (by author, assessor or teacher) ***************************/
669 elseif ($action == 'insertcomment') {
672 $form = (object)$_POST;
674 if (!$assessment = get_record("workshop_assessments", "id", $aid)) {
675 error("Unable to insert comment");
677 // save the comment...
678 $comment->workshopid
= $workshop->id
;
679 $comment->assessmentid
= $assessment->id
;
680 $comment->userid
= $USER->id
;
681 $comment->timecreated
= $timenow;
682 $comment->comments
= clean_param($form->comments
, PARAM_CLEAN
);
683 if (!$comment->id
= insert_record("workshop_comments", $comment)) {
684 error("Could not insert workshop comment!");
687 add_to_log($course->id
, "workshop", "comment", "view.php?id=$cm->id", "$comment->id");
689 print_continue("viewassessment.php?id=$cm->id&aid=$assessment->id");
693 /*********************** insert/update assignment elements (for teachers)***********************/
694 elseif ($action == 'insertelements') {
696 require_capability('mod/workshop:manage', $context);
698 $form = data_submitted();
700 // let's not fool around here, dump the junk!
701 delete_records("workshop_elements", "workshopid", $workshop->id
);
703 // determine wich type of grading
704 switch ($workshop->gradingstrategy
) {
705 case 0: // no grading
706 // Insert all the elements that contain something
707 foreach ($form->description
as $key => $description) {
710 $element->description
= $description;
711 $element->workshopid
= $workshop->id
;
712 $element->elementno
= $key;
713 if (!$element->id
= insert_record("workshop_elements", $element)) {
714 error("Could not insert workshop element!");
720 case 1: // accumulative grading
721 // Insert all the elements that contain something
722 foreach ($form->description
as $key => $description) {
725 $element->description
= $description;
726 $element->workshopid
= $workshop->id
;
727 $element->elementno
= clean_param($key, PARAM_INT
);
728 if (isset($form->scale
[$key])) {
729 $element->scale
= $form->scale
[$key];
730 switch ($WORKSHOP_SCALES[$form->scale
[$key]]['type']) {
731 case 'radio' : $element->maxscore
= $WORKSHOP_SCALES[$form->scale
[$key]]['size'] - 1;
733 case 'selection' : $element->maxscore
= $WORKSHOP_SCALES[$form->scale
[$key]]['size'];
737 if (isset($form->weight
[$key])) {
738 $element->weight
= $form->weight
[$key];
740 if (!$element->id
= insert_record("workshop_elements", $element)) {
741 error("Could not insert workshop element!");
747 case 2: // error banded grading...
748 case 3: // ...and criterion grading
749 // Insert all the elements that contain something, the number of descriptions is one less than the number of grades
750 foreach ($form->maxscore
as $key => $themaxscore) {
752 $element->workshopid
= $workshop->id
;
753 $element->elementno
= clean_param($key, PARAM_INT
);
754 $element->maxscore
= $themaxscore;
755 if (isset($form->description
[$key])) {
756 $element->description
= $form->description
[$key];
758 if (isset($form->weight
[$key])) {
759 $element->weight
= $form->weight
[$key];
761 if (!$element->id
= insert_record("workshop_elements", $element)) {
762 error("Could not insert workshop element!");
767 case 4: // ...and criteria grading
768 // Insert all the elements that contain something
769 foreach ($form->description
as $key => $description) {
771 $element->workshopid
= $workshop->id
;
772 $element->elementno
= clean_param($key, PARAM_INT
);
773 $element->description
= $description;
774 $element->weight
= $form->weight
[$key];
775 for ($j=0;$j<5;$j++
) {
776 if (empty($form->rubric
[$key][$j]))
779 $element->maxscore
= $j - 1;
780 if (!$element->id
= insert_record("workshop_elements", $element)) {
781 error("Could not insert workshop element!");
784 // let's not fool around here, dump the junk!
785 delete_records("workshop_rubrics", "workshopid", $workshop->id
);
786 for ($i=0;$i<$workshop->nelements
;$i++
) {
787 for ($j=0;$j<5;$j++
) {
789 if (empty($form->rubric
[$i][$j])) { // OK to have an element with fewer than 5 items
792 $element->workshopid
= $workshop->id
;
793 $element->elementno
= $i;
794 $element->rubricno
= $j;
795 $element->description
= $form->rubric
[$i][$j];
796 if (!$element->id
= insert_record("workshop_rubrics", $element)) {
797 error("Could not insert workshop element!");
803 echo "</div>"; // not sure where this one came from MDL-7861
804 redirect("view.php?id=$cm->id", get_string("savedok","workshop"));
808 /*********************** list assessments for grading (Student submissions)(by teachers)***********************/
809 elseif ($action == 'listungradedstudentsubmissions') {
811 require_capability('mod/workshop:manage', $context);
813 workshop_list_ungraded_assessments($workshop, "student");
814 print_continue("view.php?id=$cm->id");
818 /*********************** list assessments for grading (Teacher submissions) (by teachers)***********************/
819 elseif ($action == 'listungradedteachersubmissions') {
821 require_capability('mod/workshop:manage', $context);
823 workshop_list_ungraded_assessments($workshop, "teacher");
824 print_continue("view.php?id=$cm->id");
828 /****************** list teacher submissions ***********************/
829 elseif ($action == 'listteachersubmissions') {
831 workshop_list_teacher_submissions($workshop, $USER);
832 print_continue("view.php?id=$cm->id");
836 /******************* regrade student assessments ************************************/
837 elseif ($action == 'regradestudentassessments' ) {
840 require_capability('mod/workshop:manage', $context);
841 // get all the submissions...
842 if ($submissions = get_records("workshop_submissions", "workshopid", $workshop->id
)) {
843 foreach ($submissions as $submission) {
845 if (($submission->timecreated +
$CFG->maxeditingtime
) < $timenow) {
846 // ...clear assessment count so workshop_grade_assessments() can do its thing
847 set_field("workshop_submissions", "nassessments", 0, "id", $submission->id
);
852 workshop_grade_assessments($workshop);
854 print_continue("submissions.php?id=$cm->id&action=adminlist");
858 /*************** remove stock comment (by teacher ) ***************************/
859 elseif ($action == 'removestockcomment') {
861 if (empty($aid) or empty($stockcommentid)) {
862 error("Workshop Assessment id and/or Stock Comment id missing");
865 require_capability('mod/workshop:manage', $context);
867 if (!$assessment = get_record("workshop_assessments", "id", $aid)) {
868 error("workshop assessment is misconfigured");
870 $form = data_submitted('nomatch'); //Nomatch because we can come from assess.php
872 // delete the comment from the stock comments table
873 if (!delete_records("workshop_stockcomments", "id", $stockcommentid)) {
874 error("Could not remove comment from the comment bank");
877 // now upate the assessment (just the elements, the assessment itself is not updated)
879 // first get the assignment elements for maxscores and weights...
880 $elementsraw = get_records("workshop_elements", "workshopid", $workshop->id
, "elementno ASC");
881 if (count($elementsraw) < $workshop->nelements
) {
882 print_string("noteonassignmentelements", "workshop");
885 foreach ($elementsraw as $element) {
886 $elements[] = $element; // to renumber index 0,1,2...
893 // don't fiddle about, delete all the old and add the new!
894 delete_records("workshop_grades", "assessmentid", $assessment->id
);
897 //determine what kind of grading we have
898 switch ($workshop->gradingstrategy
) {
899 case 0: // no grading
900 // Insert all the elements that contain something
901 for ($i =0; $i < $workshop->nelements
; $i++
) {
903 $element->workshopid
= $workshop->id
;
904 $element->assessmentid
= $assessment->id
;
905 $element->elementno
= $i;
906 $element->feedback
= clean_param($form->{"feedback_$i"}, PARAM_CLEAN
);
907 if (!$element->id
= insert_record("workshop_grades", $element)) {
908 error("Could not insert workshop grade!");
911 $grade = 0; // set to satisfy save to db
914 case 1: // accumulative grading
915 // Insert all the elements that contain something
916 foreach ($form->grade
as $key => $thegrade) {
918 $element->workshopid
= $workshop->id
;
919 $element->assessmentid
= $assessment->id
;
920 $element->elementno
= clean_param($key, PARAM_INT
);
921 $element->feedback
= clean_param($form->{"feedback_$key"}, PARAM_CLEAN
);
922 $element->grade
= $thegrade;
923 if (!$element->id
= insert_record("workshop_grades", $element)) {
924 error("Could not insert workshop grade!");
927 // now work out the grade...
930 foreach ($form->grade
as $key => $grade) {
931 $maxscore = $elements[$key]->maxscore
;
932 $weight = $WORKSHOP_EWEIGHTS[$elements[$key]->weight
];
934 $totalweight +
= $weight;
936 $rawgrade +
= ($grade / $maxscore) * $weight;
937 // echo "\$key, \$maxscore, \$weight, \$totalweight, \$grade, \$rawgrade : $key, $maxscore, $weight, $totalweight, $grade, $rawgrade<br />";
939 $grade = 100.0 * ($rawgrade / $totalweight);
942 case 2: // error banded graded
943 // Insert all the elements that contain something
945 for ($i =0; $i < $workshop->nelements
; $i++
) {
947 $element->workshopid
= $workshop->id
;
948 $element->assessmentid
= $assessment->id
;
949 $element->elementno
= $i;
950 $element->feedback
= clean_param($form->{"feedback_$i"}, PARAM_CLEAN
);
951 $element->grade
= $form->grade
[$i];
952 if (!$element->id
= insert_record("workshop_grades", $element)) {
953 error("Could not insert workshop grade!");
955 if (empty($form->grade
[$i])){
956 $error +
= $WORKSHOP_EWEIGHTS[$elements[$i]->weight
];
959 // now save the adjustment
961 $i = $workshop->nelements
;
962 $element->workshopid
= $workshop->id
;
963 $element->assessmentid
= $assessment->id
;
964 $element->elementno
= $i;
965 $element->grade
= $form->grade
[$i];
966 if (!$element->id
= insert_record("workshop_grades", $element)) {
967 error("Could not insert workshop grade!");
969 $grade = ($elements[intval($error +
0.5)]->maxscore +
$form->grade
[$i]) * 100 / $workshop->grade
;
973 } elseif ($grade > 100) {
976 echo "<b>".get_string("weightederrorcount", "workshop", intval($error +
0.5))."</b>\n";
979 case 3: // criteria grading
980 // save in the selected criteria value in element zero,
982 $element->workshopid
= $workshop->id
;
983 $element->assessmentid
= $assessment->id
;
984 $element->elementno
= 0;
985 $element->grade
= $form->grade
[0];
986 if (!$element->id
= insert_record("workshop_grades", $element)) {
987 error("Could not insert workshop grade!");
989 // now save the adjustment in element one
991 $element->workshopid
= $workshop->id
;
992 $element->assessmentid
= $assessment->id
;
993 $element->elementno
= 1;
994 $element->grade
= $form->grade
[1];
995 if (!$element->id
= insert_record("workshop_grades", $element)) {
996 error("Could not insert workshop grade!");
998 $grade = ($elements[$form->grade
[0]]->maxscore +
$form->grade
[1]);
1001 case 4: // rubric grading (identical to accumulative grading)
1002 // Insert all the elements that contain something
1003 foreach ($form->grade
as $key => $thegrade) {
1005 $element->workshopid
= $workshop->id
;
1006 $element->assessmentid
= $assessment->id
;
1007 $element->elementno
= clean_param($key, PARAM_INT
);
1008 $element->feedback
= clean_param($form->{"feedback_$key"}, PARAM_CLEAN
);
1009 $element->grade
= $thegrade;
1010 if (!$element->id
= insert_record("workshop_grades", $element)) {
1011 error("Could not insert workshop grade!");
1014 // now work out the grade...
1017 foreach ($form->grade
as $key => $grade) {
1018 $maxscore = $elements[$key]->maxscore
;
1019 $weight = $WORKSHOP_EWEIGHTS[$elements[$key]->weight
];
1021 $totalweight +
= $weight;
1023 $rawgrade +
= ($grade / $maxscore) * $weight;
1025 $grade = 100.0 * ($rawgrade / $totalweight);
1032 if (!empty($form->generalcomment
)) { // update the object (no need to update the db record)
1033 $assessment->generalcomment
= clean_param($form->generalcomment
, PARAM_CLEAN
);
1036 // redisplay form, going back to original returnto address
1037 workshop_print_assessment($workshop, $assessment, true, true, $form->returnto
);
1039 // add_to_log($course->id, "workshop", "assess", "viewassessment.php?id=$cm->id&aid=$assessment->id", "$assessment->id", "$cm->id");
1044 /*************** update assessment (by teacher or student) ***************************/
1045 elseif ($action == 'updateassessment') {
1048 error("Workshop Assessment id missing");
1051 if (! $assessment = get_record("workshop_assessments", "id", $aid)) {
1052 error("workshop assessment is misconfigured");
1055 // first get the assignment elements for maxscores and weights...
1056 $elementsraw = get_records("workshop_elements", "workshopid", $workshop->id
, "elementno ASC");
1057 if (count($elementsraw) < $workshop->nelements
) {
1058 print_string("noteonassignmentelements", "workshop");
1061 foreach ($elementsraw as $element) {
1062 $elements[] = $element; // to renumber index 0,1,2...
1069 // don't fiddle about, delete all the old and add the new!
1070 delete_records("workshop_grades", "assessmentid", $assessment->id
);
1072 $form = data_submitted('nomatch'); //Nomatch because we can come from assess.php
1074 //determine what kind of grading we have
1075 switch ($workshop->gradingstrategy
) {
1076 case 0: // no grading
1077 // Insert all the elements that contain something
1078 for ($i = 0; $i < $workshop->nelements
; $i++
) {
1080 $element->workshopid
= $workshop->id
;
1081 $element->assessmentid
= $assessment->id
;
1082 $element->elementno
= $i;
1083 $element->feedback
= clean_param($form->{"feedback_$i"}, PARAM_CLEAN
);
1084 if (!$element->id
= insert_record("workshop_grades", $element)) {
1085 error("Could not insert workshop grade!");
1088 $grade = 0; // set to satisfy save to db
1091 case 1: // accumulative grading
1092 // Insert all the elements that contain something
1093 foreach ($form->grade
as $key => $thegrade) {
1095 $element->workshopid
= $workshop->id
;
1096 $element->assessmentid
= $assessment->id
;
1097 $element->elementno
= $key;
1098 $element->feedback
= clean_param($form->{"feedback_$key"}, PARAM_CLEAN
);
1099 $element->grade
= $thegrade;
1100 if (!$element->id
= insert_record("workshop_grades", $element)) {
1101 error("Could not insert workshop grade!");
1104 // now work out the grade...
1107 foreach ($form->grade
as $key => $grade) {
1108 $maxscore = $elements[$key]->maxscore
;
1109 $weight = $WORKSHOP_EWEIGHTS[$elements[$key]->weight
];
1111 $totalweight +
= $weight;
1113 $rawgrade +
= ($grade / $maxscore) * $weight;
1114 // echo "\$key, \$maxscore, \$weight, \$totalweight, \$grade, \$rawgrade : $key, $maxscore, $weight, $totalweight, $grade, $rawgrade<br />";
1116 $grade = 100.0 * ($rawgrade / $totalweight);
1119 case 2: // error banded graded
1120 // Insert all the elements that contain something
1122 for ($i =0; $i < $workshop->nelements
; $i++
) {
1124 $element->workshopid
= $workshop->id
;
1125 $element->assessmentid
= $assessment->id
;
1126 $element->elementno
= $i;
1127 $element->feedback
= $form->{"feedback_$i"};
1128 $element->grade
= clean_param($form->grade
[$i], PARAM_CLEAN
);
1129 if (!$element->id
= insert_record("workshop_grades", $element)) {
1130 error("Could not insert workshop grade!");
1132 if (empty($form->grade
[$i])){
1133 $error +
= $WORKSHOP_EWEIGHTS[$elements[$i]->weight
];
1136 // now save the adjustment
1138 $i = $workshop->nelements
;
1139 $element->workshopid
= $workshop->id
;
1140 $element->assessmentid
= $assessment->id
;
1141 $element->elementno
= $i;
1142 $element->grade
= $form->grade
[$i];
1143 if (!$element->id
= insert_record("workshop_grades", $element)) {
1144 error("Could not insert workshop grade!");
1146 $grade = ($elements[intval($error +
0.5)]->maxscore +
$form->grade
[$i]) * 100 / $workshop->grade
;
1150 } elseif ($grade > 100) {
1153 echo "<b>".get_string("weightederrorcount", "workshop", intval($error +
0.5))."</b>\n";
1156 case 3: // criteria grading
1157 // save in the selected criteria value in element zero,
1159 $element->workshopid
= $workshop->id
;
1160 $element->assessmentid
= $assessment->id
;
1161 $element->elementno
= 0;
1162 $element->grade
= $form->grade
[0];
1163 if (!$element->id
= insert_record("workshop_grades", $element)) {
1164 error("Could not insert workshop grade!");
1166 // now save the adjustment in element one
1168 $element->workshopid
= $workshop->id
;
1169 $element->assessmentid
= $assessment->id
;
1170 $element->elementno
= 1;
1171 $element->grade
= $form->grade
[1];
1172 if (!$element->id
= insert_record("workshop_grades", $element)) {
1173 error("Could not insert workshop grade!");
1175 $grade = ($elements[$form->grade
[0]]->maxscore +
$form->grade
[1]);
1178 case 4: // rubric grading (identical to accumulative grading)
1179 // Insert all the elements that contain something
1180 foreach ($form->grade
as $key => $thegrade) {
1182 $element->workshopid
= $workshop->id
;
1183 $element->assessmentid
= $assessment->id
;
1184 $element->elementno
= clean_param($key, PARAM_INT
);
1185 $element->feedback
= clean_param($form->{"feedback_$key"}, PARAM_CLEAN
);
1186 $element->grade
= $thegrade;
1187 if (!$element->id
= insert_record("workshop_grades", $element)) {
1188 error("Could not insert workshop grade!");
1191 // now work out the grade...
1194 foreach ($form->grade
as $key => $grade) {
1195 $maxscore = $elements[$key]->maxscore
;
1196 $weight = $WORKSHOP_EWEIGHTS[$elements[$key]->weight
];
1198 $totalweight +
= $weight;
1200 $rawgrade +
= ($grade / $maxscore) * $weight;
1202 $grade = 100.0 * ($rawgrade / $totalweight);
1207 // update the time of the assessment record (may be re-edited)...
1208 set_field("workshop_assessments", "timecreated", $timenow, "id", $assessment->id
);
1210 if (!$submission = get_record("workshop_submissions", "id", $assessment->submissionid
)) {
1211 error ("Updateassessment: submission record not found");
1214 // if the workshop does need peer agreement AND it's self assessment then set timeagreed
1215 if ($workshop->agreeassessments
and ($submission->userid
== $assessment->userid
)) {
1216 set_field("workshop_assessments", "timeagreed", $timenow, "id", $assessment->id
);
1220 set_field("workshop_assessments", "grade", $grade, "id", $assessment->id
);
1221 // ...and clear the timegraded but set the graddinggrade to maximum, may be reduced subsequently...
1222 set_field("workshop_assessments", "timegraded", 0, "id", $assessment->id
);
1223 set_field("workshop_assessments", "gradinggrade", 100, "id", $assessment->id
);
1224 // ...and the resubmission flag
1225 set_field("workshop_assessments", "resubmission", 0, "id", $assessment->id
);
1227 // if there's examples or peer assessments clear the counter in the submission so that
1228 // all assessments for this submission will be regraded
1229 if ($workshop->ntassessments
or $workshop->nsassessments
) {
1230 set_field("workshop_submissions", "nassessments", 0, "id", $submission->id
);
1231 workshop_grade_assessments($workshop);
1232 } else { // it could be self assessment....
1233 // now see if there's a corresponding assessment so that the gradinggrade can be set
1234 if (workshop_is_teacher($workshop)) {
1235 // see if there's are student assessments, if so set their gradinggrade
1236 if ($assessments = workshop_get_assessments($submission)) {
1237 foreach($assessments as $studentassessment) {
1238 // skip if it's not a student assessment
1239 if (!workshop_is_student($workshop, $studentassessment->userid
)) {
1242 $gradinggrade = workshop_compare_assessments($workshop, $assessment, $studentassessment);
1243 set_field("workshop_assessments", "timegraded", $timenow, "id", $studentassessment->id
);
1244 set_field("workshop_assessments", "gradinggrade", $gradinggrade, "id", $studentassessment->id
);
1247 } else { //it's a student assessment, see if there's a corresponding teacher's assessment
1248 if ($assessments = workshop_get_assessments($submission)) {
1249 foreach($assessments as $teacherassessment) {
1250 if (workshop_is_teacher($workshop, $teacherassessment->userid
)) {
1251 $gradinggrade = workshop_compare_assessments($workshop, $assessment, $teacherassessment);
1252 set_field("workshop_assessments", "timegraded", $timenow, "id", $assessment->id
);
1253 set_field("workshop_assessments", "gradinggrade", $gradinggrade, "id", $assessment->id
);
1254 break; // only look for the first teacher assessment
1262 if (!empty($form->generalcomment
)) {
1263 set_field("workshop_assessments", "generalcomment", clean_param($form->generalcomment
, PARAM_CLEAN
), "id", $assessment->id
);
1266 add_to_log($course->id
, "workshop", "assess",
1267 "viewassessment.php?id=$cm->id&aid=$assessment->id", "$assessment->id", "$cm->id");
1269 // set up return address
1270 if (!$returnto = $form->returnto
) {
1271 $returnto = "view.php?id=$cm->id";
1274 // show grade if grading strategy is not zero
1275 if ($workshop->gradingstrategy
) {
1276 echo "</div>"; // MDL-7861, this is from <div id=page>
1277 redirect($returnto, get_string("thegradeis", "workshop").": ".
1278 number_format($grade * $workshop->grade
/ 100, 2).
1279 " (".get_string("maximumgrade")." ".number_format($workshop->grade
).")");
1282 redirect($returnto);
1288 /****************** update comment (by author, assessor or teacher) ********************/
1289 elseif ($action == 'updatecomment') {
1292 $form = (object)$_POST;
1294 // get the comment record...
1295 if (!$comment = get_record("workshop_comments", "id", $_POST['cid'])) {
1296 error("Update to Comment failed");
1298 if (!$assessment = get_record("workshop_assessments", "id", $comment->assessmentid
)) {
1299 error("Update Comment: Assessment not found");
1301 //save the comment for the assessment...
1302 if (isset($form->comments
)) {
1303 set_field("workshop_comments", "comments", $form->comments
, "id", $comment->id
);
1304 set_field("workshop_comments", "timecreated", $timenow, "id", $comment->id
);
1305 // ..and kick to comment into life (probably not needed but just in case)
1306 set_field("workshop_comments", "mailed", 0, "id", $comment->id
);
1307 echo "<centre><b>".get_string("savedok", "workshop")."</b></div><br />\n";
1309 add_to_log($course->id
, "workshop", "comment",
1310 "viewassessment.php?id=$cm->id&aid=$assessment->id", "$comment->id");
1313 print_continue("viewassessment.php?id=$cm->id&aid=$assessment->id");
1317 /****************** update grading (by teacher) ***************************/
1318 elseif ($action == 'updategrading') {
1321 require_capability('mod/workshop:manage', $context);
1323 $form = (object)$_POST;
1325 if (!$assessment = get_record("workshop_assessments", "id", $_POST['aid'])) {
1326 error("Update Grading failed");
1328 //save the comment and grade for the assessment
1329 if (isset($form->teachercomment
)) {
1330 set_field("workshop_assessments", "teachercomment", $form->teachercomment
, "id", $assessment->id
);
1331 set_field("workshop_assessments", "gradinggrade", $form->gradinggrade
, "id", $assessment->id
);
1332 set_field("workshop_assessments", "timegraded", $timenow, "id", $assessment->id
);
1333 set_field("workshop_assessments", "mailed", 0, "id", $assessment->id
);
1334 set_field("workshop_assessments", "teachergraded", 1, "id", $assessment->id
);
1335 echo "<centre><b>".get_string("savedok", "workshop")."</b></centre><br />\n";
1337 add_to_log($course->id
, "workshop", "grade",
1338 "viewassessment.php?id=$cm->id&aid=$assessment->id", "$assessment->id", "$cm->id");
1340 redirect($form->redirect
);
1344 /****************** view all assessments ***********************/
1345 elseif ($action == 'viewallassessments') {
1347 if (!$submission = get_record("workshop_submissions", "id", $sid)) {
1348 error("View All Assessments: submission record not found");
1351 if ($assessments = workshop_get_assessments($submission)) {
1352 foreach ($assessments as $assessment) {
1353 workshop_print_assessment($workshop, $assessment);
1356 // only called from list all submissions
1357 print_continue("submissions.php?action=listallsubmissions&id=$cm->id");
1360 /*************** no man's land **************************************/
1362 error("Fatal Error: Unknown Action: ".$action."\n");
1364 print_footer($course);