From: rkingdon Date: Tue, 7 Sep 2004 16:17:32 +0000 (+0000) Subject: Version 2004081100: auto grading of assessments. X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=4cd23ea295135dbdb37dd6fe409990b2611ff5dc;p=moodle.git Version 2004081100: auto grading of assessments. --- diff --git a/mod/workshop/assessments.php b/mod/workshop/assessments.php index a2b98b7175..7caff6ef31 100644 --- a/mod/workshop/assessments.php +++ b/mod/workshop/assessments.php @@ -3,27 +3,28 @@ /************************************************* ACTIONS handled are: - addcomment - adminconfirmdelete - admindelete - adminlist - agreeassessment - assesssubmission - displaygradingform - editcomment - editelements (teachers only) - gradeassessment (teachers only) - insertcomment - insertelements (for teachers) - listungradedstudentsubmissions (for teachers) - listungradedteachersubmissions (for teachers) - listteachersubmissions - updateassessment - updatecomment - updategrading - userconfirmdelete - userdelete - viewassessment + addcomment + adminconfirmdelete + admindelete + adminlist + agreeassessment + assesssubmission + displaygradingform + editcomment + editelements (teachers only) + gradeallassessments (teachers only) + gradeassessment (teachers only) + insertcomment + insertelements (for teachers) + listungradedstudentsubmissions (for teachers) + listungradedteachersubmissions (for teachers) + listteachersubmissions + updateassessment + updatecomment + updategrading + userconfirmdelete + userdelete + viewassessment ************************************************/ @@ -31,33 +32,17 @@ require("lib.php"); require("locallib.php"); - optional_variable($id); // Course Module ID - optional_variable($a); // workshop ID + require_variable($id); // Course Module ID // get some useful stuff... - if ($id) { - if (! $cm = get_record("course_modules", "id", $id)) { - error("Course Module ID was incorrect"); - } - - if (! $course = get_record("course", "id", $cm->course)) { - error("Course is misconfigured"); - } - - if (! $workshop = get_record("workshop", "id", $cm->instance)) { - error("Course module is incorrect"); - } - - } else { - if (! $workshop = get_record("workshop", "id", $a)) { - error("Course module is incorrect"); - } - if (! $course = get_record("course", "id", $workshop->course)) { - error("Course is misconfigured"); - } - if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $course->id)) { - error("Course Module ID was incorrect"); - } + if (! $cm = get_record("course_modules", "id", $id)) { + error("Course Module ID was incorrect"); + } + if (! $course = get_record("course", "id", $cm->course)) { + error("Course is misconfigured"); + } + if (! $workshop = get_record("workshop", "id", $cm->instance)) { + error("Course module is incorrect"); } require_login($course->id); @@ -72,659 +57,649 @@ $strassessments = get_string("assessments", "workshop"); // ... print the header and... - print_header("$course->shortname: $workshop->name", "$course->fullname", - "$navigation id>$strworkshops -> - id\">$workshop->name -> $strassessments", + print_header_simple("$workshop->name", "", + "id>$strworkshops -> + id\">$workshop->name -> $strassessments", "", "", true); - //...get the action - require_variable($action); - - - /*************** add comment to assessment (by author, assessor or teacher) ***************************/ - if ($action == 'addcomment') { - - print_heading_with_help(get_string("addacomment", "workshop"), "addingacomment", "workshop"); - // get assessment record - if (!$assessmentid = $_REQUEST['aid']) { // comes from link or hidden form variable - error("Assessment id not given"); - } - $assessment = get_record("workshop_assessments", "id", $assessmentid); - if (!$submission = get_record("workshop_submissions", "id", $assessment->submissionid)) { - error("Submission not found"); - } - ?> -
- - - -
- - \n"; - - echo " \n"; - - echo "

". get_string("comment", "workshop").":

\n"; - - echo " \n"; - - echo "
\n"; - echo "\n"; - echo "
\n"; - echo "

".get_string("assessment", "workshop"). "
\n"; - workshop_print_assessment($workshop, $assessment); - } - - - - /******************* admin confirm delete ************************************/ - elseif ($action == 'adminconfirmdelete' ) { - - if (!isteacher($course->id)) { - error("Only teachers can look at this page"); - } - if (empty($_GET['aid'])) { - error("Admin confirm delete: assessment id missing"); - } - - notice_yesno(get_string("confirmdeletionofthisitem","workshop", get_string("assessment", "workshop")), - "assessments.php?action=admindelete&id=$cm->id&aid=$_GET[aid]", "submissions.php?action=adminlist&id=$cm->id"); - } - - - /******************* admin delete ************************************/ - elseif ($action == 'admindelete' ) { - - if (!isteacher($course->id)) { - error("Only teachers can look at this page"); - } - if (empty($_GET['aid'])) { - error("Admin delete: submission id missing"); - } - - print_string("deleting", "workshop"); - // first delete all the associated records... - delete_records("workshop_comments", "assessmentid", $_GET['aid']); - delete_records("workshop_grades", "assessmentid", $_GET['aid']); - // ...now delete the assessment... - delete_records("workshop_assessments", "id", $_GET['aid']); - - print_continue("submissions.php?id=$cm->id&action=adminlist"); - } - - - /*********************** admin list of asssessments (of a submission) (by teachers)**************/ - elseif ($action == 'adminlist') { - - if (!isteacher($course->id)) { - error("Only teachers can look at this page"); - } - - if (empty($_GET['sid'])) { - error ("Workshop asssessments: adminlist called with no sid"); - } - $submission = get_record("workshop_submissions", "id", $_GET['sid']); - workshop_print_assessments_for_admin($workshop, $submission); - print_continue("submissions.php?action=adminlist&a=$workshop->id"); - } - - - /*********************** admin list of asssessments by a student (used by teachers only )******************/ - elseif ($action == 'adminlistbystudent') { - - if (!isteacher($course->id)) { - error("Only teachers can look at this page"); - } - - if (empty($_GET['userid'])) { - error ("Workshop asssessments: adminlistbystudent called with no userid"); - } - $user = get_record("user", "id", $_GET['userid']); - workshop_print_assessments_by_user_for_admin($workshop, $user); - print_continue("submissions.php?action=adminlist&a=$workshop->id"); - } - - - /*************** agree (to) assessment (by student) ***************************/ - elseif ($action == 'agreeassessment') { - $timenow = time(); - // assessment id comes from link or hidden form variable - if (!$assessment = get_record("workshop_assessments", "id", $_REQUEST['aid'])) { - error("Assessment : agree assessment failed"); - } - //save time of agreement - set_field("workshop_assessments", "timeagreed", $timenow, "id", $assessment->id); - echo "".get_string("savedok", "workshop")."
\n"; - - add_to_log($course->id, "workshop", "agree", "assessments.php?action=viewassessment&id=$cm->id&aid=$assessment->id", "$assessment->id"); - print_continue("view.php?id=$cm->id"); - } - - - - /*************** Assess submission (by teacher or student) ***************************/ - elseif ($action == 'assesssubmission') { - - require_variable($sid); - - optional_variable($allowcomments); - if (!isset($allowcomments)) { - $allowcomments = false; - } - - if (! $submission = get_record("workshop_submissions", "id", $sid)) { - error("Assess submission is misconfigured - no submission record!"); - } - - // there can be an assessment record (for teacher submissions), if there isn't... - if (!$assessment = get_record("workshop_assessments", "submissionid", $submission->id, "userid", + //...get the action + require_variable($action); + + + /*************** add comment to assessment (by author, assessor or teacher) ***************************/ + if ($action == 'addcomment') { + + print_heading_with_help(get_string("addacomment", "workshop"), "addingacomment", "workshop"); + // get assessment record + if (!$assessmentid = $_REQUEST['aid']) { // comes from link or hidden form variable + error("Assessment id not given"); + } + $assessment = get_record("workshop_assessments", "id", $assessmentid); + if (!$submission = get_record("workshop_submissions", "id", $assessment->submissionid)) { + error("Submission not found"); + } + ?> +
+ + + +
+ + \n"; + echo " \n"; + echo "

". get_string("comment", "workshop").":

\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo "

".get_string("assessment", "workshop"). "
\n"; + workshop_print_assessment($workshop, $assessment); + } + + + /******************* admin confirm delete ************************************/ + elseif ($action == 'adminconfirmdelete' ) { + + if (!isteacher($course->id)) { + error("Only teachers can look at this page"); + } + if (empty($_GET['aid'])) { + error("Admin confirm delete: assessment id missing"); + } + + notice_yesno(get_string("confirmdeletionofthisitem","workshop", get_string("assessment", "workshop")), + "assessments.php?action=admindelete&id=$cm->id&aid=$_GET[aid]", "submissions.php?action=adminlist&id=$cm->id"); + } + + + /******************* admin delete ************************************/ + elseif ($action == 'admindelete' ) { + + if (!isteacher($course->id)) { + error("Only teachers can look at this page"); + } + if (empty($_GET['aid'])) { + error("Admin delete: submission id missing"); + } + + print_string("deleting", "workshop"); + // first delete all the associated records... + delete_records("workshop_comments", "assessmentid", $_GET['aid']); + delete_records("workshop_grades", "assessmentid", $_GET['aid']); + // ...now delete the assessment... + delete_records("workshop_assessments", "id", $_GET['aid']); + + print_continue("submissions.php?id=$cm->id&action=adminlist"); + } + + + /*********************** admin list of asssessments (of a submission) (by teachers)**************/ + elseif ($action == 'adminlist') { + + if (!isteacher($course->id)) { + error("Only teachers can look at this page"); + } + + if (empty($_GET['sid'])) { + error ("Workshop asssessments: adminlist called with no sid"); + } + $submission = get_record("workshop_submissions", "id", $_GET['sid']); + workshop_print_assessments_for_admin($workshop, $submission); + print_continue("submissions.php?action=adminlist&id=$cm->id"); + } + + + /*********************** admin list of asssessments by a student (used by teachers only )******************/ + elseif ($action == 'adminlistbystudent') { + + if (!isteacher($course->id)) { + error("Only teachers can look at this page"); + } + + if (empty($_GET['userid'])) { + error ("Workshop asssessments: adminlistbystudent called with no userid"); + } + $user = get_record("user", "id", $_GET['userid']); + workshop_print_assessments_by_user_for_admin($workshop, $user); + print_continue("submissions.php?action=adminlist&id=$cm->id"); + } + + + /*************** agree (to) assessment (by student) ***************************/ + elseif ($action == 'agreeassessment') { + $timenow = time(); + // assessment id comes from link or hidden form variable + if (!$assessment = get_record("workshop_assessments", "id", $_REQUEST['aid'])) { + error("Assessment : agree assessment failed"); + } + //save time of agreement + set_field("workshop_assessments", "timeagreed", $timenow, "id", $assessment->id); + echo "".get_string("savedok", "workshop")."
\n"; + + add_to_log($course->id, "workshop", "agree", "assessments.php?action=viewassessment&id=$cm->id&aid=$assessment->id", "$assessment->id"); + print_continue("view.php?id=$cm->id"); + } + + + /*************** Assess submission (by teacher or student) ***************************/ + elseif ($action == 'assesssubmission') { + + require_variable($sid); + + optional_variable($allowcomments); + if (!isset($allowcomments)) { + $allowcomments = false; + } + + if (! $submission = get_record("workshop_submissions", "id", $sid)) { + error("Assess submission is misconfigured - no submission record!"); + } + + // there can be an assessment record (for teacher submissions), if there isn't... + if (!$assessment = get_record("workshop_assessments", "submissionid", $submission->id, "userid", $USER->id)) { - $yearfromnow = time() + 365 * 86400; - // ...create one and set timecreated way in the future, this is reset when record is updated - $assessment->workshopid = $workshop->id; - $assessment->submissionid = $submission->id; - $assessment->userid = $USER->id; - $assessment->grade = -1; // set impossible grade - $assessment->timecreated = $yearfromnow; - $assessment->timegraded = 0; - $assessment->timeagreed = 0; - $assessment->resubmission = 0; - if (!$assessment->id = insert_record("workshop_assessments", $assessment)) { - error("Could not insert workshop assessment!"); - } - } - - print_heading_with_help(get_string("assessthissubmission", "workshop"), "grading", "workshop"); - - // show assessment and allow changes - workshop_print_assessment($workshop, $assessment, true, $allowcomments, $_SERVER["HTTP_REFERER"]); - } - - - /*************** display grading form (viewed by student) *********************************/ - elseif ($action == 'displaygradingform') { - - print_heading_with_help(get_string("specimenassessmentform", "workshop"), "specimen", "workshop"); - - workshop_print_assessment($workshop); // called with no assessment - print_continue("view.php?a=$workshop->id"); - } - - - - /*************** edit comment on assessment (by author, assessor or teacher) ***************************/ - elseif ($action == 'editcomment') { - - print_heading_with_help(get_string("editacomment", "workshop"), "editingacomment", "workshop"); - // get the comment record... - if (!$comment = get_record("workshop_comments", "id", $_GET['cid'])) { - error("Edit Comment: Comment not found"); - } - if (!$assessment = get_record("workshop_assessments", "id", $comment->assessmentid)) { - error("Edit Comment: Assessment not found"); - } - if (!$submission = get_record("workshop_submissions", "id", $assessment->submissionid)) { - error("Edit Comment: Submission not found"); - } - ?> -
- - - -
- - \n"; - echo " \n"; - echo "

". get_string("comment", "workshop").":

\n"; - echo " \n"; - echo "
\n"; - echo "\n"; - echo "
\n"; - workshop_print_assessment($workshop, $assessment); - } - - - /*********************** edit assessment elements (for teachers) ***********************/ - elseif ($action == 'editelements') { - - if (!isteacher($course->id)) { - error("Only teachers can look at this page"); - } - - $count = count_records("workshop_grades", "workshopid", $workshop->id); - if ($workshop->phase > 1 and $count) { - notify(get_string("warningonamendingelements", "workshop")); - } - // set up heading, form and table - print_heading_with_help(get_string("editingassessmentelements", "workshop"), "elements", "workshop"); - ?> -
- - -
- id, "elementno ASC" )) { - foreach ($elementsraw as $element) { - $elements[] = $element; // to renumber index 0,1,2... - } - } - // check for missing elements (this happens either the first time round or when the number of elements is icreased) - for ($i=0; $i<$workshop->nelements; $i++) { - if (!isset($elements[$i])) { - $elements[$i]->description = ''; - $elements[$i]->scale =0; - $elements[$i]->maxscore = 0; - $elements[$i]->weight = 11; - } - } + $yearfromnow = time() + 365 * 86400; + // ...create one and set timecreated way in the future, this is reset when record is updated + $assessment->workshopid = $workshop->id; + $assessment->submissionid = $submission->id; + $assessment->userid = $USER->id; + $assessment->grade = -1; // set impossible grade + $assessment->timecreated = $yearfromnow; + $assessment->timegraded = 0; + $assessment->timeagreed = 0; + $assessment->resubmission = 0; + if (!$assessment->id = insert_record("workshop_assessments", $assessment)) { + error("Could not insert workshop assessment!"); + } + } + + print_heading_with_help(get_string("assessthissubmission", "workshop"), "grading", "workshop"); + + // show assessment and allow changes + workshop_print_assessment($workshop, $assessment, true, $allowcomments, $_SERVER["HTTP_REFERER"]); + } + + + /*************** display grading form (viewed by student) *********************************/ + elseif ($action == 'displaygradingform') { + + print_heading_with_help(get_string("specimenassessmentform", "workshop"), "specimen", "workshop"); + + workshop_print_assessment($workshop); // called with no assessment + print_continue("view.php?id=$cm->id"); + } + + + /*************** edit comment on assessment (by author, assessor or teacher) ***************************/ + elseif ($action == 'editcomment') { + + print_heading_with_help(get_string("editacomment", "workshop"), "editingacomment", "workshop"); + // get the comment record... + if (!$comment = get_record("workshop_comments", "id", $_GET['cid'])) { + error("Edit Comment: Comment not found"); + } + if (!$assessment = get_record("workshop_assessments", "id", $comment->assessmentid)) { + error("Edit Comment: Assessment not found"); + } + if (!$submission = get_record("workshop_submissions", "id", $assessment->submissionid)) { + error("Edit Comment: Submission not found"); + } + ?> + + + + +
+
+ \n"; + echo " \n"; + echo "

". get_string("comment", "workshop").":

\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + workshop_print_assessment($workshop, $assessment); + } + + + /*********************** edit assessment elements (for teachers) ***********************/ + elseif ($action == 'editelements') { + + if (!isteacher($course->id)) { + error("Only teachers can look at this page"); + } + + $count = count_records("workshop_grades", "workshopid", $workshop->id); + if ($workshop->phase > 1 and $count) { + notify(get_string("warningonamendingelements", "workshop")); + } + // set up heading, form and table + print_heading_with_help(get_string("editingassessmentelements", "workshop"), "elements", "workshop"); + ?> +
+ + +
+ id, "elementno ASC" )) { + foreach ($elementsraw as $element) { + $elements[] = $element; // to renumber index 0,1,2... + } + } + // check for missing elements (this happens either the first time round or when the number of elements is icreased) + for ($i=0; $i<$workshop->nelements; $i++) { + if (!isset($elements[$i])) { + $elements[$i]->description = ''; + $elements[$i]->scale =0; + $elements[$i]->maxscore = 0; + $elements[$i]->weight = 11; + } + } - switch ($workshop->gradingstrategy) { - case 0: // no grading - for ($i=0; $i<$workshop->nelements; $i++) { - $iplus1 = $i+1; - echo "\n"; - echo " \n"; - echo "\n"; - echo "\n"; - echo " \n"; - echo "\n"; - } - break; - - case 1: // accumulative grading - // set up scales name - foreach ($WORKSHOP_SCALES as $KEY => $SCALE) { - $SCALES[] = $SCALE['name']; - } - for ($i=0; $i<$workshop->nelements; $i++) { - $iplus1 = $i+1; - echo "\n"; - echo " \n"; - echo "\n"; - echo "\n"; - echo " \n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo " \n"; - echo "\n"; - } - break; - - case 2: // error banded grading - for ($i=0; $i<$workshop->nelements; $i++) { - $iplus1 = $i+1; - echo "\n"; - echo " \n"; - echo "\n"; - if ($elements[$i]->weight == '') { // not set - $elements[$i]->weight = 11; // unity - } - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo " \n"; - echo "\n"; - } - echo "

". get_string("element","workshop")." $iplus1:

\n"; - echo "
cellheading2\"> 

". get_string("element","workshop")." $iplus1:

\n"; - echo "

". get_string("typeofscale", "workshop"). ":

\n"; - choose_from_menu($SCALES, "scale[]", $elements[$i]->scale, ""); - if ($elements[$i]->weight == '') { // not set - $elements[$i]->weight = 11; // unity - } - echo "
".get_string("elementweight", "workshop").":\n"; - workshop_choose_from_menu($WORKSHOP_EWEIGHTS, "weight[]", $elements[$i]->weight, ""); - echo "
cellheading2\"> 

". get_string("element","workshop")." $iplus1:

\n"; - echo "
".get_string("elementweight", "workshop").":\n"; - workshop_choose_from_menu($WORKSHOP_EWEIGHTS, "weight[]", $elements[$i]->weight, ""); - echo "
cellheading2\"> 

\n"; - echo "

".get_string("gradetable","workshop")."
\n"; - echo "
\n"; - for ($j = $workshop->grade; $j >= 0; $j--) { - $numbers[$j] = $j; - } - for ($i=0; $i<=$workshop->nelements; $i++) { - echo "\n"; - } - echo "
". - get_string("numberofnegativeresponses", "workshop"); - echo "". get_string("suggestedgrade", "workshop")."
$i"; - if (!isset($elements[$i])) { // the "last one" will be! - $elements[$i]->description = ""; - $elements[$i]->maxscore = 0; - } - choose_from_menu($numbers, "maxscore[$i]", $elements[$i]->maxscore, ""); - echo "
\n"; - break; - - case 3: // criterion grading - for ($j = 100; $j >= 0; $j--) { - $numbers[$j] = $j; - } - for ($i=0; $i<$workshop->nelements; $i++) { - $iplus1 = $i+1; - echo "\n"; - echo "

". get_string("criterion","workshop")." $iplus1:\n"; - echo "\n"; - echo " \n"; - echo "". get_string("suggestedgrade", "workshop").":\n"; - choose_from_menu($numbers, "maxscore[$i]", $elements[$i]->maxscore, ""); - echo "\n"; - echo "\n"; - echo " cellheading2\"> \n"; - echo "\n"; - } - break; - - case 4: // rubric - for ($j = 100; $j >= 0; $j--) { - $numbers[$j] = $j; - } - if ($rubricsraw = get_records("workshop_rubrics", "workshopid", $workshop->id)) { - foreach ($rubricsraw as $rubric) { - $rubrics[$rubric->elementno][$rubric->rubricno] = $rubric->description; // reindex 0,1,2... - } - } - for ($i=0; $i<$workshop->nelements; $i++) { - $iplus1 = $i+1; - echo "\n"; - echo "

". get_string("element","workshop")." $iplus1:\n"; - - echo "\n"; - - echo " \n"; - echo "".get_string("elementweight", "workshop").":\n"; - workshop_choose_from_menu($WORKSHOP_EWEIGHTS, "weight[]", $elements[$i]->weight, ""); - echo " \n"; - echo "\n"; - - for ($j=0; $j<5; $j++) { - $jplus1 = $j+1; - if (empty($rubrics[$i][$j])) { - $rubrics[$i][$j] = ""; - } - echo "\n"; - - echo "

". get_string("grade","workshop")." $j:\n"; - - echo "\n"; - - echo " \n"; - } - echo "\n"; - - echo " cellheading2\"> \n"; - - echo "\n"; - } - break; - } - // close table and form - - ?> - - "> - "> -

- -
- id)) { - error("Only teachers can look at this page"); - } - - // set up coment scale - for ($i=COMMENTSCALE; $i>=0; $i--) { - $num[$i] = $i; - } - - print_heading_with_help(get_string("gradeassessment", "workshop"), "gradingassessments", "workshop"); - // get assessment record - if (!$assessmentid = $_GET['aid']) { - error("Assessment id not given"); - } - $assessment = get_record("workshop_assessments", "id", $assessmentid); - if (!$submission = get_record("workshop_submissions", "id", $assessment->submissionid)) { - error("Submission not found"); - } - // get the teacher's assessment first - if ($teachersassessment = workshop_get_submission_assessment($submission, $USER)) { - echo "

".get_string("teacherassessments", "workshop", $course->teacher)."
\n"; - workshop_print_assessment($workshop, $teachersassessment); - } - // now the student's assessment (don't allow changes) - $user = get_record("user", "id", $assessment->userid); - echo "

".get_string("assessmentby", "workshop", fullname($user))."
\n"; - workshop_print_assessment($workshop, $assessment); - - ?> -
- - - - -
- - \n"; - echo " \n"; - - echo " \n"; - - echo "\n"; - - echo "

". get_string("teacherscomment", "workshop").":

\n"; - - echo " \n"; - - echo "
".get_string("gradeforstudentsassessment", "workshop")."\n"; - choose_from_menu($num, "gradinggrade", $assessment->gradinggrade, ""); - echo "
\n"; - echo "\n"; - echo "
\n"; - } - - - - /*************** insert (new) comment (by author, assessor or teacher) ***************************/ - elseif ($action == 'insertcomment') { - $timenow = time(); - - $form = (object)$_POST; - - if (!$assessment = get_record("workshop_assessments", "id", $_POST['aid'])) { - error("Unable to insert comment"); - } - // save the comment... - $comment->workshopid = $workshop->id; - $comment->assessmentid = $assessment->id; - $comment->userid = $USER->id; - $comment->timecreated = $timenow; - $comment->comments = $form->comments; - if (!$comment->id = insert_record("workshop_comments", $comment)) { - error("Could not insert workshop comment!"); - } - - add_to_log($course->id, "workshop", "comment", "view.php?id=$cm->id", "$comment->id"); - - print_continue("assessments.php?action=viewassessment&id=$cm->id&aid=$assessment->id"); - } - - - - /*********************** insert/update assignment elements (for teachers)***********************/ - elseif ($action == 'insertelements') { - - if (!isteacher($course->id)) { - error("Only teachers can look at this page"); - } - - $form = (object)$HTTP_POST_VARS; - - // let's not fool around here, dump the junk! - delete_records("workshop_elements", "workshopid", $workshop->id); - - // determine wich type of grading - switch ($workshop->gradingstrategy) { - case 0: // no grading - // Insert all the elements that contain something - foreach ($form->description as $key => $description) { - if ($description) { - unset($element); - $element->description = $description; - $element->workshopid = $workshop->id; - $element->elementno = $key; - if (!$element->id = insert_record("workshop_elements", $element)) { - error("Could not insert workshop element!"); - } - } - } - break; - - case 1: // accumulative grading - // Insert all the elements that contain something - foreach ($form->description as $key => $description) { - if ($description) { - unset($element); - $element->description = $description; - $element->workshopid = $workshop->id; - $element->elementno = $key; - if (isset($form->scale[$key])) { - $element->scale = $form->scale[$key]; - switch ($WORKSHOP_SCALES[$form->scale[$key]]['type']) { - case 'radio' : $element->maxscore = $WORKSHOP_SCALES[$form->scale[$key]]['size'] - 1; - break; - case 'selection' : $element->maxscore = $WORKSHOP_SCALES[$form->scale[$key]]['size']; - break; - } - } - if (isset($form->weight[$key])) { - $element->weight = $form->weight[$key]; - } - if (!$element->id = insert_record("workshop_elements", $element)) { - error("Could not insert workshop element!"); - } - } - } - break; - - case 2: // error banded grading... - case 3: // ...and criterion grading - // Insert all the elements that contain something, the number of descriptions is one less than the number of grades - foreach ($form->maxscore as $key => $themaxscore) { - unset($element); - $element->workshopid = $workshop->id; - $element->elementno = $key; - $element->maxscore = $themaxscore; - if (isset($form->description[$key])) { - $element->description = $form->description[$key]; - } - if (isset($form->weight[$key])) { - $element->weight = $form->weight[$key]; - } - if (!$element->id = insert_record("workshop_elements", $element)) { - error("Could not insert workshop element!"); - } - } - break; - - case 4: // ...and criteria grading - // Insert all the elements that contain something - foreach ($form->description as $key => $description) { - unset($element); - $element->workshopid = $workshop->id; - $element->elementno = $key; - $element->description = $description; - $element->weight = $form->weight[$key]; - for ($j=0;$j<5;$j++) { - if (empty($form->rubric[$key][$j])) - break; - } - $element->maxscore = $j - 1; - if (!$element->id = insert_record("workshop_elements", $element)) { - error("Could not insert workshop element!"); - } - } - // let's not fool around here, dump the junk! - delete_records("workshop_rubrics", "workshopid", $workshop->id); - for ($i=0;$i<$workshop->nelements;$i++) { - for ($j=0;$j<5;$j++) { - unset($element); - if (empty($form->rubric[$i][$j])) { // OK to have an element with fewer than 5 items - break; - } - $element->workshopid = $workshop->id; - $element->elementno = $i; - $element->rubricno = $j; - $element->description = $form->rubric[$i][$j]; - if (!$element->id = insert_record("workshop_rubrics", $element)) { - error("Could not insert workshop element!"); - } - } - } - break; - } // end of switch - - redirect("view.php?id=$cm->id", get_string("savedok","workshop")); - } - - - /*********************** list assessments for grading (Student submissions)(by teachers)***********************/ - elseif ($action == 'listungradedstudentsubmissions') { - - if (!isteacher($course->id)) { - error("Only teachers can look at this page"); - } - workshop_list_ungraded_assessments($workshop, "student"); - print_continue("view.php?a=$workshop->id"); - } - - - /*********************** list assessments for grading (Teacher submissions) (by teachers)***********************/ - elseif ($action == 'listungradedteachersubmissions') { - - if (!isteacher($course->id)) { - error("Only teachers can look at this page"); - } - workshop_list_ungraded_assessments($workshop, "teacher"); - print_continue("view.php?a=$workshop->id"); - } - - - /****************** list teacher submissions ***********************/ - elseif ($action == 'listteachersubmissions') { - - workshop_list_teacher_submissions($workshop, $USER); - print_continue("view.php?a=$workshop->id"); - } + switch ($workshop->gradingstrategy) { + case 0: // no grading + for ($i=0; $i<$workshop->nelements; $i++) { + $iplus1 = $i+1; + echo "\n"; + echo "

". get_string("element","workshop")." $iplus1:\n"; + echo "\n"; + echo " \n"; + echo "\n"; + echo " cellheading2\"> \n"; + echo "\n"; + } + break; + + case 1: // accumulative grading + // set up scales name + foreach ($WORKSHOP_SCALES as $KEY => $SCALE) { + $SCALES[] = $SCALE['name']; + } + for ($i=0; $i<$workshop->nelements; $i++) { + $iplus1 = $i+1; + echo "\n"; + echo "

". get_string("element","workshop")." $iplus1:\n"; + echo "\n"; + echo " \n"; + echo "\n"; + echo "

". get_string("typeofscale", "workshop"). ":

\n"; + echo "\n"; + choose_from_menu($SCALES, "scale[]", $elements[$i]->scale, ""); + if ($elements[$i]->weight == '') { // not set + $elements[$i]->weight = 11; // unity + } + echo "\n"; + echo "".get_string("elementweight", "workshop").":\n"; + workshop_choose_from_menu($WORKSHOP_EWEIGHTS, "weight[]", $elements[$i]->weight, ""); + echo " \n"; + echo "\n"; + echo "\n"; + echo " cellheading2\"> \n"; + echo "\n"; + } + break; + + case 2: // error banded grading + for ($i=0; $i<$workshop->nelements; $i++) { + $iplus1 = $i+1; + echo "\n"; + echo "

". get_string("element","workshop")." $iplus1:\n"; + echo "\n"; + echo " \n"; + if ($elements[$i]->weight == '') { // not set + $elements[$i]->weight = 11; // unity + } + echo "\n"; + echo "".get_string("elementweight", "workshop").":\n"; + workshop_choose_from_menu($WORKSHOP_EWEIGHTS, "weight[]", $elements[$i]->weight, ""); + echo " \n"; + echo "\n"; + echo "\n"; + echo " cellheading2\"> \n"; + echo "\n"; + } + echo "
\n"; + echo "

".get_string("gradetable","workshop")."
\n"; + echo "
\n"; + for ($j = $workshop->grade; $j >= 0; $j--) { + $numbers[$j] = $j; + } + for ($i=0; $i<=$workshop->nelements; $i++) { + echo "\n"; + } + echo "
". + get_string("numberofnegativeresponses", "workshop"); + echo "". get_string("suggestedgrade", "workshop")."
$i"; + if (!isset($elements[$i])) { // the "last one" will be! + $elements[$i]->description = ""; + $elements[$i]->maxscore = 0; + } + choose_from_menu($numbers, "maxscore[$i]", $elements[$i]->maxscore, ""); + echo "
\n"; + break; + + case 3: // criterion grading + for ($j = 100; $j >= 0; $j--) { + $numbers[$j] = $j; + } + for ($i=0; $i<$workshop->nelements; $i++) { + $iplus1 = $i+1; + echo "\n"; + echo "

". get_string("criterion","workshop")." $iplus1:\n"; + echo "\n"; + echo " \n"; + echo "". get_string("suggestedgrade", "workshop").":\n"; + choose_from_menu($numbers, "maxscore[$i]", $elements[$i]->maxscore, ""); + echo "\n"; + echo "\n"; + echo " cellheading2\"> \n"; + echo "\n"; + } + break; + + case 4: // rubric + for ($j = 100; $j >= 0; $j--) { + $numbers[$j] = $j; + } + if ($rubricsraw = get_records("workshop_rubrics", "workshopid", $workshop->id)) { + foreach ($rubricsraw as $rubric) { + $rubrics[$rubric->elementno][$rubric->rubricno] = $rubric->description; // reindex 0,1,2... + } + } + for ($i=0; $i<$workshop->nelements; $i++) { + $iplus1 = $i+1; + echo "\n"; + echo "

". get_string("element","workshop")." $iplus1:\n"; + echo "\n"; + echo " \n"; + echo "".get_string("elementweight", "workshop").":\n"; + workshop_choose_from_menu($WORKSHOP_EWEIGHTS, "weight[]", $elements[$i]->weight, ""); + echo " \n"; + echo "\n"; + + for ($j=0; $j<5; $j++) { + $jplus1 = $j+1; + if (empty($rubrics[$i][$j])) { + $rubrics[$i][$j] = ""; + } + echo "\n"; + echo "

". get_string("grade","workshop")." $j:\n"; + echo "\n"; + echo " \n"; + } + echo "\n"; + echo " cellheading2\"> \n"; + echo "\n"; + } + break; + } + // close table and form + ?> + + "> + "> + + + id)) { + error("Only teachers can look at this page"); + } + + print_heading(get_string("gradingallassessments", "workshop")); + workshop_grade_assessments($workshop); + print_continue("view.php?id=$cm->id"); + } + + + /*************** grade (student's) assessment (by teacher) ***************************/ + elseif ($action == 'gradeassessment') { + + if (!isteacher($course->id)) { + error("Only teachers can look at this page"); + } + + // set up coment scale + for ($i=COMMENTSCALE; $i>=0; $i--) { + $num[$i] = $i; + } + + print_heading_with_help(get_string("gradeassessment", "workshop"), "gradingassessments", "workshop"); + // get assessment record + if (!$assessmentid = $_GET['aid']) { + error("Assessment id not given"); + } + $assessment = get_record("workshop_assessments", "id", $assessmentid); + if (!$submission = get_record("workshop_submissions", "id", $assessment->submissionid)) { + error("Submission not found"); + } + // get the teacher's assessment first + if ($teachersassessment = workshop_get_submission_assessment($submission, $USER)) { + echo "

".get_string("teacherassessments", "workshop", $course->teacher)."
\n"; + workshop_print_assessment($workshop, $teachersassessment); + } + // now the student's assessment (don't allow changes) + $user = get_record("user", "id", $assessment->userid); + echo "

".get_string("assessmentby", "workshop", $user->firstname." ".$user->lastname)."
\n"; + workshop_print_assessment($workshop, $assessment); + + ?> +
+ + + + +
+ + \n"; + echo " \n"; + echo " \n"; + echo "\n"; + echo "

". get_string("teacherscomment", "workshop").":

\n"; + echo " \n"; + echo "
".get_string("gradeforstudentsassessment", "workshop")."\n"; + choose_from_menu($num, "gradinggrade", $assessment->gradinggrade, ""); + echo "
\n"; + echo "\n"; + echo "
\n"; + } + + + /*************** insert (new) comment (by author, assessor or teacher) ***************************/ + elseif ($action == 'insertcomment') { + $timenow = time(); + + $form = (object)$_POST; + + if (!$assessment = get_record("workshop_assessments", "id", $_POST['aid'])) { + error("Unable to insert comment"); + } + // save the comment... + $comment->workshopid = $workshop->id; + $comment->assessmentid = $assessment->id; + $comment->userid = $USER->id; + $comment->timecreated = $timenow; + $comment->comments = $form->comments; + if (!$comment->id = insert_record("workshop_comments", $comment)) { + error("Could not insert workshop comment!"); + } + + add_to_log($course->id, "workshop", "comment", "view.php?id=$cm->id", "$comment->id"); + + print_continue("assessments.php?action=viewassessment&id=$cm->id&aid=$assessment->id"); + } + + + /*********************** insert/update assignment elements (for teachers)***********************/ + elseif ($action == 'insertelements') { + + if (!isteacher($course->id)) { + error("Only teachers can look at this page"); + } + + $form = (object)$HTTP_POST_VARS; + + // let's not fool around here, dump the junk! + delete_records("workshop_elements", "workshopid", $workshop->id); + + // determine wich type of grading + switch ($workshop->gradingstrategy) { + case 0: // no grading + // Insert all the elements that contain something + foreach ($form->description as $key => $description) { + if ($description) { + unset($element); + $element->description = $description; + $element->workshopid = $workshop->id; + $element->elementno = $key; + if (!$element->id = insert_record("workshop_elements", $element)) { + error("Could not insert workshop element!"); + } + } + } + break; + + case 1: // accumulative grading + // Insert all the elements that contain something + foreach ($form->description as $key => $description) { + if ($description) { + unset($element); + $element->description = $description; + $element->workshopid = $workshop->id; + $element->elementno = $key; + if (isset($form->scale[$key])) { + $element->scale = $form->scale[$key]; + switch ($WORKSHOP_SCALES[$form->scale[$key]]['type']) { + case 'radio' : $element->maxscore = $WORKSHOP_SCALES[$form->scale[$key]]['size'] - 1; + break; + case 'selection' : $element->maxscore = $WORKSHOP_SCALES[$form->scale[$key]]['size']; + break; + } + } + if (isset($form->weight[$key])) { + $element->weight = $form->weight[$key]; + } + if (!$element->id = insert_record("workshop_elements", $element)) { + error("Could not insert workshop element!"); + } + } + } + break; + + case 2: // error banded grading... + case 3: // ...and criterion grading + // Insert all the elements that contain something, the number of descriptions is one less than the number of grades + foreach ($form->maxscore as $key => $themaxscore) { + unset($element); + $element->workshopid = $workshop->id; + $element->elementno = $key; + $element->maxscore = $themaxscore; + if (isset($form->description[$key])) { + $element->description = $form->description[$key]; + } + if (isset($form->weight[$key])) { + $element->weight = $form->weight[$key]; + } + if (!$element->id = insert_record("workshop_elements", $element)) { + error("Could not insert workshop element!"); + } + } + break; + + case 4: // ...and criteria grading + // Insert all the elements that contain something + foreach ($form->description as $key => $description) { + unset($element); + $element->workshopid = $workshop->id; + $element->elementno = $key; + $element->description = $description; + $element->weight = $form->weight[$key]; + for ($j=0;$j<5;$j++) { + if (empty($form->rubric[$key][$j])) + break; + } + $element->maxscore = $j - 1; + if (!$element->id = insert_record("workshop_elements", $element)) { + error("Could not insert workshop element!"); + } + } + // let's not fool around here, dump the junk! + delete_records("workshop_rubrics", "workshopid", $workshop->id); + for ($i=0;$i<$workshop->nelements;$i++) { + for ($j=0;$j<5;$j++) { + unset($element); + if (empty($form->rubric[$i][$j])) { // OK to have an element with fewer than 5 items + break; + } + $element->workshopid = $workshop->id; + $element->elementno = $i; + $element->rubricno = $j; + $element->description = $form->rubric[$i][$j]; + if (!$element->id = insert_record("workshop_rubrics", $element)) { + error("Could not insert workshop element!"); + } + } + } + break; + } // end of switch + + redirect("view.php?id=$cm->id", get_string("savedok","workshop")); + } + + + /*********************** list assessments for grading (Student submissions)(by teachers)***********************/ + elseif ($action == 'listungradedstudentsubmissions') { + + if (!isteacher($course->id)) { + error("Only teachers can look at this page"); + } + workshop_list_ungraded_assessments($workshop, "student"); + print_continue("view.php?id=$cm->id"); + } + + + /*********************** list assessments for grading (Teacher submissions) (by teachers)***********************/ + elseif ($action == 'listungradedteachersubmissions') { + + if (!isteacher($course->id)) { + error("Only teachers can look at this page"); + } + workshop_list_ungraded_assessments($workshop, "teacher"); + print_continue("view.php?id=$cm->id"); + } + + + /****************** list teacher submissions ***********************/ + elseif ($action == 'listteachersubmissions') { + + workshop_list_teacher_submissions($workshop, $USER); + print_continue("view.php?id=$cm->id"); + } /*************** update assessment (by teacher or student) ***************************/ @@ -750,161 +725,167 @@ $timenow = time(); // don't fiddle about, delete all the old and add the new! - delete_records("workshop_grades", "assessmentid", $assessment->id); - - $form = (object)$HTTP_POST_VARS; - - //determine what kind of grading we have - switch ($workshop->gradingstrategy) { - case 0: // no grading - // Insert all the elements that contain something - foreach ($form->feedback as $key => $thefeedback) { - unset($element); - $element->workshopid = $workshop->id; - $element->assessmentid = $assessment->id; - $element->elementno = $key; - $element->feedback = $thefeedback; - if (!$element->id = insert_record("workshop_grades", $element)) { - error("Could not insert workshop element!"); - } - } - $grade = 0; // set to satisfy save to db - break; - - case 1: // accumulative grading - // Insert all the elements that contain something - foreach ($form->grade as $key => $thegrade) { - unset($element); - $element->workshopid = $workshop->id; - $element->assessmentid = $assessment->id; - $element->elementno = $key; - $element->feedback = $form->feedback[$key]; - $element->grade = $thegrade; - if (!$element->id = insert_record("workshop_grades", $element)) { - error("Could not insert workshop element!"); - } - } - // now work out the grade... - $rawgrade=0; - $totalweight=0; - foreach ($form->grade as $key => $grade) { - $maxscore = $elements[$key]->maxscore; - $weight = $WORKSHOP_EWEIGHTS[$elements[$key]->weight]; - if ($weight > 0) { - $totalweight += $weight; - } - $rawgrade += ($grade / $maxscore) * $weight; - // echo "\$key, \$maxscore, \$weight, \$totalweight, \$grade, \$rawgrade : $key, $maxscore, $weight, $totalweight, $grade, $rawgrade
"; - } - $grade = $workshop->grade * ($rawgrade / $totalweight); - break; - - case 2: // error banded graded - // Insert all the elements that contain something - $error = 0.0; - for ($i =0; $i < $workshop->nelements; $i++) { - unset($element); - $element->workshopid = $workshop->id; - $element->assessmentid = $assessment->id; - $element->elementno = $i; - $element->feedback = $form->feedback[$i]; - $element->grade = $form->grade[$i]; - if (!$element->id = insert_record("workshop_grades", $element)) { - error("Could not insert workshop element!"); - } - if (empty($form->grade[$i])){ - $error += $WORKSHOP_EWEIGHTS[$elements[$i]->weight]; - } - } - // now save the adjustment - unset($element); - $i = $workshop->nelements; - $element->workshopid = $workshop->id; - $element->assessmentid = $assessment->id; - $element->elementno = $i; - $element->grade = $form->grade[$i]; - if (!$element->id = insert_record("workshop_grades", $element)) { - error("Could not insert workshop element!"); - } - $grade = ($elements[intval($error + 0.5)]->maxscore + $form->grade[$i]); - echo "

".get_string("weightederrorcount", "workshop", intval($error + 0.5))."\n"; - break; - - case 3: // criteria grading - // save in the selected criteria value in element zero, - unset($element); - $element->workshopid = $workshop->id; - $element->assessmentid = $assessment->id; - $element->elementno = 0; - $element->grade = $form->grade[0]; - if (!$element->id = insert_record("workshop_grades", $element)) { - error("Could not insert workshop element!"); + delete_records("workshop_grades", "assessmentid", $assessment->id); + + $form = (object)$HTTP_POST_VARS; + + //determine what kind of grading we have + switch ($workshop->gradingstrategy) { + case 0: // no grading + // Insert all the elements that contain something + foreach ($form->feedback as $key => $thefeedback) { + unset($element); + $element->workshopid = $workshop->id; + $element->assessmentid = $assessment->id; + $element->elementno = $key; + $element->feedback = $thefeedback; + if (!$element->id = insert_record("workshop_grades", $element)) { + error("Could not insert workshop element!"); + } + } + $grade = 0; // set to satisfy save to db + break; + + case 1: // accumulative grading + // Insert all the elements that contain something + foreach ($form->grade as $key => $thegrade) { + unset($element); + $element->workshopid = $workshop->id; + $element->assessmentid = $assessment->id; + $element->elementno = $key; + $element->feedback = $form->feedback[$key]; + $element->grade = $thegrade; + if (!$element->id = insert_record("workshop_grades", $element)) { + error("Could not insert workshop element!"); + } + } + // now work out the grade... + $rawgrade=0; + $totalweight=0; + foreach ($form->grade as $key => $grade) { + $maxscore = $elements[$key]->maxscore; + $weight = $WORKSHOP_EWEIGHTS[$elements[$key]->weight]; + if ($weight > 0) { + $totalweight += $weight; + } + $rawgrade += ($grade / $maxscore) * $weight; + // echo "\$key, \$maxscore, \$weight, \$totalweight, \$grade, \$rawgrade : $key, $maxscore, $weight, $totalweight, $grade, $rawgrade
"; + } + $grade = 100.0 * ($rawgrade / $totalweight); + break; + + case 2: // error banded graded + // Insert all the elements that contain something + $error = 0.0; + for ($i =0; $i < $workshop->nelements; $i++) { + unset($element); + $element->workshopid = $workshop->id; + $element->assessmentid = $assessment->id; + $element->elementno = $i; + $element->feedback = $form->feedback[$i]; + $element->grade = $form->grade[$i]; + if (!$element->id = insert_record("workshop_grades", $element)) { + error("Could not insert workshop element!"); + } + if (empty($form->grade[$i])){ + $error += $WORKSHOP_EWEIGHTS[$elements[$i]->weight]; + } + } + // now save the adjustment + unset($element); + $i = $workshop->nelements; + $element->workshopid = $workshop->id; + $element->assessmentid = $assessment->id; + $element->elementno = $i; + $element->grade = $form->grade[$i]; + if (!$element->id = insert_record("workshop_grades", $element)) { + error("Could not insert workshop element!"); + } + $grade = ($elements[intval($error + 0.5)]->maxscore + $form->grade[$i]) * 100 / $workshop->grade; + // do sanity check + if ($grade < 0) { + $grade = 0; + } elseif ($grade > 100) { + $grade = 100; } - // now save the adjustment in element one - unset($element); - $element->workshopid = $workshop->id; - $element->assessmentid = $assessment->id; - $element->elementno = 1; - $element->grade = $form->grade[1]; - if (!$element->id = insert_record("workshop_grades", $element)) { - error("Could not insert workshop element!"); - } - $grade = ($elements[$form->grade[0]]->maxscore + $form->grade[1]) * $workshop->grade / 100; - break; - - case 4: // rubric grading (identical to accumulative grading) - // Insert all the elements that contain something - foreach ($form->grade as $key => $thegrade) { - unset($element); - $element->workshopid = $workshop->id; - $element->assessmentid = $assessment->id; - $element->elementno = $key; - $element->feedback = $form->feedback[$key]; - $element->grade = $thegrade; - if (!$element->id = insert_record("workshop_grades", $element)) { - error("Could not insert workshop element!"); - } - } - // now work out the grade... - $rawgrade=0; - $totalweight=0; - foreach ($form->grade as $key => $grade) { - $maxscore = $elements[$key]->maxscore; - $weight = $WORKSHOP_EWEIGHTS[$elements[$key]->weight]; - if ($weight > 0) { - $totalweight += $weight; - } - $rawgrade += ($grade / $maxscore) * $weight; - } - $grade = $workshop->grade * ($rawgrade / $totalweight); - break; - - } // end of switch - - // update the time of the assessment record (may be re-edited)... - set_field("workshop_assessments", "timecreated", $timenow, "id", $assessment->id); - - if (!$submission = get_record("workshop_submissions", "id", $assessment->submissionid)) { - error ("Updateassessment: submission record not found"); - } - - // if the workshop does need peer agreement AND it's self assessment then set timeagreed - if ($workshop->agreeassessments and ($submission->userid == $assessment->userid)) { - set_field("workshop_assessments", "timeagreed", $timenow, "id", $assessment->id); - } - - set_field("workshop_assessments", "grade", $grade, "id", $assessment->id); - // ...and clear any grading of this assessment... - set_field("workshop_assessments", "timegraded", 0, "id", $assessment->id); - set_field("workshop_assessments", "gradinggrade", 0, "id", $assessment->id); - // ...and the resubmission flag + echo "

".get_string("weightederrorcount", "workshop", intval($error + 0.5))."\n"; + break; + + case 3: // criteria grading + // save in the selected criteria value in element zero, + unset($element); + $element->workshopid = $workshop->id; + $element->assessmentid = $assessment->id; + $element->elementno = 0; + $element->grade = $form->grade[0]; + if (!$element->id = insert_record("workshop_grades", $element)) { + error("Could not insert workshop element!"); + } + // now save the adjustment in element one + unset($element); + $element->workshopid = $workshop->id; + $element->assessmentid = $assessment->id; + $element->elementno = 1; + $element->grade = $form->grade[1]; + if (!$element->id = insert_record("workshop_grades", $element)) { + error("Could not insert workshop element!"); + } + $grade = ($elements[$form->grade[0]]->maxscore + $form->grade[1]); + break; + + case 4: // rubric grading (identical to accumulative grading) + // Insert all the elements that contain something + foreach ($form->grade as $key => $thegrade) { + unset($element); + $element->workshopid = $workshop->id; + $element->assessmentid = $assessment->id; + $element->elementno = $key; + $element->feedback = $form->feedback[$key]; + $element->grade = $thegrade; + if (!$element->id = insert_record("workshop_grades", $element)) { + error("Could not insert workshop element!"); + } + } + // now work out the grade... + $rawgrade=0; + $totalweight=0; + foreach ($form->grade as $key => $grade) { + $maxscore = $elements[$key]->maxscore; + $weight = $WORKSHOP_EWEIGHTS[$elements[$key]->weight]; + if ($weight > 0) { + $totalweight += $weight; + } + $rawgrade += ($grade / $maxscore) * $weight; + } + $grade = 100.0 * ($rawgrade / $totalweight); + break; + + } // end of switch + + // update the time of the assessment record (may be re-edited)... + set_field("workshop_assessments", "timecreated", $timenow, "id", $assessment->id); + + if (!$submission = get_record("workshop_submissions", "id", $assessment->submissionid)) { + error ("Updateassessment: submission record not found"); + } + + // if the workshop does need peer agreement AND it's self assessment then set timeagreed + if ($workshop->agreeassessments and ($submission->userid == $assessment->userid)) { + set_field("workshop_assessments", "timeagreed", $timenow, "id", $assessment->id); + } + + set_field("workshop_assessments", "grade", $grade, "id", $assessment->id); + // ...and clear any grading of this assessment... + set_field("workshop_assessments", "timegraded", 0, "id", $assessment->id); + set_field("workshop_assessments", "gradinggrade", 0, "id", $assessment->id); + // ...and the resubmission flag set_field("workshop_assessments", "resubmission", 0, "id", $assessment->id); // any comment? - if (!empty($form->generalcomment)) { - set_field("workshop_assessments", "generalcomment", $form->generalcomment, "id", $assessment->id); - } - + if (!empty($form->generalcomment)) { + set_field("workshop_assessments", "generalcomment", $form->generalcomment, "id", $assessment->id); + } + add_to_log($course->id, "workshop", "assess", "assessments.php?action=viewassessment&id=$cm->id&aid=$assessment->id", "$assessment->id", "$cm->id"); @@ -915,7 +896,8 @@ // show grade if grading strategy is not zero if ($workshop->gradingstrategy) { - redirect($returnto, get_string("thegradeis", "workshop").": ".number_format($grade, 2). + redirect($returnto, get_string("thegradeis", "workshop").": ". + number_format($grade * $workshop->grade / 100, 2). " (".get_string("maximumgrade")." ".number_format($workshop->grade).")"); } else { @@ -1004,62 +986,62 @@ /****************** user delete ************************************/ elseif ($action == 'userdelete' ) { - if (empty($_GET['aid'])) { - error("User delete: assessment id missing"); - } - - print_string("deleting", "workshop"); - // first delete all the associated records... - delete_records("workshop_comments", "assessmentid", $_GET['aid']); - delete_records("workshop_grades", "assessmentid", $_GET['aid']); - // ...now delete the assessment... - delete_records("workshop_assessments", "id", $_GET['aid']); - - print_continue("view.php?id=$cm->id"); - } - - - /****************** view all assessments ***********************/ - elseif ($action == 'viewallassessments') { - - if (!$submission = get_record("workshop_submissions", "id", $_GET['sid'])) { - error("View All Assessments: submission record not found"); - } - - if ($assessments = workshop_get_assessments($submission)) { - foreach ($assessments as $assessment) { - workshop_print_assessment($workshop, $assessment); - } - } - // only called from list all submissions - print_continue("submissions.php?action=listallsubmissions&id=$cm->id"); - } - - - /****************** view assessment *****************************/ - elseif ($action == 'viewassessment') { - - optional_variable($allowcomments); - if (!isset($allowcomments)) { - $allowcomments = false; - } - - // get the assessment record - if (!$assessment = get_record("workshop_assessments", "id", $_GET['aid'])) { - error("Assessment record not found"); - } - - // show assessment but don't allow changes - workshop_print_assessment($workshop, $assessment, false, $allowcomments); - - print_continue("view.php?a=$workshop->id"); - } - - - /*************** no man's land **************************************/ - else { - error("Fatal Error: Unknown Action: ".$action."\n"); - } + if (empty($_GET['aid'])) { + error("User delete: assessment id missing"); + } + + print_string("deleting", "workshop"); + // first delete all the associated records... + delete_records("workshop_comments", "assessmentid", $_GET['aid']); + delete_records("workshop_grades", "assessmentid", $_GET['aid']); + // ...now delete the assessment... + delete_records("workshop_assessments", "id", $_GET['aid']); + + print_continue("view.php?id=$cm->id"); + } + + + /****************** view all assessments ***********************/ + elseif ($action == 'viewallassessments') { + + if (!$submission = get_record("workshop_submissions", "id", $_GET['sid'])) { + error("View All Assessments: submission record not found"); + } + + if ($assessments = workshop_get_assessments($submission)) { + foreach ($assessments as $assessment) { + workshop_print_assessment($workshop, $assessment); + } + } + // only called from list all submissions + print_continue("submissions.php?action=listallsubmissions&id=$cm->id"); + } + + + /****************** view assessment *****************************/ + elseif ($action == 'viewassessment') { + + optional_variable($allowcomments); + if (!isset($allowcomments)) { + $allowcomments = false; + } + + // get the assessment record + if (!$assessment = get_record("workshop_assessments", "id", $_GET['aid'])) { + error("Assessment record not found"); + } + + // show assessment but don't allow changes + workshop_print_assessment($workshop, $assessment, false, $allowcomments); + + print_continue("view.php?id=$cm->id"); + } + + + /*************** no man's land **************************************/ + else { + error("Fatal Error: Unknown Action: ".$action."\n"); + } print_footer($course); diff --git a/mod/workshop/backuplib.php b/mod/workshop/backuplib.php index 4b54353b9f..1d16030ee4 100644 --- a/mod/workshop/backuplib.php +++ b/mod/workshop/backuplib.php @@ -65,20 +65,14 @@ fwrite ($bf,full_tag("MAXBYTES",4,false,$workshop->maxbytes)); fwrite ($bf,full_tag("DEADLINE",4,false,$workshop->deadline)); fwrite ($bf,full_tag("GRADE",4,false,$workshop->grade)); + fwrite ($bf,full_tag("GRADINGGRADE",4,false,$workshop->gradinggrade)); fwrite ($bf,full_tag("NTASSESSMENTS",4,false,$workshop->ntassessments)); + fwrite ($bf,full_tag("ASSESSMENTCOMPS",4,false,$workshop->assessmentcomps)); fwrite ($bf,full_tag("NSASSESSMENTS",4,false,$workshop->nsassessments)); fwrite ($bf,full_tag("OVERALLOCATION",4,false,$workshop->overallocation)); fwrite ($bf,full_tag("TIMEMODIFIED",4,false,$workshop->timemodified)); - fwrite ($bf,full_tag("MERGEGRADES",4,false,$workshop->mergegrades)); fwrite ($bf,full_tag("TEACHERWEIGHT",4,false,$workshop->teacherweight)); - fwrite ($bf,full_tag("PEERWEIGHT",4,false,$workshop->peerweight)); - fwrite ($bf,full_tag("INCLUDETEACHERSGRADE",4,false,$workshop->includeteachersgrade)); - fwrite ($bf,full_tag("BIASWEIGHT",4,false,$workshop->biasweight)); - fwrite ($bf,full_tag("RELIABILITYWEIGHT",4,false,$workshop->reliabilityweight)); - fwrite ($bf,full_tag("GRADINGWEIGHT",4,false,$workshop->gradingweight)); fwrite ($bf,full_tag("SHOWLEAGUETABLE",4,false,$workshop->showleaguetable)); - fwrite ($bf,full_tag("TEACHERLOADING",4,false,$workshop->teacherloading)); - fwrite ($bf,full_tag("ASSESSMENTSTODROP",4,false,$workshop->assessmentstodrop)); //Now we backup workshop elements $status = backup_workshop_elements($bf,$preferences,$workshop->id); //if we've selected to backup users info, then execute backup_workshop_submisions diff --git a/mod/workshop/db/mysql.php b/mod/workshop/db/mysql.php index b1d5bcc50e..75bfcf6180 100644 --- a/mod/workshop/db/mysql.php +++ b/mod/workshop/db/mysql.php @@ -81,6 +81,19 @@ function workshop_upgrade($oldversion) { workshop_refresh_events(); } + if ($oldversion < 2004081100) { + table_column("workshop", "", "gradinggrade", "INTEGER", "4", "UNSIGNED", "0", "NOT NULL", "grade"); + table_column("workshop", "", "assessmentcomps", "INTEGER", "4", "UNSIGNED", "2", "NOT NULL", "ntassessments"); + execute_sql("ALTER TABLE `{$CFG->prefix}workshop` DROP COLUMN `gradingweight`"); + execute_sql("ALTER TABLE `{$CFG->prefix}workshop` DROP COLUMN `mergegrades`"); + execute_sql("ALTER TABLE `{$CFG->prefix}workshop` DROP COLUMN `peerweight`"); + execute_sql("ALTER TABLE `{$CFG->prefix}workshop` DROP COLUMN `includeteachersgrade`"); + execute_sql("ALTER TABLE `{$CFG->prefix}workshop` DROP COLUMN `biasweight`"); + execute_sql("ALTER TABLE `{$CFG->prefix}workshop` DROP COLUMN `reliabilityweight`"); + execute_sql("ALTER TABLE `{$CFG->prefix}workshop` DROP COLUMN `teacherloading`"); + execute_sql("ALTER TABLE `{$CFG->prefix}workshop` DROP COLUMN `assessmentstodrop`"); + } + return true; } diff --git a/mod/workshop/db/mysql.sql b/mod/workshop/db/mysql.sql index 356ff53043..bc1633a646 100644 --- a/mod/workshop/db/mysql.sql +++ b/mod/workshop/db/mysql.sql @@ -18,20 +18,14 @@ CREATE TABLE `prefix_workshop` ( `includeself` tinyint(2) unsigned NOT NULL default '0', `maxbytes` int(10) unsigned NOT NULL default '100000', `deadline` int(10) unsigned NOT NULL default '0', - `grade` int(10) NOT NULL default '0', + `grade` tinyint(3) NOT NULL default '0', + `gradinggrade` tinyint(3) NOT NULL default '0', `ntassessments` tinyint(3) unsigned NOT NULL default '0', + `assessmentcomps` tinyint(3) unsigned NOT NULL default '2', `nsassessments` tinyint(3) unsigned NOT NULL default '0', `overallocation` tinyint(3) unsigned NOT NULL default '0', `timemodified` int(10) unsigned NOT NULL default '0', - `mergegrades` tinyint(3) unsigned NOT NULL default '0', - `teacherweight` tinyint(3) unsigned NOT NULL default '5', - `peerweight` tinyint(3) unsigned NOT NULL default '5', - `includeteachersgrade` tinyint(3) unsigned NOT NULL default '0', - `biasweight` tinyint(3) unsigned NOT NULL default '5', - `reliabilityweight` tinyint(3) unsigned NOT NULL default '5', - `gradingweight` tinyint(3) unsigned NOT NULL default '5', - `teacherloading` tinyint(3) unsigned NOT NULL default '5', - `assessmentstodrop` tinyint(3) unsigned NOT NULL default '0', + `teacherweight` tinyint(3) unsigned NOT NULL default '1', `showleaguetable` tinyint(3) unsigned NOT NULL default '0', PRIMARY KEY (`id`) ) COMMENT='Defines workshop'; diff --git a/mod/workshop/index.php b/mod/workshop/index.php index a50e7acec5..e423c12abe 100644 --- a/mod/workshop/index.php +++ b/mod/workshop/index.php @@ -1,8 +1,8 @@ id)) { + $strinfo = get_string("grade"); + } else { + $strinfo = get_string("phase", "workshop"); + } $strdeadline = get_string("deadline", "workshop"); $strsubmitted = get_string("submitted", "assignment"); @@ -32,30 +36,28 @@ $timenow = time(); if ($course->format == "weeks") { - $table->head = array ($strweek, $strname, $strphase, $strsubmitted, $strdeadline); + $table->head = array ($strweek, $strname, $strinfo, $strsubmitted, $strdeadline); $table->align = array ("CENTER", "LEFT", "LEFT", "LEFT", "LEFT"); } elseif ($course->format == "topics") { - $table->head = array ($strtopic, $strname, $strphase, $strsubmitted, $strdeadline); + $table->head = array ($strtopic, $strname, $strinfo, $strsubmitted, $strdeadline); $table->align = array ("CENTER", "LEFT", "left", "LEFT", "LEFT"); } else { - $table->head = array ($strname, $strphase, $strsubmitted, $strdeadline); + $table->head = array ($strname, $strinfo, $strsubmitted, $strdeadline); $table->align = array ("LEFT", "LEFT", "LEFT", "LEFT"); } foreach ($workshops as $workshop) { switch ($workshop->phase) { case 0: - case 1: $phase = get_string("phase1short", "workshop"); - break; - case 2: $phase = get_string("phase2short", "workshop"); + case 1: $info = get_string("phase1short", "workshop"); break; - case 3: $phase = get_string("phase3short", "workshop"); + case 2: $info = get_string("phase2short", "workshop"); break; - case 4: $phase = get_string("phase4short", "workshop"); + case 3: $info = get_string("phase3short", "workshop"); break; - case 5: $phase = get_string("phase5short", "workshop"); + case 4: $info = get_string("phase4short", "workshop"); break; - case 6: $phase = get_string("phase6short", "workshop"); + case 5: $info = get_string("phase5short", "workshop"); break; } if ($submissions = workshop_get_user_submissions($workshop, $USER)) { @@ -69,18 +71,27 @@ $due = userdate($workshop->deadline); if (!$workshop->visible) { //Show dimmed if the mod is hidden - $link = "coursemodule\">$workshop->name
". - "($submission->title)"; - } else { + $link = "coursemodule\">$workshop->name
"; + } else { //Show normal if the mod is visible - $link = "coursemodule\">$workshop->name
". - "($submission->title)"; + $link = "coursemodule\">$workshop->name
"; + } + if (isstudent($course->id)) { + $link .= " ($submission->title)"; // show students the title of their submission(s) + $gradinggrade = workshop_gradinggrade($workshop, $USER); + $grade = workshop_submission_grade($workshop, $submission); + $info = get_string("gradeforassessments", "workshop").": $gradinggrade/$workshop->gradinggrade; ". + get_string("gradeforsubmission", "workshop").": $grade/$workshop->grade"; } if ($course->format == "weeks" or $course->format == "topics") { - $table->data[] = array ($workshop->section, $link, $phase, $submitted, $due); + $table->data[] = array ($workshop->section, $link, $info, $submitted, $due); } else { - $table->data[] = array ($link, $phase, $submitted, $due); + $table->data[] = array ($link, $info, $submitted, $due); + } + if (isteacher($course->id)) { + // teacher only needs to see one "submission" + break; } } } @@ -95,10 +106,10 @@ $link = "coursemodule\">$workshop->name"; } if ($course->format == "weeks" or $course->format == "topics") { - $table->data[] = array ($workshop->section, $link, $phase, $submitted, $due); + $table->data[] = array ($workshop->section, $link, $info, $submitted, $due); } else { - $table->data[] = array ($link, $phase, $submitted, $due); + $table->data[] = array ($link, $info, $submitted, $due); } } } diff --git a/mod/workshop/lib.php b/mod/workshop/lib.php index b4bed7af64..2cb311695c 100644 --- a/mod/workshop/lib.php +++ b/mod/workshop/lib.php @@ -53,9 +53,14 @@ $WORKSHOP_EWEIGHTS = array( 0 => -4.0, 1 => -2.0, 2 => -1.5, 3 => -1.0, 4 => -0 $WORKSHOP_FWEIGHTS = array( 0 => 0, 1 => 0.1, 2 => 0.25, 3 => 0.5, 4 => 0.75, 5 => 1.0, 6 => 1.5, 7 => 2.0, 8 => 3.0, 9 => 5.0, 10 => 7.5, 11=> 10.0, 12=>50.0); -if (!defined("COMMENTSCALE")) { - define("COMMENTSCALE", 20); - } + +$WORKSHOP_ASSESSMENT_COMPS = array ( + 0 => array('name' => get_string("verylax", "workshop"), 'value' => 1), + 1 => array('name' => get_string("lax", "workshop"), 'value' => 0.6), + 2 => array('name' => get_string("fair", "workshop"), 'value' => 0.4), + 3 => array('name' => get_string("strict", "workshop"), 'value' => 0.33), + 4 => array('name' => get_string("verystrict", "workshop"), 'value' => 0.2) ); + /*** Standard Moodle functions ****************** @@ -110,6 +115,15 @@ function workshop_cron () { global $CFG, $USER; + // if there any ungraded assessments run the grading routine + if ($workshops = get_records("workshop")) { + foreach ($workshops as $workshop) { + if (workshop_count_ungraded_assessments($workshop)) { + workshop_grade_assessments($workshop); + } + } + } + // Find all workshop notifications that have yet to be mailed out, and mails them $cutofftime = time() - $CFG->maxeditingtime; @@ -595,24 +609,33 @@ function workshop_delete_instance($id) { /////////////////////////////////////////////////////////////////////////////// function workshop_grades($workshopid) { /// Must return an array of grades, indexed by user, and a max grade. -/// only retruns grades in phase 6 +/// only retruns grades in phase 2 or greater global $CFG; if ($workshop = get_record("workshop", "id", $workshopid)) { - if ($workshop->phase == 6) { - if ($bestsubmissions = get_records_sql("SELECT userid, max(finalgrade) finalgrade FROM - {$CFG->prefix}workshop_submissions WHERE workshopid = $workshopid GROUP - BY userid")) { - foreach ($bestsubmissions as $bestgrade) { - $return->grades[$bestgrade->userid] = $bestgrade->finalgrade; + if ($workshop->phase > 1) { + if ($students = get_course_students($workshop->course)) { + foreach ($students as $student) { + $gradinggrade = workshop_gradinggrade($workshop, $student); + if ($submissions = workshop_get_user_submissions($workshop, $student)) { + $bestgrade = 0; + foreach ($submissions as $submission) { + $grade = workshop_submission_grade($workshop, $submission); + if ($grade > $bestgrade) { + $bestgrade = $grade; + } + } + } + $return->grades[$student->id] = $gradinggrade + $bestgrade; } } } - $return->maxgrade = $workshop->grade; + $return->maxgrade = $workshop->grade + $workshop->gradinggrade; } return $return; } +////////////////////////////////////////////////////////////////////////////////////// function workshop_is_recent_activity($course, $isteacher, $timestart) {//jlw1 added for adding mark to courses with activity in My Moodle global $CFG; @@ -999,6 +1022,70 @@ function workshop_get_participants($workshopid) { ////////////////////////////////////////////////////////////////////////////////////// // Non-standard workshop functions +/////////////////////////////////////////////////////////////////////////////////////////////// +function workshop_compare_assessments($workshop, $assessment1, $assessment2) { + global $WORKSHOP_ASSESSMENT_COMPS, $WORKSHOP_EWEIGHTS; + // first get the assignment elements for maxscores... + $elementsraw = get_records("workshop_elements", "workshopid", $workshop->id, "elementno ASC"); + foreach ($elementsraw as $element) { + $maxscore[] = $element->maxscore; // to renumber index 0,1,2... + $weight[] = $WORKSHOP_EWEIGHTS[$element->weight]; // get real value and renumber index 0,1,2... + } + for ($i = 0; $i < 2; $i++) { + if ($i) { + $rawgrades = get_records("workshop_grades", "assessmentid", $assessment1->id, "elementno ASC"); + } else { + $rawgrades = get_records("workshop_grades", "assessmentid", $assessment2->id, "elementno ASC"); + } + foreach ($rawgrades as $grade) { + $grades[$i][] = $grade->grade; + } + } + $sumdiffs = 0; + $sumweights = 0; + switch ($workshop->gradingstrategy) { + case 1 : // accumulative grading and... + case 4 : // ...rubic grading + for ($i=0; $i < $workshop->nelements; $i++) { + $diff = ($grades[0][$i] - $grades[1][$i]) * $weight[$i] / $maxscore[$i]; + $sumdiffs += $diff * $diff; // use squared distances + $sumweights += $weight[$i]; + } + break; + case 2 : // error banded grading + // ignore maxscores here, the grades are either 0 or 1, + for ($i=0; $i < $workshop->nelements; $i++) { + $diff = ($grades[0][$i] - $grades[1][$i]) * $weight[$i]; + $sumdiffs += $diff * $diff; // use squared distances + $sumweights += $weight[$i]; + } + break; + case 3 : // criterion grading + // here we only need to look at the difference between the "zero" grade elements + $diff = ($grades[0][0] - $grades[1][0]) / (count($elementsraw) - 1); + $sumdiffs = $diff * $diff; + $sumweights = 1; + break; + } + // convert to a sensible grade (always out of 100) + $COMP = (object)$WORKSHOP_ASSESSMENT_COMPS[$workshop->assessmentcomps]; + $factor = $COMP->value; + $gradinggrade = (($factor - ($sumdiffs / $sumweights)) / $factor) * 100; + if ($gradinggrade < 0) { + $gradinggrade = 0; + } + return $gradinggrade; +} + + +////////////////////////////////////////////////////////////////////////////////////// +function workshop_count_ungraded_assessments($workshop) { + // function returns the number of ungraded assessments (ANY assessments) + + return count_records("workshop_assessments", "workshopid", $workshop->id, "timegraded", 0) ; + } + + ////////////////////////////////////////////////////////////////////////////////////// function workshop_file_area($workshop, $submission) { return make_upload_directory( workshop_file_area_name($workshop, $submission) ); @@ -1059,6 +1146,24 @@ function workshop_get_assess_logs($course, $timestart) { } +////////////////////////////////////////////////////////////////////////////////////// +function workshop_get_assessments($submission, $all = '') { + // Return assessments for this submission ordered oldest first, newest last + // new assessments made within the editing time are NOT returned unless the + // second argument is set to ALL + global $CFG; + + if ($all != 'ALL') { + $timenow = time(); + return get_records_select("workshop_assessments", "(submissionid = $submission->id) AND + (timecreated < $timenow - $CFG->maxeditingtime)", "timecreated DESC"); + } else { + return get_records_select("workshop_assessments", "submissionid = $submission->id", + "timecreated DESC"); + } +} + + /////////////////////////////////////////////////////////////////////////////////////////////// function workshop_get_comment_logs($course, $timestart) { // get the "comment" entries for this user and add the first and last names (which may not be used)... @@ -1120,6 +1225,35 @@ function workshop_get_student_submission($workshop, $user) { } +////////////////////////////////////////////////////////////////////////////////////// +function workshop_get_student_submissions($workshop, $order = "title") { +// Return all ENROLLED student submissions + global $CFG; + + if ($order == "title") { + $order = "s.title"; + } + if ($order == "name") { + $order = "a.lastname, a.firstname"; + } + + // make sure it works on the site course + $select = "u.course = '$workshop->course' AND"; + $site = get_site(); + if ($workshop->course == $site->id) { + $select = ''; + } + + return get_records_sql("SELECT s.* FROM {$CFG->prefix}workshop_submissions s, + {$CFG->prefix}user_students u, {$CFG->prefix}user a + WHERE $select s.userid = u.userid + AND a.id = u.userid + AND s.workshopid = $workshop->id + AND s.timecreated > 0 + ORDER BY $order"); +} + + /////////////////////////////////////////////////////////////////////////////////////////////// function workshop_get_submit_logs($course, $timestart) { // get the "submit" entries and add the first and last names... @@ -1189,43 +1323,267 @@ function workshop_get_unmailed_resubmissions($cutofftime) { ////////////////////////////////////////////////////////////////////////////////////// -function workshop_get_student_submissions($workshop, $order = "title") { -// Return all ENROLLED student submissions - global $CFG; +function workshop_get_user_assessments($workshop, $user) { +// Return all the user's assessments, newest first, oldest last (hot, warm and cold ones) + return get_records_select("workshop_assessments", "workshopid = $workshop->id AND userid = $user->id", + "timecreated DESC"); +} + + +////////////////////////////////////////////////////////////////////////////////////// +function workshop_get_user_submissions($workshop, $user) { + // return real submissions of user newest first, oldest last. Ignores the dummy submissions + // which get created to hold the final grades for users for make no submissions) + return get_records_select("workshop_submissions", "workshopid = $workshop->id AND + userid = $user->id AND timecreated > 0", "timecreated DESC" ); +} + + +////////////////////////////////////////////////////////////////////////////////////// +function workshop_grade_assessments($workshop) { + global $WORKSHOP_EWEIGHTS; - if ($order == "title") { - $order = "s.title"; + // timeout after 10 minutes + @set_time_limit(600); + + $timenow = time(); + + // set minumim value for the variance (of the elements) + $minvar = 0.05; + + // calculate the means for each submission using just the "good" assessments + if ($submissions = get_records("workshop_submissions", "workshopid", $workshop->id)) { + foreach ($submissions as $submission) { + $nassessments[$submission->id] = 0; + if ($assessments = workshop_get_assessments($submission)) { + foreach ($assessments as $assessment) { + // test if assessment is "good", a teacher assessment always "good", but may be weighted out + if (isteacher($workshop->course, $assessment->userid)) { + if (!$workshop->teacherweight) { + // drop teacher's assessment as weight is zero + continue; + } + } elseif ((!$assessment->gradinggrade and $assessment->timegraded) or + ($workshop->agreeassessments and !$assessment->timeagreed)) { + // it's a duff assessment, or it's not been agreed + continue; + } + if (isset($num[$submission->id])) { + if (isteacher($workshop->course, $assessment->userid)) { + $num[$submission->id] += $workshop->teacherweight; // weight teacher's assessment + } else { + $num[$submission->id]++; // number of assessments + } + $nassessments[$submission->id]++; + } else { + if (isteacher($workshop->course, $assessment->userid)) { + $num[$submission->id] = $workshop->teacherweight; + } else { + $num[$submission->id] = 1; + } + $nassessments[$submission->id] = 1; + } + for ($i = 0; $i < $workshop->nelements; $i++) { + $grade = get_field("workshop_grades", "grade", + "assessmentid", $assessment->id, "elementno", $i); + if (isset($sum[$submission->id][$i])) { + if (isteacher($workshop->course, $assessment->userid)) { + $sum[$submission->id][$i] += $workshop->teacherweight * $grade; // teacher's grade + } else { + $sum[$submission->id][$i] += $grade; // student's grade + } + } else { + if (isteacher($workshop->course, $assessment->userid)) { + $sum[$submission->id][$i] = $workshop->teacherweight * $grade; // teacher's grade + } else { + $sum[$submission->id][$i] = $grade; // students's grade + } + } + } + } + } } - if ($order == "name") { - $order = "a.firstname, a.lastname"; + + if (!isset($num)) { + // no assessments yet + return; + } + reset($num); + // calculate the means for each submission + $total = 0; + foreach ($num as $submissionid => $n) { + if ($n) { // stop division by zero + for ($i = 0; $i < $workshop->nelements; $i++) { + $mean[$submissionid][$i] = $sum[$submissionid][$i] / $n; + // echo "Submission: $submissionid; Element: $i; Mean: {$mean[$submissionid][$i]}
\n"; + } + $total += $n; // weighted total + } } - if ($order == "grade") { - $order = "$workshop->teacherweight * s.teachergrade + $workshop->peerweight * s.peergrade DESC"; + echo "

".get_string("numberofsubmissions", "workshop", count($num))."
\n"; + echo get_string("numberofassessmentsweighted", "workshop", $total)."

\n"; + + // now get an estimate of the standard deviation of each element in the assessment + // this is just a rough measure, all assessments are included and teacher's assesments are not weighted + $n = 0; + for ($i = 0; $i < $workshop->nelements; $i++) { + $var[$i] = 0; + } + foreach ($submissions as $submission) { + if ($assessments = workshop_get_assessments($submission)) { + foreach ($assessments as $assessment) { + $n++; + for ($i = 0; $i < $workshop->nelements; $i++) { + $grade = get_field("workshop_grades", "grade", + "assessmentid", $assessment->id, "elementno", $i); + $temp = $mean[$submission->id][$i] - $grade; + $var[$i] += $temp * $temp; + } + } + } + } + for ($i = 0; $i < $workshop->nelements; $i++) { + $sd[$i] = sqrt($var[$i] / ($n - 1)); + echo "

".get_string("standarddeviationofelement", "workshop", $i+1)." $sd[$i]
"; + if ($sd[$i] <= $minvar) { + print_string("standarddeviationnote", "workshop")."
\n"; + } + echo "

\n"; } - // make sure it works on the site course - $select = "u.course = '$workshop->course' AND"; - if ($workshop->course == SITEID) { - $select = ''; - } + // first get the assignment elements for maxscores (not used) and weights (used)... + $elementsraw = get_records("workshop_elements", "workshopid", $workshop->id, "elementno ASC"); + foreach ($elementsraw as $element) { + $maxscore[] = $element->maxscore; // to renumber index 0,1,2... + $weight[] = $element->weight; // to renumber index 0,1,2... + } - return get_records_sql("SELECT s.* FROM {$CFG->prefix}workshop_submissions s, - {$CFG->prefix}user_students u, {$CFG->prefix}user a - WHERE $select s.userid = u.userid - AND a.id = u.userid - AND s.workshopid = $workshop->id - AND s.timecreated > 0 - ORDER BY $order"); + // ...if there are three or more assessments calculate the variance of each assessment. + // Use the variance to find the "best" assessment. (When there are two assessments they + // are both "best", we cannot distinguish between them.) + foreach ($submissions as $submission) { + if ($nassessments[$submission->id] > 2) { + if ($assessments = workshop_get_assessments($submission)) { + foreach ($assessments as $assessment) { + if ($workshop->agreeassessments and !$assessment->timeagreed) { + // ignore assessments that have not been agreed + continue; + } + $var = 0; + for ($i = 0; $i < $workshop->nelements; $i++) { + $grade = get_field("workshop_grades", "grade", + "assessmentid", $assessment->id, "elementno", $i); + if ($sd[$i] > $minvar) { + $temp = ($mean[$submission->id][$i] - $grade) * + $WORKSHOP_EWEIGHTS[$weight[$i]] / $sd[$i]; + } else { + $temp = 0; + } + $var += $temp * $temp; + } + // find the "best" assessment of each submission + if (!isset($lowest[$submission->id])) { + $lowest[$submission->id] = $var; + $bestassessment[$submission->id] = $assessment->id; + } else { + if ($lowest[$submission->id] > $var) { + $lowest[$submission->id] = $var; + $bestassessment[$submission->id] = $assessment->id; + } + } + } + } + } + } + + // run thru the submissions again setting the grading grades using the "best" as the reference + $ndrop = 0; + foreach ($submissions as $submission) { + if ($assessments = workshop_get_assessments($submission)) { + if ($nassessments[$submission->id] > 2) { + if (!$best = get_record("workshop_assessments", "id", $bestassessment[$submission->id])) { + error("Workshop assessment analysis: cannot find best assessment"); + } + foreach ($assessments as $assessment) { + if ($assessment->id == $bestassessment->id) { + // it's the best one, set the grading grade to the maximum + set_field("workshop_assessments", "gradinggrade", 100, "id", $assessment->id); + set_field("workshop_assessments", "timegraded", $timenow, "id", $assessment->id); + } else { + // it's one of the pack, compare with the best... + $gradinggrade = workshop_compare_assessments($workshop, $best, $assessment); + // ...and save the grade for the assessment + set_field("workshop_assessments", "gradinggrade", $gradinggrade, "id", $assessment->id); + set_field("workshop_assessments", "timegraded", $timenow, "id", $assessment->id); + if (!$gradinggrade) { + $ndrop++; + } + } + } + } else { // only one or two assessments, set it/both as "best" + foreach ($assessments as $assessment) { + set_field("workshop_assessments", "gradinggrade", 100, "id", $assessment->id); + set_field("workshop_assessments", "timegraded", $timenow, "id", $assessment->id); + } + } + } + } + } + echo "

".get_string("numberofassessmentsdropped", "workshop", $ndrop)."

\n"; + return; } ////////////////////////////////////////////////////////////////////////////////////// -function workshop_get_user_submissions($workshop, $user) { - // return real submissions of user newest first, oldest last. Ignores the dummy submissions - // which get created to hold the final grades for users for make no submissions) - return get_records_select("workshop_submissions", "workshopid = $workshop->id AND - userid = $user->id AND timecreated > 0", "timecreated DESC" ); +function workshop_gradinggrade($workshop, $student) { + // returns the current (external) grading grade of the based on their (cold) assessments + // (needed as it's called by grade) + + $gradinggrade = 0; + if ($assessments = workshop_get_user_assessments($workshop, $student)) { + $n = 0; + foreach ($assessments as $assessment) { + $gradinggrade += $assessment->gradinggrade; + $n++; + } + if ($n < ($workshop->ntassessments + $workshop->nsassessments)) { // the minimum students should do + $n = $workshop->ntassessments + $workshop->nsassessments; + } + $gradinggrade = $gradinggrade / $n; + } + return number_format($gradinggrade * $workshop->gradinggrade / 100, 1); } +////////////////////////////////////////////////////////////////////////////////////// +function workshop_submission_grade($workshop, $submission) { + // returns the current (external) grade of the submission based on the "good" (cold) assessments + // (needed as it's called by grade) + + $grade = 0; + if ($assessments = workshop_get_assessments($submission)) { + $n = 0; + foreach ($assessments as $assessment) { + if ($workshop->agreeassessments and !$assessment->timeagreed) { + // ignore assessments which have not been agreed + continue; + } + if ($assessment->gradinggrade or !$assessment->timegraded) { + // a good assessment (or one that has not been graded yet) + if (isteacher($workshop->course, $assessment->userid)) { + $grade += $workshop->teacherweight * $assessment->grade; + $n += $workshop->teacherweight; + } else { + $grade += $assessment->grade; + $n++; + } + } + } + if ($n) { // stop division by zero + $grade = $grade / $n; + } + } + return number_format($grade * $workshop->grade / 100, 1); +} + ?> diff --git a/mod/workshop/locallib.php b/mod/workshop/locallib.php index fb6f270294..ac1eb0473b 100644 --- a/mod/workshop/locallib.php +++ b/mod/workshop/locallib.php @@ -9,6 +9,7 @@ workshop_choose_from_menu ($options, $name, $selected="", $nothing="choose", $script="", $nothingvalue="0", $return=false) { +workshop_compare_assessments($workshop, $assessment1, $assessment2) { ---> in lib.php workshop_count_all_submissions_for_assessment($workshop, $user) { workshop_count_assessments($submission) { workshop_count_comments($assessment) { @@ -19,6 +20,7 @@ workshop_count_student_submissions_for_assessment($workshop, $user) { workshop_count_teacher_assessments($workshop, $user) { workshop_count_teacher_submissions($workshop) { workshop_count_teacher_submissions_for_assessment($workshop, $user) { +workshop_count_ungraded_assessments($workshop) { --->in lib.php workshop_count_ungraded_assessments_student($workshop) { workshop_count_ungraded_assessments_teacher($workshop) { workshop_count_user_assessments($worshop, $user, $type = "all") { $type is all, student or teacher @@ -27,26 +29,28 @@ workshop_count_user_submissions($workshop, $user) { workshop_delete_submitted_files($workshop, $submission) { workshop_delete_user_files($workshop, $user, $exception) { -workshop_file_area($workshop, $submission) { <--- in lib.php -workshop_file_area_name($workshop, $submission) { <--- in lib.php +workshop_file_area($workshop, $submission) { ---> in lib.php +workshop_file_area_name($workshop, $submission) { ---> in lib.php -workshop_get_assessments($submission) { +workshop_get_assessments($submission, $all = '') { ---> in lib.php workshop_get_comments($assessment) { workshop_get_participants($workshopid) { workshop_get_student_assessments($workshop, $user) { -workshop_get_student_submission($workshop, $user) { <--- in lib.php +workshop_get_student_submission($workshop, $user) { ---> in lib.php workshop_get_student_submission_assessments($workshop) { -workshop_get_student_submissions($workshop) { <--- in lib.php +workshop_get_student_submissions($workshop) { ---> in lib.php workshop_get_submission_assessment($submission, $user) { workshop_get_teacher_submission_assessments($workshop) { workshop_get_teacher_submissions($workshop) { workshop_get_ungraded_assessments($workshop) { workshop_get_unmailed_assessments($cutofftime) { workshop_get_unmailed_marked_assessments($cutofftime) { -workshop_get_user_assessments($workshop, $user) { -workshop_get_user_submissions($workshop, $user) { <--- in lib.php +workshop_get_user_assessments($workshop, $user) { ---> in lib.php +workshop_get_user_submissions($workshop, $user) { ---> in lib.php workshop_get_users_done($workshop) { +workshop_grade_assessments($workshop) { ---> in lib.php + workshop_list_all_submissions($workshop) { workshop_list_all_ungraded_assessments($workshop) { workshop_list_assessed_submissions($workshop, $user) { @@ -75,6 +79,8 @@ workshop_print_time_to_deadline($time) { workshop_print_upload_form($workshop) { workshop_print_user_assessments($workshop, $user) { +workshop_submission_grade($submission) { ---> in lib.php + workshop_test_user_assessments($workshop, $user) { ***************************************/ @@ -265,18 +271,40 @@ function workshop_count_student_submissions($workshop) { ////////////////////////////////////////////////////////////////////////////////////// function workshop_count_student_submissions_for_assessment($workshop, $user) { global $CFG; + + if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $workshop->course)) { + error("Course Module ID was incorrect"); + } + if (! $course = get_record("course", "id", $workshop->course)) { + error("Course is misconfigured"); + } $timenow = time(); + if (groupmode($course, $cm) == SEPARATEGROUPS) { + $groupid = get_current_group($course->id); + } else { + $groupid = 0; + } + $n = 0; if ($submissions = workshop_get_student_submissions($workshop)) { - $n =count($submissions); foreach ($submissions as $submission) { - $n -= count_records_select("workshop_assessments", "submissionid = $submission->id AND - userid = $user->id AND timecreated < $timenow - $CFG->maxeditingtime"); + // check group membership, if necessary + if ($groupid) { + // check user's group + if (!ismember($groupid, $submission->userid)) { + continue; // skip this user + } + } + // teacher assessed this submission + if (! count_records_select("workshop_assessments", "submissionid = $submission->id AND + userid = $user->id AND timecreated < $timenow - $CFG->maxeditingtime")) { + $n++; } } - return $n; } + return $n; +} ////////////////////////////////////////////////////////////////////////////////////// @@ -479,24 +507,6 @@ function workshop_delete_user_files($workshop, $user, $exception) { } -////////////////////////////////////////////////////////////////////////////////////// -function workshop_get_assessments($submission, $all = '') { - // Return assessments for this submission ordered oldest first, newest last - // new assessments made within the editing time are NOT return unless the - // second argument is set to ALL - global $CFG; - - if ($all != 'ALL') { - $timenow = time(); - return get_records_select("workshop_assessments", "(submissionid = $submission->id) AND - (timecreated < $timenow - $CFG->maxeditingtime)", "timecreated DESC"); - } else { - return get_records_select("workshop_assessments", "submissionid = $submission->id", - "timecreated DESC"); - } -} - - ////////////////////////////////////////////////////////////////////////////////////// function workshop_get_comments($assessment) { // Return all comments for this assessment provided they are newer than the assessment, @@ -639,22 +649,14 @@ function workshop_get_ungraded_assessments_teacher($workshop) { } -////////////////////////////////////////////////////////////////////////////////////// -function workshop_get_user_assessments($workshop, $user) { -// Return all the user's assessments, newest first, oldest last (hot, warm and cold ones) - return get_records_select("workshop_assessments", "workshopid = $workshop->id AND userid = $user->id", - "timecreated DESC"); -} - - ////////////////////////////////////////////////////////////////////////////////////// function workshop_get_user_assessments_done($workshop, $user) { -// Return all the user's assessments, newest first, oldest last (warm and cold ones only) +// Return all the user's assessments, oldest first, newest last (warm and cold ones only) // ignores maxeditingtime $timenow = time(); return get_records_select("workshop_assessments", "workshopid = $workshop->id AND userid = $user->id AND timecreated < $timenow", - "timecreated DESC"); + "timecreated ASC"); } @@ -682,6 +684,9 @@ function workshop_list_all_submissions($workshop, $user) { // list the teacher sublmissions first global $CFG; + if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $workshop->course)) { + error("Course Module ID was incorrect"); + } if (! $course = get_record("course", "id", $workshop->course)) { error("Course is misconfigured"); } @@ -705,7 +710,7 @@ function workshop_list_all_submissions($workshop, $user) { AND userid = $user->id")) { $curtime = time(); if (($curtime - $assessment->timecreated) > $CFG->maxeditingtime) { - $action = "id&aid=$assessment->id\">" + $action = "id&aid=$assessment->id\">" .get_string("view", "workshop").""; // has teacher graded user's assessment? if ($assessment->timegraded) { @@ -715,12 +720,12 @@ function workshop_list_all_submissions($workshop, $user) { } } else { // there's still time left to edit... - $action = "id&sid=$submission->id\">". + $action = "id&sid=$submission->id\">". get_string("edit", "workshop").""; } } else { // user has not graded this submission - $action = "id&sid=$submission->id\">". + $action = "id&sid=$submission->id\">". get_string("assess", "workshop").""; } $table->data[] = array(workshop_print_submission_title($workshop, $submission), $action, @@ -752,7 +757,7 @@ function workshop_list_all_submissions($workshop, $user) { AND userid = $user->id")) { $curtime = time(); if (($curtime - $assessment->timecreated) > $CFG->maxeditingtime) { - $action = "id&aid=$assessment->id\">". + $action = "id&aid=$assessment->id\">". get_string("view", "workshop").""; // has teacher graded on user's assessment? if ($assessment->timegraded) { @@ -762,17 +767,17 @@ function workshop_list_all_submissions($workshop, $user) { } $otherassessments = workshop_get_assessments($submission); if (count($otherassessments) > 1) { - $comment .= "id&sid=$submission->id\">". + $comment .= "id&sid=$submission->id\">". get_string("viewotherassessments", "workshop").""; } } else { // there's still time left to edit... - $action = "id&sid=$submission->id\">". + $action = "id&sid=$submission->id\">". get_string("edit", "workshop").""; } } else { // user has not assessed this submission - $action = "id&sid=$submission->id\">". + $action = "id&sid=$submission->id\">". get_string("assess", "workshop").""; } $table->data[] = array(workshop_print_submission_title($workshop, $submission), $action, @@ -787,6 +792,10 @@ function workshop_list_all_submissions($workshop, $user) { function workshop_list_all_ungraded_assessments($workshop) { // lists all the assessments for comment by teacher global $CFG; + + if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $workshop->course)) { + error("Course Module ID was incorrect"); + } $table->head = array (get_string("title", "workshop"), get_string("timeassessed", "workshop"), get_string("action", "workshop")); $table->align = array ("LEFT", "LEFT", "LEFT"); @@ -799,11 +808,11 @@ function workshop_list_all_ungraded_assessments($workshop) { foreach ($assessments as $assessment) { if (!isteacher($workshop->course, $assessment->userid)) { if (($timenow - $assessment->timegraded) < $CFG->maxeditingtime) { - $action = "id&aid=$assessment->id\">". + $action = "id&aid=$assessment->id\">". get_string("edit", "workshop").""; } else { - $action = "id&aid=$assessment->id\">". + $action = "id&aid=$assessment->id\">". get_string("gradeassessment", "workshop").""; } $submission = get_record("workshop_submissions", "id", $assessment->submissionid); @@ -823,6 +832,9 @@ function workshop_list_assessed_submissions($workshop, $user) { // list the submissions that have been assessed by this user and are COLD global $CFG; + if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $workshop->course)) { + error("Course Module ID was incorrect"); + } if (! $course = get_record("course", "id", $workshop->course)) { error("Course is misconfigured"); } @@ -842,55 +854,73 @@ function workshop_list_assessed_submissions($workshop, $user) { // 1. "hot", just created but not completed (timecreated is in the future) // 2. "warm" just created and still capable of being edited, and // 3. "cold" after the editing time + if ($assessment->timecreated < ($timenow - $CFG->maxeditingtime)) { // it's cold - $action = "id&aid=$assessment->id&". - "allowcomments=$workshop->agreeassessments\">". - get_string("view", "workshop").""; - if ($workshop->agreeassessments and !$assessment->timeagreed) { - $action .= " | id&sid=$submission->id\">". - get_string("reassess", "workshop").""; + if ($workshop->agreeassessments) { + if (!$assessment->timeagreed) { + $action = "id&aid=$assessment->id&". + "allowcomments=$workshop->agreeassessments\">". + get_string("view", "workshop").""; + $action .= " | id&sid=$submission->id\">". + get_string("reassess", "workshop").""; + } else { + $action = ""; + } + } else { + if ($assessment->timegraded) { + $action = "id&sid=$submission->id\">". + get_string("reassess", "workshop").""; + } else { + $action = "id&aid=$assessment->id\">". + get_string("view", "workshop").""; } + } if ($assessment->timecreated < $timenow) { // only show the date if it's in the past (future dates cause confusion $comment = get_string("assessedon", "workshop", userdate($assessment->timecreated)); - } + } else { $comment = ''; - } + } if ($submission->userid == $user->id) { // self assessment? $comment .= "; ".get_string("ownwork", "workshop"); // just in case they don't know! - } - // has teacher commented on user's assessment? + } + // has assessment been graded? if ($assessment->timegraded and ($timenow - $assessment->timegraded > $CFG->maxeditingtime)) { - $comment .= "; ".get_string("gradedbyteacher", "workshop", $course->teacher); - } + $comment .= "; ".get_string("thegradeforthisassessmentis", "workshop", + number_format($assessment->gradinggrade * $workshop->gradinggrade / 100, 0)). + " / $workshop->gradinggrade"; + } // if peer agrrements show whether agreement has been reached if ($workshop->agreeassessments) { if ($assessment->timeagreed) { $comment .= "; ".get_string("assessmentwasagreedon", "workshop", userdate($assessment->timeagreed)); - } + } else { $comment .= "; ".get_string("assessmentnotyetagreed", "workshop"); - } } + } $table->data[] = array(workshop_print_submission_title($workshop, $submission), $action, $comment); - } } } + } if (isset($table->data)) { print_table($table); - } + } else { echo "
".get_string("noassessmentsdone", "workshop")."
\n"; - } } +} ////////////////////////////////////////////////////////////////////////////////////// function workshop_list_peer_assessments($workshop, $user) { global $CFG; + if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $workshop->course)) { + error("Course Module ID was incorrect"); + } if (! $course = get_record("course", "id", $workshop->course)) { error("Course is misconfigured"); } @@ -912,17 +942,23 @@ function workshop_list_peer_assessments($workshop, $user) { ($assessment->userid != $user->id)) { $timenow = time(); if (($timenow - $assessment->timecreated) > $CFG->maxeditingtime) { - $action = "id&aid=$assessment->id&". + $action = "id&aid=$assessment->id&". "allowcomments=$workshop->agreeassessments\">". get_string("view", "workshop").""; - $comment = get_string("assessedon", "workshop", - userdate($assessment->timecreated)); - // has teacher commented on user's assessment? - if ($assessment->timegraded and - ($timenow - $assessment->timegraded > $CFG->maxeditingtime)) { - $comment .= "; ".get_string("gradedbyteacher", "workshop", $course->teacher); + $comment = get_string("assessedon", "workshop", userdate($assessment->timecreated)); + $grade = number_format($assessment->grade * $workshop->grade / 100, 1); + $comment .= "; ".get_string("gradeforsubmission", "workshop"). + ": $grade / $workshop->grade"; + if ($assessment->timegraded) { + if (!$assessment->gradinggrade) { + // it's a bad assessment + $comment .= "; ".get_string("thisisadroppedassessment", "workshop"); } - // if peer agrrements show whether agreement has been reached + } + if (isteacher($workshop->course, $assessment->userid) and $workshop->teacherweight) { + $comment .= "; ".get_string("thisisadroppedassessment", "workshop"); + } + // if peer agreements show whether agreement has been reached if ($workshop->agreeassessments) { if ($assessment->timeagreed) { $comment .= "; ".get_string("assessmentwasagreedon", "workshop", @@ -955,6 +991,9 @@ function workshop_list_self_assessments($workshop, $user) { // list user's submissions for the user to assess global $CFG; + if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $workshop->course)) { + error("Course Module ID was incorrect"); + } if (! $course = get_record("course", "id", $workshop->course)) { error("Course is misconfigured"); } @@ -974,7 +1013,7 @@ function workshop_list_self_assessments($workshop, $user) { if ($submission->userid == $user->id) { // this will always be true $comment = get_string("ownwork", "workshop"); // just in case they don't know! } - $action = "id&sid=$submission->id\">". + $action = "id&sid=$submission->id\">". get_string("assess", "workshop").""; $table->data[] = array(workshop_print_submission_title($workshop, $submission), $action, $comment); } @@ -994,12 +1033,20 @@ function workshop_list_student_submissions($workshop, $user) { // of assessments are show first global $CFG; - $timenow = time(); + if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $workshop->course)) { + error("Course Module ID was incorrect"); + } if (! $course = get_record("course", "id", $workshop->course)) { error("Course is misconfigured"); } - if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $course->id)) { - error("Course Module ID was incorrect"); + + $timenow = time(); + + // set student's group if workshop is in SEPARATEGROUPS mode + if (groupmode($course, $cm) == SEPARATEGROUPS) { + $groupid = get_current_group($course->id); + } else { + $groupid = 0; } $table->head = array (get_string("title", "workshop"), get_string("action", "workshop"), get_string("comment", "workshop")); @@ -1017,6 +1064,13 @@ function workshop_list_student_submissions($workshop, $user) { if ($submissions = workshop_get_student_submissions($workshop)) { // srand ((float)microtime()*1000000); // now done automatically in PHP 4.2.0-> foreach ($submissions as $submission) { + // check group membership, if necessary + if ($groupid) { + // check user's group + if (!ismember($groupid, $submission->userid)) { + continue; // skip this submission + } + } // process only cold submissions if (($submission->timecreated + $CFG->maxeditingtime) > $timenow) { continue; @@ -1108,114 +1162,74 @@ function workshop_list_submissions_for_admin($workshop, $order) { // list the teacher sublmissions first global $CFG, $USER; + if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $workshop->course)) { + error("Course Module ID was incorrect"); + } if (! $course = get_record("course", "id", $workshop->course)) { error("Course is misconfigured"); } if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $course->id)) { error("Course Module ID was incorrect"); } - - workshop_print_assignment_info($workshop); - - // if peer assessments allow teacher to change overallocation option - if ($workshop->nsassessments) { - print_simple_box_start("center"); - print_heading_with_help(get_string("setoverallocation", "workshop"), "overallocation", "workshop"); - echo "
\n"; - echo "id\">\n"; - echo "\n"; - echo "
\n"; - echo "\n"; - echo "

".get_string("overallocation", "workshop").":

\n"; - for ($i=2; $i>=0; $i--) { - $numbers[$i] = $i; - } - choose_from_menu($numbers, "overallocation", "$workshop->overallocation", ""); - echo "

\n"; - echo "\n"; - echo "
\n"; - print_simple_box_end(); - } - - echo "
"; - print_simple_box_start("center"); - print_heading_with_help(get_string("leaguetable", "workshop"), "leaguetable", "workshop"); - echo "
\n"; - echo "id\">\n"; - echo "\n"; - echo "
\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "

".get_string("numberofentries", "workshop").":

"; - unset($numbers); - $numbers[22] = 'All'; - $numbers[21] = 50; - for ($i=20; $i>=0; $i--) { - $numbers[$i] = $i; + if (groupmode($course, $cm) == SEPARATEGROUPS) { + $groupid = get_current_group($course->id); + } else { + $groupid = 0; } - $nentries = $workshop->showleaguetable; - if ($nentries == 99) { - $nentries = 'All'; - } - choose_from_menu($numbers, "nentries", "$nentries", ""); - echo "

".get_string("hidenamesfromstudents", "workshop", $course->students)."

\n"; - $options[0] = get_string("no"); $options[1] = get_string("yes"); - choose_from_menu($options, "anonymous", $workshop->anonymous, ""); - echo "

\n"; - echo "\n"; - echo "
\n"; - print_simple_box_end(); + + workshop_print_assignment_info($workshop); - // list any teacher submissions - $table->head = array (get_string("title", "workshop"), get_string("submittedby", "workshop"), get_string("action", "workshop")); - $table->align = array ("left", "left", "left"); - $table->size = array ("*", "*", "*"); - $table->cellpadding = 2; - $table->cellspacing = 0; + if (isteacheredit($course->id)) { + // list any teacher submissions + $table->head = array (get_string("title", "workshop"), get_string("submittedby", "workshop"), + get_string("action", "workshop")); + $table->align = array ("left", "left", "left"); + $table->size = array ("*", "*", "*"); + $table->cellpadding = 2; + $table->cellspacing = 0; - if ($submissions = workshop_get_teacher_submissions($workshop)) { - foreach ($submissions as $submission) { - $action = "id&sid=$submission->id\">". - get_string("amendtitle", "workshop").""; - // has user already assessed this submission - if ($assessment = get_record_select("workshop_assessments", "submissionid = $submission->id - AND userid = $USER->id")) { - $curtime = time(); + if ($submissions = workshop_get_teacher_submissions($workshop)) { + foreach ($submissions as $submission) { + $action = "id&sid=$submission->id\">". + get_string("amendtitle", "workshop").""; + // has user already assessed this submission + if ($assessment = get_record_select("workshop_assessments", "submissionid = $submission->id + AND userid = $USER->id")) { + $curtime = time(); if ($assessment->timecreated > $curtime) { // it's a "hanging" assessment - $action .= " | id&sid=$submission->id\">". + $action .= " | id&sid=$submission->id\">". get_string("assess", "workshop").""; } elseif (($curtime - $assessment->timecreated) > $CFG->maxeditingtime) { - $action .= " | id&sid=$submission->id\">" + $action .= " | id&sid=$submission->id\">" .get_string("reassess", "workshop").""; } else { // there's still time left to edit... - $action .= " | id&sid=$submission->id\">". + $action .= " | id&sid=$submission->id\">". get_string("edit", "workshop").""; } } - else { // user has not graded this submission - $action .= " | id&sid=$submission->id\">". - get_string("assess", "workshop").""; - } - if ($assessments = workshop_get_assessments($submission)) { - $action .= " | id&sid=$submission->id\">". - get_string("listassessments", "workshop").""; + else { // user has not graded this submission + $action .= " | id&sid=$submission->id\">". + get_string("assess", "workshop").""; } - $action .= " | id&sid=$submission->id\">". + if ($assessments = workshop_get_assessments($submission)) { + $action .= " | id&sid=$submission->id\">". + get_string("listassessments", "workshop").""; + } + $action .= " | id&sid=$submission->id\">". get_string("delete", "workshop").""; - $table->data[] = array(workshop_print_submission_title($workshop, $submission), $course->teacher, $action); + $table->data[] = array(workshop_print_submission_title($workshop, $submission), $course->teacher, $action); + } + print_heading(get_string("studentsubmissions", "workshop", $course->teacher), "center"); + print_table($table); } - print_heading(get_string("studentsubmissions", "workshop", $course->teacher), "center"); - print_table($table); } // list student assessments // Get all the students... - if ($users = get_course_students($course->id, "u.firstname, u.lastname")) { + if ($users = get_course_students($course->id, "u.lastname, u.firstname")) { $timenow = time(); - print_heading(get_string("studentassessments", "workshop", $course->student)); unset($table); $table->head = array(get_string("name"), get_string("title", "workshop"), get_string("action", "workshop")); $table->align = array ("left", "left", "left"); @@ -1223,6 +1237,13 @@ function workshop_list_submissions_for_admin($workshop, $order) { $table->cellpadding = 2; $table->cellspacing = 0; foreach ($users as $user) { + // check group membership, if necessary + if ($groupid) { + // check user's group + if (!ismember($groupid, $user->id)) { + continue; // skip this user + } + } // list the assessments which have been done (exclude the hot ones) if ($assessments = workshop_get_user_assessments_done($workshop, $user)) { $title =''; @@ -1231,22 +1252,24 @@ function workshop_list_submissions_for_admin($workshop, $order) { error("Workshop_list_submissions_for_admin: Submission record not found!"); } $title .= $submission->title; - // test for allocated assesments which have not been done - if ($assessment->timecreated < $timenow) { - $title .= " {".number_format($assessment->grade, 0); - } - else { // assessment record created but user has not yet assessed this submission - $title .= " {-"; - } if ($assessment->timegraded) { - $title .= "/".number_format($assessment->gradinggrade * 100 / COMMENTSCALE, 0)."%"; + if ($assessment->gradinggrade) { + // a good assessment + $title .= " {".number_format($assessment->grade * $workshop->grade / 100, 0)." (". + number_format($assessment->gradinggrade * $workshop->gradinggrade / 100, 0).")} "; + } else { + // a poor assessment + $title .= " <".number_format($assessment->grade * $workshop->grade / 100, 0)." (". + number_format($assessment->gradinggrade * $workshop->gradinggrade / 100, 0).")> "; + } + } else { + // not yet graded + $title .= " {".number_format($assessment->grade * $workshop->grade / 100, 0)." (-)} "; } - $title .= "} "; if ($realassessments = workshop_count_user_assessments_done($workshop, $user)) { - $action = "id&userid=$user->id\">". + $action = "id&userid=$user->id\">". get_string("liststudentsassessments", "workshop")." ($realassessments)"; - } - else { + } else { $action =""; } } @@ -1254,6 +1277,35 @@ function workshop_list_submissions_for_admin($workshop, $order) { } } if (isset($table->data)) { + print_heading(get_string("studentassessments", "workshop", $course->student)); + print_table($table); + workshop_print_key($workshop); + // grading grade analysis + unset($table); + $table->head = array (get_string("count", "workshop"), get_string("mean", "workshop"), + get_string("standarddeviation", "workshop"), get_string("maximum", "workshop"), + get_string("minimum", "workshop")); + $table->align = array ("center", "center", "center", "center", "center"); + $table->size = array ("*", "*", "*", "*", "*"); + $table->cellpadding = 2; + $table->cellspacing = 0; + if ($groupid) { + $stats = get_record_sql("SELECT COUNT(*) as count, AVG(gradinggrade) AS mean, + STDDEV(gradinggrade) AS stddev, MIN(gradinggrade) AS min, MAX(gradinggrade) AS max + FROM {$CFG->prefix}groups_members g, {$CFG->prefix}workshop_assessments a + WHERE g.groupid = $groupid AND a.userid = g.userid AND a.timegraded > 0 + AND a.workshopid = $workshop->id"); + } else { // no group/all participants + $stats = get_record_sql("SELECT COUNT(*) as count, AVG(gradinggrade) AS mean, + STDDEV(gradinggrade) AS stddev, MIN(gradinggrade) AS min, MAX(gradinggrade) AS max + FROM {$CFG->prefix}workshop_assessments a + WHERE a.timegraded > 0 AND a.workshopid = $workshop->id"); + } + $table->data[] = array($stats->count, number_format($stats->mean * $workshop->gradinggrade / 100, 1), + number_format($stats->stddev * $workshop->gradinggrade /100, 1), + number_format($stats->max * $workshop->gradinggrade / 100, 1), + number_format($stats->min* $workshop->gradinggrade / 100, 1)); + print_heading(get_string("gradinggrade", "workshop")." ".get_string("analysis", "workshop")); print_table($table); } } @@ -1262,12 +1314,12 @@ function workshop_list_submissions_for_admin($workshop, $order) { unset($table); switch ($order) { case "title" : - $table->head = array("id&order=name\">". + $table->head = array("id&order=name\">". get_string("submittedby", "workshop")."", get_string("title", "workshop"), get_string("action", "workshop")); break; case "name" : $table->head = array (get_string("submittedby", "workshop"), - "id&order=title\">". + "id&order=title\">". get_string("title", "workshop")."", get_string("action", "workshop")); break; } @@ -1281,37 +1333,46 @@ function workshop_list_submissions_for_admin($workshop, $order) { if (!$user = get_record("user", "id", $submission->userid)) { error("workshop_list_submissions_for_admin: failure to get user record"); } - $action = "id&sid=$submission->id\">". + // check group membership, if necessary + if ($groupid) { + // check user's group + if (!ismember($groupid, $user->id)) { + continue; // skip this user + } + } + $action = "id&sid=$submission->id\">". get_string("amendtitle", "workshop").""; // has teacher already assessed this submission if ($assessment = get_record_select("workshop_assessments", "submissionid = $submission->id AND userid = $USER->id")) { $curtime = time(); if (($curtime - $assessment->timecreated) > $CFG->maxeditingtime) { - $action .= " | id&sid=$submission->id\">". + $action .= " | id&sid=$submission->id\">". get_string("reassess", "workshop").""; } else { // there's still time left to edit... - $action .= " | id&sid=$submission->id\">". + $action .= " | id&sid=$submission->id\">". get_string("edit", "workshop").""; } } else { // user has not assessed this submission - $action .= " | id&sid=$submission->id\">". + $action .= " | id&sid=$submission->id\">". get_string("assess", "workshop").""; } if ($nassessments = workshop_count_assessments($submission)) { - $action .= " | id&sid=$submission->id\">". + $action .= " | id&sid=$submission->id\">". get_string("listassessments", "workshop")." ($nassessments)"; } - $action .= " | id&sid=$submission->id\">". + $action .= " | id&sid=$submission->id\">". get_string("delete", "workshop").""; - $table->data[] = array(fullname($user), $submission->title. - " ".workshop_print_submission_assessments($workshop, $submission, "teacher"). - " ".workshop_print_submission_assessments($workshop, $submission, "student"), $action); + $table->data[] = array("$user->firstname $user->lastname", $submission->title. + " (".get_string("grade").": ".workshop_submission_grade($workshop, $submission)." ". + workshop_print_submission_assessments($workshop, $submission, "teacher"). + " ".workshop_print_submission_assessments($workshop, $submission, "student").")", $action); } print_heading(get_string("studentsubmissions", "workshop", $course->student), "center"); print_table($table); + workshop_print_key($workshop); } } @@ -1320,9 +1381,14 @@ function workshop_list_submissions_for_admin($workshop, $order) { function workshop_list_teacher_assessments($workshop, $user) { global $CFG; + $timenow = time(); + if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $workshop->course)) { + error("Course Module ID was incorrect"); + } if (! $course = get_record("course", "id", $workshop->course)) { error("Course is misconfigured"); - } + } + $table->head = array (get_string("title", "workshop"), get_string("action", "workshop"), get_string("comment", "workshop")); $table->align = array ("LEFT", "LEFT", "LEFT"); $table->size = array ("*", "*", "*"); @@ -1336,7 +1402,7 @@ function workshop_list_teacher_assessments($workshop, $user) { if ($assessments = workshop_get_assessments($submission)) { foreach ($assessments as $assessment) { if (isteacher($workshop->course, $assessment->userid)) { // assessments by teachers only - $action = "id&aid=$assessment->id\">". + $action = "id&aid=$assessment->id\">". get_string("view", "workshop").""; // has teacher commented on teacher's assessment? shouldn't happen but leave test in if ($assessment->timegraded and ($timenow - $assessment->timegraded > $CFG->maxeditingtime)) { @@ -1365,9 +1431,12 @@ function workshop_list_teacher_assessments($workshop, $user) { function workshop_list_teacher_submissions($workshop, $user) { global $CFG; + if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $workshop->course)) { + error("Course Module ID was incorrect"); + } if (! $course = get_record("course", "id", $workshop->course)) { error("Course is misconfigured"); - } + } $table->head = array (get_string("title", "workshop"), get_string("action", "workshop"), get_string("comment", "workshop")); $table->align = array ("LEFT", "LEFT", "LEFT"); $table->size = array ("*", "*", "*"); @@ -1386,7 +1455,7 @@ function workshop_list_teacher_submissions($workshop, $user) { $n = count_records("workshop_assessments", "submissionid", $submission->id); // ...OK to have zero, we add a small random number to randomise things... $nassessments[$submission->id] = $n + rand(0, 99) / 100; - } + } // ...put the submissions with the lowest number of assessments first... asort($nassessments); reset($nassessments); @@ -1405,50 +1474,55 @@ function workshop_list_teacher_submissions($workshop, $user) { $assessment->timecreated = $yearfromnow; if (!$assessment->id = insert_record("workshop_assessments", $assessment)) { error("Could not insert workshop assessment!"); - } + } $nassessed++; if ($nassessed >= $workshop->ntassessments) { break; - } } } } } + } // now list user's assessments (but only list those which come from teacher submissions) if ($assessments = workshop_get_user_assessments($workshop, $user)) { $timenow = time(); foreach ($assessments as $assessment) { if (!$submission = get_record("workshop_submissions", "id", $assessment->submissionid)) { error ("workshop_list_teacher_submissions: unable to get submission"); - } + } // submission from a teacher? if (isteacher($workshop->course, $submission->userid)) { $comment = ''; - // user assessment has three states: record created but not assessed (date created in the future); - // just assessed but still editable; and "static" (may or may not have been graded by teacher, that - // is shown in the comment) - if ($assessment->timecreated> $timenow) { // user needs to assess this submission - $action = "id&sid=$submission->id\">". + // user assessment has two states: record created but not assessed (date created in the future); + // assessed but always available for re-assessment + if ($assessment->timecreated > $timenow) { // user needs to assess this submission + $action = "id&sid=$submission->id\">". get_string("assess", "workshop").""; - } - elseif (($timenow - $assessment->timecreated) < $CFG->maxeditingtime) { // there's still time left to edit... - $action = "id&sid=$submission->id\">". - get_string("edit", "workshop").""; - } - else { - $action = "id&aid=$assessment->id\">" - .get_string("view", "workshop").""; - } - // see if teacher has graded assessment - if ($assessment->timegraded and (($timenow - $assessment->timegraded) > $CFG->maxeditingtime)) { - $comment .= get_string("thereisfeedbackfromtheteacher", "workshop", $course->teacher); - } - $table->data[] = array(workshop_print_submission_title($workshop, $submission), $action, $comment); } + elseif ($assessment->timegraded) { + // allow student to improve on their assessment once it's been graded + $action = "id&sid=$submission->id\">". + get_string("reassess", "workshop").""; + } else { + // allow student just to see their assessment if it hasn't been graded + $action = "id&aid=$assessment->id\">". + get_string("view", "workshop").""; + } + // see if the assessment is graded + if ($assessment->timegraded) { + // show grading grade + $comment = get_string("thegradeforthisassessmentis", "workshop", + number_format($assessment->gradinggrade * $workshop->gradinggrade / 100, 1))." / ". + $workshop->gradinggrade; + } elseif ($assessment->timecreated < $timenow) { + $comment = get_string("awaitinggradingbyteacher", "workshop", $course->teacher); + } + $table->data[] = array(workshop_print_submission_title($workshop, $submission), $action, $comment); } } - print_table($table); } + print_table($table); +} ////////////////////////////////////////////////////////////////////////////////////// @@ -1456,6 +1530,19 @@ function workshop_list_unassessed_student_submissions($workshop, $user) { // list the student submissions not assessed by this user global $CFG; + if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $workshop->course)) { + error("Course Module ID was incorrect"); + } + if (! $course = get_record("course", "id", $workshop->course)) { + error("Course is misconfigured"); + } + + if (groupmode($course, $cm) == SEPARATEGROUPS) { + $groupid = get_current_group($course->id); + } else { + $groupid = 0; + } + $table->head = array (get_string("title", "workshop"), get_string("submittedby", "workshop"), get_string("action", "workshop"), get_string("comment", "workshop")); $table->align = array ("LEFT", "LEFT", "LEFT", "LEFT"); @@ -1465,6 +1552,13 @@ function workshop_list_unassessed_student_submissions($workshop, $user) { if ($submissions = workshop_get_student_submissions($workshop)) { foreach ($submissions as $submission) { + // check group membership, if necessary + if ($groupid) { + // check user's group + if (!ismember($groupid, $submission->userid)) { + continue; // skip this user + } + } $comment = ""; // see if user already graded this assessment if ($assessment = get_record_select("workshop_assessments", "submissionid = $submission->id @@ -1473,7 +1567,7 @@ function workshop_list_unassessed_student_submissions($workshop, $user) { if (($timenow - $assessment->timecreated < $CFG->maxeditingtime)) { // last chance salon $submissionowner = get_record("user", "id", $submission->userid); - $action = "id&sid=$submission->id\">". + $action = "id&sid=$submission->id\">". get_string("edit", "workshop").""; $table->data[] = array(workshop_print_submission_title($workshop, $submission), fullname($submissionowner), $action, $comment); @@ -1481,7 +1575,7 @@ function workshop_list_unassessed_student_submissions($workshop, $user) { } else { // no assessment $submissionowner = get_record("user", "id", $submission->userid); - $action = "id&sid=$submission->id\">". + $action = "id&sid=$submission->id\">". get_string("assess", "workshop").""; $table->data[] = array(workshop_print_submission_title($workshop, $submission), fullname($submissionowner), $action, $comment); @@ -1499,7 +1593,12 @@ function workshop_list_unassessed_teacher_submissions($workshop, $user) { // list the teacher submissions not assessed by this user global $CFG; - $table->head = array (get_string("title", "workshop"), get_string("action", "workshop"), get_string("comment", "workshop")); + if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $workshop->course)) { + error("Course Module ID was incorrect"); + } + + $table->head = array (get_string("title", "workshop"), get_string("action", "workshop"), + get_string("comment", "workshop")); $table->align = array ("LEFT", "LEFT", "LEFT"); $table->size = array ("*", "*", "*"); $table->cellpadding = 2; @@ -1514,13 +1613,13 @@ function workshop_list_unassessed_teacher_submissions($workshop, $user) { $timenow = time(); if (($timenow - $assessment->timecreated < $CFG->maxeditingtime)) { // last chance salon - $action = "id&sid=$submission->id\">". + $action = "id&sid=$submission->id\">". get_string("edit", "workshop").""; $table->data[] = array(workshop_print_submission_title($workshop, $submission), $action, $comment); } } else { // no assessment - $action = "id&sid=$submission->id\">". + $action = "id&sid=$submission->id\">". get_string("assess", "workshop").""; $table->data[] = array(workshop_print_submission_title($workshop, $submission), $action, $comment); } @@ -1534,9 +1633,13 @@ function workshop_list_unassessed_teacher_submissions($workshop, $user) { ////////////////////////////////////////////////////////////////////////////////////// function workshop_list_ungraded_assessments($workshop, $stype) { + // lists all the assessments of student submissions for grading by teacher global $CFG; - // lists all the assessments of student submissions for grading by teacher + if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $workshop->course)) { + error("Course Module ID was incorrect"); + } + $table->head = array (get_string("title", "workshop"), get_string("submittedby", "workshop"), get_string("assessor", "workshop"), get_string("timeassessed", "workshop"), get_string("action", "workshop")); $table->align = array ("LEFT", "LEFT", "LEFT", "LEFT"); @@ -1557,11 +1660,11 @@ function workshop_list_ungraded_assessments($workshop, $stype) { foreach ($assessments as $assessment) { if (!isteacher($workshop->course, $assessment->userid)) { // don't let teacher grade their own assessments if (($timenow - $assessment->timegraded) < $CFG->maxeditingtime) { - $action = "id&stype=$stype&aid=$assessment->id\">". + $action = "id&stype=$stype&aid=$assessment->id\">". get_string("edit", "workshop").""; } else { - $action = "id&stype=$stype&aid=$assessment->id\">". + $action = "id&stype=$stype&aid=$assessment->id\">". get_string("grade", "workshop").""; } $submission = get_record("workshop_submissions", "id", $assessment->submissionid); @@ -1582,6 +1685,10 @@ function workshop_list_ungraded_assessments($workshop, $stype) { function workshop_list_user_submissions($workshop, $user) { global $CFG; + if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $workshop->course)) { + error("Course Module ID was incorrect"); + } + $timenow = time(); $table->head = array (get_string("title", "workshop"), get_string("action", "workshop"), get_string("submitted", "assignment"), get_string("assessments", "workshop")); @@ -1594,7 +1701,7 @@ function workshop_list_user_submissions($workshop, $user) { foreach ($submissions as $submission) { // allow user to delete a submission if it's warm if ($submission->timecreated > ($timenow - $CFG->maxeditingtime)) { - $action = "id&sid=$submission->id\">". + $action = "id&sid=$submission->id\">". get_string("delete", "workshop").""; } else { @@ -1683,23 +1790,23 @@ function workshop_print_assessment($workshop, $assessment = false, $allowchanges // show links depending on who doing the viewing $firstcomment = FALSE; if (isteacher($workshop->course, $USER->id) and ($comment->userid != $USER->id)) { - echo "

id&aid=$assessment->id\">". + echo "

id&aid=$assessment->id\">". get_string("reply", "workshop")."\n"; } elseif (($comment->userid ==$USER->id) and (($timenow - $comment->timecreated) < $CFG->maxeditingtime)) { - echo "

id&cid=$comment->id\">". + echo "

id&cid=$comment->id\">". get_string("edit", "workshop")."\n"; if ($USER->id == $submission->userid) { - echo " | id&aid=$assessment->id\">". + echo " | id&aid=$assessment->id\">". get_string("agreetothisassessment", "workshop")."\n"; } } elseif (($comment->userid != $USER->id) and (($USER->id == $assessment->userid) or ($USER->id == $submission->userid))) { - echo "

id&aid=$assessment->id\">". + echo "

id&aid=$assessment->id\">". get_string("reply", "workshop")."\n"; if ($USER->id == $submission->userid) { - echo " | id&aid=$assessment->id\">". + echo " | id&aid=$assessment->id\">". get_string("agreetothisassessment", "workshop")."\n"; } } @@ -1716,7 +1823,7 @@ function workshop_print_assessment($workshop, $assessment = false, $allowchanges } } - // now print the grading form with the teacher's comments if any + // now print the grading form with the grading grade if any // FORM is needed for Mozilla browsers, else radio bttons are not checked ?>

@@ -2129,23 +2236,19 @@ function workshop_print_assessment($workshop, $assessment = false, $allowchanges echo "\n"; $timenow = time(); - // now show the teacher's comment if available... - if ($assessment->timegraded and (($timenow - $assessment->timegraded) > $CFG->maxeditingtime)) { - echo "\n"; - echo "

". get_string("teacherscomment", "workshop").":

\n"; - echo " \n"; - echo text_to_html($assessment->teachercomment); + // now show the grading grade if available... + if ($assessment->timegraded) { + echo "\n"; + echo "

"; + if (isteacher($course->id, $assessment->userid)) { + print_string("gradeforstudentsassessment", "workshop", $course->teacher); + } else { + print_string("gradeforstudentsassessment", "workshop", $course->student); + } + echo ":

\n"; + echo number_format($assessment->gradinggrade * $workshop->gradinggrade / 100, 0); echo " \n"; echo "\n"; - // only show the grading grade if it's the teacher - if (isteacher($course->id)) { - echo "\n"; - echo "

". get_string("teachersgrade", "workshop").":

\n"; - echo " \n"; - echo number_format($assessment->gradinggrade * 100 / COMMENTSCALE, 0)."%"; - echo " \n"; - echo "\n"; - } echo "\n"; echo "cellheading2\"> \n"; echo "\n"; @@ -2175,11 +2278,15 @@ function workshop_print_assessment($workshop, $assessment = false, $allowchanges ////////////////////////////////////////////////////////////////////////////////////// function workshop_print_assessments_by_user_for_admin($workshop, $user) { - if ($assessments =workshop_get_user_assessments($workshop, $user)) { + if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $workshop->course)) { + error("Course Module ID was incorrect"); + } + + if ($assessments = workshop_get_user_assessments_done($workshop, $user)) { foreach ($assessments as $assessment) { echo "

".get_string("assessmentby", "workshop", fullname($user))."

\n"; workshop_print_assessment($workshop, $assessment); - echo "

id&aid=$assessment->id\">". + echo "

id&aid=$assessment->id\">". get_string("delete", "workshop")."


\n"; } } @@ -2189,6 +2296,10 @@ function workshop_print_assessments_by_user_for_admin($workshop, $user) { ////////////////////////////////////////////////////////////////////////////////////// function workshop_print_assessments_for_admin($workshop, $submission) { + if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $workshop->course)) { + error("Course Module ID was incorrect"); + } + if ($assessments =workshop_get_assessments($submission)) { foreach ($assessments as $assessment) { if (!$user = get_record("user", "id", $assessment->userid)) { @@ -2196,7 +2307,7 @@ function workshop_print_assessments_for_admin($workshop, $submission) { } echo "

".get_string("assessmentby", "workshop", fullname($user))."

\n"; workshop_print_assessment($workshop, $assessment); - echo "

id&aid=$assessment->id\">". + echo "

id&aid=$assessment->id\">". get_string("delete", "workshop")."


\n"; } } @@ -2222,7 +2333,8 @@ function workshop_print_assignment_info($workshop) { print_heading($workshop->name, "center"); print_simple_box_start("center"); echo "".get_string("duedate", "assignment").": $strduedate
"; - echo "".get_string("maximumgrade").": $workshop->grade
"; + $grade = $workshop->gradinggrade + $workshop->grade; + echo "".get_string("maximumgrade").": $grade
"; echo "".get_string("detailsofassessment", "workshop").": id&action=displaygradingform\">". get_string("specimenassessmentform", "workshop")."
"; @@ -2281,6 +2393,29 @@ function workshop_print_feedback($course, $submission) { } +////////////////////////////////////////////////////////////////////////////////////// +function workshop_print_key($workshop) { + // print an explaination of the grades + + if (!$course = get_record("course", "id", $workshop->course)) { + error("Print key: course not found"); + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
{}".get_string("assessmentby", "workshop", $course->student). + ";   []".get_string("assessmentby", "workshop", $course->teacher). + ";   <>".get_string("assessmentdropped", "workshop"). + ";   ()".get_string("gradegiventoassessment", "workshop"). + ".
".get_string("gradesforsubmissionsare", "workshop", $workshop->grade)."; ". + get_string("gradesforassessmentsare", "workshop", $workshop->gradinggrade).".

\n"; + return; +} + + ////////////////////////////////////////////////////////////////////////////////////// function workshop_print_league_table($workshop) { // print an order table of (student) submissions showing teacher's and student's assessments @@ -2288,112 +2423,120 @@ function workshop_print_league_table($workshop) { if (! $course = get_record("course", "id", $workshop->course)) { error("Print league table: Course is misconfigured"); } + if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $workshop->course)) { + error("Course Module ID was incorrect"); + } + // set $groupid if workshop is in SEPARATEGROUPS mode + if (groupmode($course, $cm) == SEPARATEGROUPS) { + $groupid = get_current_group($course->id); + } else { + $groupid = 0; + } + $nentries = $workshop->showleaguetable; - if ($nentries == 99) { - $nentries = 999999; // a large number - } - if ($workshop->anonymous and isstudent($course->id)) { $table->head = array (get_string("title", "workshop"), get_string("teacherassessments", "workshop", $course->teacher), get_string("studentassessments", "workshop", $course->student), get_string("overallgrade", "workshop")); $table->align = array ("left", "center", "center", "center"); $table->size = array ("*", "*", "*", "*"); - } + } else { // show names $table->head = array (get_string("title", "workshop"), get_string("name"), get_string("teacherassessments", "workshop", $course->teacher), get_string("studentassessments", "workshop", $course->student), get_string("overallgrade", "workshop")); $table->align = array ("left", "left", "center", "center", "center"); $table->size = array ("*", "*", "*", "*", "*"); - } + } $table->cellpadding = 2; $table->cellspacing = 0; - if ($submissions = workshop_get_student_submissions($workshop, "grade")) { - $n = 1; + if ($submissions = workshop_get_student_submissions($workshop)) { foreach ($submissions as $submission) { + if ($groupid) { + // check submission's group + if (!ismember($groupid, $submission->userid)) { + continue; // skip this submission + } + } + $grades[$submission->id] = workshop_submission_grade($workshop, $submission); + } + arsort($grades); // largest grade first + reset($grades); + $n = 1; + while (list($submissionid, $grade) = each($grades)) { + if (!$submission = get_record("workshop_submissions", "id", $submissionid)) { + error("Print league table: submission not found"); + } if (!$user = get_record("user", "id", $submission->userid)) { error("Print league table: user not found"); - } + } if ($workshop->anonymous and isstudent($course->id)) { $table->data[] = array(workshop_print_submission_title($workshop, $submission), - workshop_print_submission_assessments($workshop, $submission, "teacher"), - workshop_print_submission_assessments($workshop, $submission, "student"), - number_format(($workshop->teacherweight * $submission->teachergrade + $workshop->peerweight * - $submission->peergrade) / ($workshop->teacherweight + $workshop->peerweight), 1)) ; - } + workshop_print_submission_assessments($workshop, $submission, "teacher"), + workshop_print_submission_assessments($workshop, $submission, "student"), $grade); + } else { $table->data[] = array(workshop_print_submission_title($workshop, $submission), fullname($user), - workshop_print_submission_assessments($workshop, $submission, "teacher"), - workshop_print_submission_assessments($workshop, $submission, "student"), - number_format(($workshop->teacherweight * $submission->teachergrade + $workshop->peerweight * - $submission->peergrade) / ($workshop->teacherweight + $workshop->peerweight), 1)) ; - } + workshop_print_submission_assessments($workshop, $submission, "teacher"), + workshop_print_submission_assessments($workshop, $submission, "student"), $grade); + } $n++; if ($n > $nentries) { break; - } } + } print_heading(get_string("leaguetable", "workshop")); print_table($table); - echo "

< > ".get_string("assessmentdropped", "workshop")."

\n"; - } + workshop_print_key($workshop); } +} ////////////////////////////////////////////////////////////////////////////////////// function workshop_print_submission_assessments($workshop, $submission, $type) { // Returns the teacher or peer grade and a hyperlinked list of grades for this submission - + + if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $workshop->course)) { + error("Course Module ID was incorrect"); + } + $str = ''; if ($assessments = workshop_get_assessments($submission)) { switch ($type) { case "teacher" : - if ($submission->teachergrade) { // if there's a final teacher's grade... - $str = "$submission->teachergrade "; - } foreach ($assessments as $assessment) { if (isteacher($workshop->course, $assessment->userid)) { - - $str .= "id&aid=$assessment->id\">"; - if ($assessment->donotuse) { - $str .= "<"; - } else { - $str .= "["; - } - $str .= number_format($assessment->grade, 0); - if ($assessment->gradinggrade) { // funny, teacher is grading self! - $str .= "/".number_format($assessment->gradinggrade*100/COMMENTSCALE, 0)."%"; - } - if ($assessment->donotuse) { - $str .= "> "; + $str .= "id&aid=$assessment->id\">"; + if ($assessment->timegraded) { + if ($assessment->gradinggrade) { + $str .= "[".number_format($assessment->grade * $workshop->grade / 100, 0)." (". + number_format($assessment->gradinggrade * $workshop->gradinggrade / 100, 0). + ")] "; + } else { + $str .= "<".number_format($assessment->grade, 0)." (0)> "; + } } else { - $str .= "] "; + $str .= "[".number_format($assessment->grade, 0)." (-)] "; } } } break; case "student" : - if ($submission->peergrade) { // if there's a final peer grade... - $str = "$submission->peergrade "; - } foreach ($assessments as $assessment) { if (isstudent($workshop->course, $assessment->userid)) { - $str .= "id&aid=$assessment->id\">"; - if ($assessment->donotuse) { - $str .= "<"; - } else { - $str .= "{"; - } - $str .= number_format($assessment->grade, 0); - if ($assessment->gradinggrade) { - $str .= "/".number_format($assessment->gradinggrade*100/COMMENTSCALE, 0)."%"; - } - if ($assessment->donotuse) { - $str .= "> "; + $str .= "id&aid=$assessment->id\">"; + if ($assessment->timegraded) { + if ($assessment->gradinggrade) { + $str .= "{".number_format($assessment->grade * $workshop->grade / 100, 0)." (". + number_format($assessment->gradinggrade * $workshop->gradinggrade / 100, 0). + ")} "; + } else { + $str .= "<".number_format($assessment->grade * $workshop->grade / 100, 0). + " (0)> "; + } } else { - $str .= "} "; + $str .= "{".number_format($assessment->grade * $workshop->grade / 100, 0)." (-)} "; } } } @@ -2556,25 +2699,26 @@ function workshop_print_upload_form($workshop) { function workshop_print_user_assessments($workshop, $user) { // Returns the number of assessments and a hyperlinked list of grading grades for the assessments made by this user + if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $workshop->course)) { + error("Course Module ID was incorrect"); + } + if ($assessments = workshop_get_user_assessments_done($workshop, $user)) { $n = count($assessments); - $str = "$n ("; + $str = "$n : "; foreach ($assessments as $assessment) { + $str .= "id&aid=$assessment->id\">"; if ($assessment->timegraded) { - $gradingscaled = intval($assessment->gradinggrade * $workshop->grade / COMMENTSCALE); - $str .= "id&aid=$assessment->id\">"; - $str .= "$gradingscaled "; - } - else { - $str .= "id&aid=$assessment->id\">"; - if ($assessment->donotuse) { - $str .= "<".number_format($assessment->grade, 0)."> "; + if ($assessment->gradinggrade) { + $str .= "{".number_format($assessment->grade * $workshop->grade / 100, 0). " (". + number_format($assessment->gradinggrade * $workshop->gradinggrade / 100).")} "; } else { - $str .= number_format($assessment->grade, 0)." "; + $str .= "<".number_format($assessment->grade * $workshop->grade / 100, 0)." (0)> "; } + } else { + $str .= "{".number_format($assessment->grade * $workshop->grade / 100, 0)." (-)} "; } } - $str .= ")"; } else { $str ="0"; @@ -2607,6 +2751,7 @@ function workshop_test_user_assessments($workshop, $user) { return $result; } +////////////////////////////////////////////////////////////////////////////////////// function workshop_get_recent_mod_activity(&$activities, &$index, $sincetime, $courseid, $workshop="0", $user="", $groupid="") { // Returns all workshop posts since a given time. If workshop is specified then @@ -2671,6 +2816,7 @@ function workshop_get_recent_mod_activity(&$activities, &$index, $sincetime, $co return; } +////////////////////////////////////////////////////////////////////////////////////// function workshop_print_recent_mod_activity($activity, $course, $detail=false) { global $CFG; diff --git a/mod/workshop/mod.html b/mod/workshop/mod.html index cec406c85d..b4cfac8bc0 100644 --- a/mod/workshop/mod.html +++ b/mod/workshop/mod.html @@ -1,5 +1,6 @@ dirroot/mod/workshop/lib.php"); // for parameter arrays + // ...and fill the form if needed if (empty($form->name)) { $form->name = ""; } @@ -9,9 +10,15 @@ if (empty($form->format)) { $form->format = ""; } + if (!isset($form->gradinggrade)) { + $form->gradinggrade = 100; + } if (!isset($form->grade)) { $form->grade = 100; } + if (!isset($form->gradingstrategy)) { + $form->gradingstrategy = 1; // default is accumulative + } if (!isset($form->nelements)) { $form->nelements = 1; } @@ -21,9 +28,18 @@ if (!isset($form->ntassessments)) { $form->ntassessments = 0; } + if (!isset($form->assessmentcomps)) { + $form->assessmentcomps = 2; + } if (!isset($form->nsassessments)) { $form->nsassessments = 0; } + if (!isset($form->teacherweight)) { + $form->teacherweight = 1; + } + if (!isset($form->overallocation)) { + $form->overallocation = 0; + } if (empty($form->includeself)) { $form->includeself = ""; } @@ -33,6 +49,12 @@ if (empty($form->hidegrades)) { $form->hidegrades = ""; } + if (empty($form->showleaguetable)) { + $form->showleaguetable = 0; + } + if (empty($form->anonymous)) { + $form->anonymous = 0; + } if (empty($form->maxbytes)) { $form->maxbytes = ""; } @@ -88,13 +110,24 @@ -

:

+

:

=0; $i--) { $grades[$i] = $i; } + choose_from_menu($grades, "gradinggrade", "$form->gradinggrade", ""); + helpbutton("gradinggrade", get_string("gradeforassessments", "workshop"), "workshop"); + ?> + + + + +

:

+ + grade", ""); + helpbutton("grade", get_string("gradeforsubmission", "workshop"), "workshop"); ?> @@ -103,11 +136,7 @@

:

dirroot/mod/workshop/lib.php"); - if (!isset($form->gradingstrategy)) { - $form->gradingstrategy = 1; // default - } - choose_from_menu($WORKSHOP_TYPE, "gradingstrategy", $form->gradingstrategy, ""); + choose_from_menu($WORKSHOP_TYPE, "gradingstrategy", $form->gradingstrategy, ""); helpbutton("gradingstrategy", get_string("gradingstrategy", "workshop"), "workshop"); ?> @@ -141,6 +170,7 @@

:

=0; $i--) { $numbers[$i] = $i; } @@ -150,10 +180,25 @@ + +

:

+ + $COMPARISON) { + $COMPARISONS[] = $COMPARISON['name']; + } + choose_from_menu($COMPARISONS, "assessmentcomps", $form->assessmentcomps, ""); + helpbutton("comparisonofassessments", get_string("comparisonofassessments", "workshop"), "workshop"); + ?> + + +

:

=0; $i--) { $numbers[$i] = $i; } @@ -163,6 +208,34 @@ + +

:

+ + =0; $i--) { + $numbers[$i] = $i; + } + choose_from_menu($numbers, "teacherweight", $form->teacherweight, ""); + helpbutton("teacherweight", get_string("weightforteacherassessments", "workshop"), "workshop"); + ?> + + + + +

:

+ + =0; $i--) { + $numbers[$i] = $i; + } + choose_from_menu($numbers, "overallocation", "$form->overallocation", ""); + helpbutton("overallocation", get_string("overallocation", "workshop"), "workshop"); + ?> + + +

:

@@ -178,7 +251,6 @@

:

agreeassessments, ""); helpbutton("agreeassessments", get_string("assessmentsmustbeagreed", "workshop"), "workshop"); ?> @@ -189,13 +261,38 @@

:

hidegrades, ""); helpbutton("showinggrades", get_string("hidegradesbeforeagreement", "workshop"), "workshop"); ?> + +

:

+ + =0; $i--) { + $numbers[$i] = $i; + } + choose_from_menu($numbers, "showleaguetable", $form->showleaguetable, ""); + helpbutton("leaguetable", get_string("showleaguetable", "workshop"), "workshop"); + ?> + + + + +

students) ?>:

+ + anonymous, ""); + helpbutton("anonymous", get_string("hidenamesfromstudents", "workshop", $course->students), "workshop"); + ?> + + +

:

diff --git a/mod/workshop/restorelib.php b/mod/workshop/restorelib.php index f94cf7634c..c1403c5906 100644 --- a/mod/workshop/restorelib.php +++ b/mod/workshop/restorelib.php @@ -68,20 +68,14 @@ $workshop->maxbytes = backup_todb($info['MOD']['#']['MAXBYTES']['0']['#']); $workshop->deadline = backup_todb($info['MOD']['#']['DEADLINE']['0']['#']); $workshop->grade = backup_todb($info['MOD']['#']['GRADE']['0']['#']); + $workshop->gradinggrade = backup_todb($info['MOD']['#']['GRADINGGRADE']['0']['#']); $workshop->ntassessments = backup_todb($info['MOD']['#']['NTASSESSMENTS']['0']['#']); + $workshop->assessmentcomps = backup_todb($info['MOD']['#']['ASSESSMENTCOMPS']['0']['#']); $workshop->nsassessments = backup_todb($info['MOD']['#']['NSASSESSMENTS']['0']['#']); $workshop->overallocation = backup_todb($info['MOD']['#']['OVERALLOCATION']['0']['#']); $workshop->timemodified = backup_todb($info['MOD']['#']['TIMEMODIFIED']['0']['#']); - $workshop->mergegrades = backup_todb($info['MOD']['#']['MERGEGRADES']['0']['#']); $workshop->teacherweight = backup_todb($info['MOD']['#']['TEACHERWEIGHT']['0']['#']); - $workshop->peerweight = backup_todb($info['MOD']['#']['PEERWEIGHT']['0']['#']); - $workshop->includeteachersgrade = backup_todb($info['MOD']['#']['INCLUDETEACHERSGRADE']['0']['#']); - $workshop->biasweight = backup_todb($info['MOD']['#']['BIASWEIGHT']['0']['#']); - $workshop->reliabilityweight = backup_todb($info['MOD']['#']['RELIABILITYWEIGHT']['0']['#']); - $workshop->gradingweight = backup_todb($info['MOD']['#']['GRADINGWEIGHT']['0']['#']); $workshop->showleaguetable = backup_todb($info['MOD']['#']['SHOWLEAGUETABLE']['0']['#']); - $workshop->teacherloading = backup_todb($info['MOD']['#']['TEACHERLOADING']['0']['#']); - $workshop->assessmentstodrop = backup_todb($info['MOD']['#']['ASSESSMENTSTODROP']['0']['#']); //The structure is equal to the db, so insert the workshop $newid = insert_record ("workshop",$workshop); diff --git a/mod/workshop/submissions.php b/mod/workshop/submissions.php index e8273f1265..4944a9b06e 100644 --- a/mod/workshop/submissions.php +++ b/mod/workshop/submissions.php @@ -3,17 +3,14 @@ /************************************************* ACTIONS handled are: + adminamendtitle adminconfirmdelete - admindelete - adminlist - analysisofassessments - calculatefinalgrades + admindelete + adminlist displayfinalgrades (teachers only) - displayfinalweights listallsubmissions listforassessmentstudent listforassessmentteacher - updateoverallocation userconfirmdelete userdelete @@ -24,33 +21,17 @@ require("lib.php"); require("locallib.php"); - optional_variable($id); // Course Module ID - optional_variable($a); // workshop ID + require_variable($id); // Course Module ID // get some useful stuff... - if ($id) { - if (! $cm = get_record("course_modules", "id", $id)) { - error("Course Module ID was incorrect"); - } - - if (! $course = get_record("course", "id", $cm->course)) { - error("Course is misconfigured"); - } - - if (! $workshop = get_record("workshop", "id", $cm->instance)) { - error("Course module is incorrect"); - } - - } else { - if (! $workshop = get_record("workshop", "id", $a)) { - error("Course module is incorrect"); - } - if (! $course = get_record("course", "id", $workshop->course)) { - error("Course is misconfigured"); - } - if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $course->id)) { - error("Course Module ID was incorrect"); - } + if (! $cm = get_record("course_modules", "id", $id)) { + error("Course Module ID was incorrect"); + } + if (! $course = get_record("course", "id", $cm->course)) { + error("Course is misconfigured"); + } + if (! $workshop = get_record("workshop", "id", $cm->instance)) { + error("Course module is incorrect"); } require_login($course->id); @@ -62,7 +43,7 @@ // ... print the header and... print_header_simple("$workshop->name", "", "id>$strworkshops -> - id\">$workshop->name -> $strsubmissions", + id\">$workshop->name -> $strsubmissions", "", "", true); //...get the action or set up an suitable default @@ -190,1189 +171,115 @@ } - /*************** analysis of assessments (by teacher) ***************************/ - elseif ($action == 'analysisofassessments') { - - // timeout after 10 minutes - @set_time_limit(600); - - if (!isteacher($course->id)) { - error("Only teachers can look at this page"); - } - - // this analysis does not use bias or reliability... - set_field("workshop", "biasweight", 0, "id", $workshop->id); - set_field("workshop", "reliabilityweight", 0, "id", $workshop->id); - // ...and unity weights for teacher and peer assessments - set_field("workshop", "teacherweight", 5, "id", $workshop->id); - set_field("workshop", "peerweight", 5, "id", $workshop->id); - - echo "\n"; - echo "id\">\n"; - echo "\n"; + /*************** display final grades (by teacher) ***************************/ + elseif ($action == 'displayfinalgrades') { - // get the options from the database... - $teacherloading = get_field("workshop", "teacherloading", "id", $workshop->id); - $gradingweight = get_field("workshop", "gradingweight", "id", $workshop->id); - $assessmentstodrop = get_field("workshop", "assessmentstodrop", "id", $workshop->id); - - // ...now show the options used in a table - print_heading_with_help(get_string("analysisofassessments", "workshop"), "analysisofassessments", - "workshop"); - echo "
\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "
cellheading2\">
". - get_string("optionsusedinanalysis", "workshop")."
".get_string("loadingforteacherassessments", "workshop", - $course->teacher).":"; - workshop_choose_from_menu($WORKSHOP_FWEIGHTS, "teacherloading", $teacherloading, ""); - echo "
".get_string("weightforgradingofassessments", "workshop").":"; - workshop_choose_from_menu($WORKSHOP_FWEIGHTS, "gradingweight", $gradingweight, ""); - echo "
".get_string("percentageofassessments", "workshop").":"; - for ($i = 0; $i <= 100; $i++) { - $numbers[$i] = $i; - } - choose_from_menu($numbers, "assessmentstodrop", $assessmentstodrop, ""); - echo "

\n"; - echo "\n"; - echo "\n"; - - - // set up the array of users who have made assessments - if (!$students = get_course_students($course->id, "u.lastname, u.firstname")) { - print_heading(get_string("nostudentsyet")); - print_footer($course); - exit; - } - $teachers = get_course_teachers($course->id); - $users = array_merge($students, $teachers); - $nassessments = 0; - foreach ($users as $user) { - if ($assessments = workshop_get_user_assessments_done($workshop, $user)) { - // the value put into the array element is not particularly important at this stage - // it will hold the user's assessment error after the first iteration - $n = count($assessments); - $assessors[$user->id] = $n; - $nassessments += $n; - } - } - - $ntodrop = intval(($assessmentstodrop * $nassessments / 100.0) + 0.5); - - // set minumim value for the variance (of the elements) - $minvar = 0.05; - - flush(); - // we now do up to five iterations, the first with all users. The second and subsequent if - // the number of assessors is not the full set. Two or three iterations with the reduced set - // should be enough to stablise the list of dropped assessments. - if ($ntodrop == 0) { - $loopcount = 1; + if (groupmode($course, $cm) == SEPARATEGROUPS) { + $groupid = get_current_group($course->id); } else { - $loopcount = 7; // max loops, should finish before that loop - } - for ($loop = 0; $loop < $loopcount; $loop++) { - // calculate the means for each submission using just the "good" assessments - // on the first iteration all the assessments are included - unset($num); - unset($sum); - foreach ($assessors as $userid => $error) { - if (!$user = get_record("user", "id", $userid)) { - error("Analysis of assessments: User record not found"); - } - $assessments = workshop_get_user_assessments_done($workshop, $user); - foreach ($assessments as $assessment) { - if (isset($drop[$assessment->id])) { - continue; - } - if (!$submission = get_record("workshop_submissions", "id", $assessment->submissionid)) { - error("Analysis of Assessments: submission record not found"); - } - if (isset($num[$submission->id])) { - if (isteacher($course->id, $userid)) { - $num[$submission->id] += $WORKSHOP_FWEIGHTS[$workshop->teacherloading]; - } else { - $num[$submission->id]++; - } - } else { - if (isteacher($course->id, $userid)) { - $num[$submission->id] = $WORKSHOP_FWEIGHTS[$workshop->teacherloading]; - } else { - $num[$submission->id] = 1; - } - } - for ($i = 0; $i < $workshop->nelements; $i++) { - $grade = get_field("workshop_grades", "grade", - "assessmentid", $assessment->id, "elementno", $i); - if (isset($sum[$submission->id][$i])) { - if (isteacher($course->id, $userid)) { - $sum[$submission->id][$i] += $grade * $WORKSHOP_FWEIGHTS[$workshop->teacherloading]; - } else { - $sum[$submission->id][$i] += $grade; - } - } else { - if (isteacher($course->id, $userid)) { - $sum[$submission->id][$i] = $grade * $WORKSHOP_FWEIGHTS[$workshop->teacherloading]; - } else { - $sum[$submission->id][$i] = $grade; - } - } - } - } - } - reset($num); - if (!$loop) { - echo "

".get_string("numberofsubmissions", "workshop", count($num))."

\n"; - } - - // (re)calculate the means for each submission - foreach ($num as $submissionid => $n) { - for ($i = 0; $i < $workshop->nelements; $i++) { - $mean[$submissionid][$i] = $sum[$submissionid][$i] / $n; - // echo "Submission: $submissionid; Element: $i; Mean: {$mean[$submissionid][$i]}
\n"; - } - } - - // only calculate the sd's and the error from guessing once - if (!$loop) { - // now get an estimate of the standard deviation of each element in the assessment - $n = 0; - for ($i = 0; $i < $workshop->nelements; $i++) { - $var[$i] = 0; - } - foreach ($assessors as $userid => $error) { - if (!$user = get_record("user", "id", $userid)) { - error("Submissions: User record not found"); - } - $assessments = workshop_get_user_assessments_done($workshop, $user); - foreach ($assessments as $assessment) { - if (!$submission = get_record("workshop_submissions", "id", $assessment->submissionid)) { - error("Analysis of Assessments: submission record not found"); - } - $n++; - for ($i = 0; $i < $workshop->nelements; $i++) { - $grade = get_field("workshop_grades", "grade", - "assessmentid", $assessment->id, "elementno", $i); - $temp = $mean[$submission->id][$i] - $grade; - $var[$i] += $temp * $temp; - } - } - } - for ($i = 0; $i < $workshop->nelements; $i++) { - $sd[$i] = sqrt($var[$i] / ($n - 1)); - echo get_string("standarddeviation", "workshop", $i+1)." $sd[$i]
"; - if ($sd[$i] <= $minvar) { - get_string("standarddeviationnote", "workshop")."
\n"; - } - echo "
\n"; - } - - // calculate the mean variance (error) if just guessing - // first get the assignment elements for maxscores... - $elementsraw = get_records("workshop_elements", "workshopid", $workshop->id, "elementno ASC"); - foreach ($elementsraw as $element) { - $maxscore[] = $element->maxscore; // to renumber index 0,1,2... - $weight[] = $element->weight; // to renumber index 0,1,2... - } - $n = 0; - $totvar = 0; - foreach ($assessors as $userid => $error) { - if (!$user = get_record("user", "id", $userid)) { - error("Submissions: User record not found"); - } - $assessments = workshop_get_user_assessments_done($workshop, $user); - foreach ($assessments as $assessment) { - if (!$submission = get_record("workshop_submissions", "id", $assessment->submissionid)) { - error("Analysis of Assessments: submission record not found"); - } - $n++; - for ($i = 0; $i < $workshop->nelements; $i++) { - $grade = mt_rand(0, $maxscore[$i]); - if ($sd[$i] > $minvar) { - $temp = ($mean[$submission->id][$i] - $grade) * - $WORKSHOP_EWEIGHTS[$weight[$i]] / $sd[$i]; - } else { - $temp = 0; - } - $totvar += $temp * $temp; - } - } - } - // take the average of these variances - $varguess = $totvar / $n; - } - - // calculate the variance (error) for each assessment (adjusted after the first loop) - // and work out the user's average error with all their assessments and without - // the dropped assessments (their "good" assessments) - foreach ($assessors as $userid => $error) { - if (!$user = get_record("user", "id", $userid)) { - error("Submissions: User record not found"); - } - $assessments = workshop_get_user_assessments_done($workshop, $user); - $n = 0; - $ngood = 0; - $totvar = 0; - $totvargood = 0; - foreach ($assessments as $assessment) { - if (!$submission = get_record("workshop_submissions", "id", $assessment->submissionid)) { - error("Analysis of Assessments: submission record not found"); - } - $n++; - $var = 0; - for ($i = 0; $i < $workshop->nelements; $i++) { - $grade = get_field("workshop_grades", "grade", - "assessmentid", $assessment->id, "elementno", $i); - if ($sd[$i] > $minvar) { - $temp = ($mean[$submission->id][$i] - $grade) * - $WORKSHOP_EWEIGHTS[$weight[$i]] / $sd[$i]; - } else { - $temp = 0; - } - $var += $temp * $temp; - } - // the variances are adjusted by the user's overall error (once it's calculated) - if ($loop) { - $assessmentvar[$assessment->id] = $var * $error; - } else { - $assessmentvar[$assessment->id] = $var; - } - $totvar += $var; - if (empty($drop[$assessment->id])) { - $ngood++; - $totvargood += $var; - } - } - $nsubmissions[$userid] = $n; - $newassessors[$userid] = $totvar / $n; - if ($ngood) { - $vargood[$userid] = $totvargood / $ngood; - } else { - $vargood[$userid] = 0; - } - // echo fullname($user)." Error: {$newassessors[$userid]}; n: $n
\n"; - } - - // echo "
\n"; - - - // now drop the assessments with the largest (adjusted) variances - $nchanged = 0; - if ($ntodrop) { - asort($assessmentvar); - $n = 1; - foreach ($assessmentvar as $assessmentid => $adjvar) { - if ($n <= ($nassessments - $ntodrop)) { - if (isset($drop[$assessmentid])) { - unset($drop[$assessmentid]); - $nchanged++; - } - } else { - if (empty($drop[$assessmentid])) { - $drop[$assessmentid] = 1; - $nchanged++; - } - } - $n++; - } - } - - // reset the assessors array - $assessors = $newassessors; - // put the assessors in order (for the next iteration, if there is one) - asort($assessors); - reset($assessors); - $i = $loop + 1; - echo get_string("iteration", "workshop", "$i / $loopcount")."
\n"; - echo get_string("numberofassessmentschanged", "workshop", $nchanged)."
\n"; - flush(); - if (!$nchanged) { - break; - } - } // end of iteration loop - - // flag the assessments which were classed as outliers - // but first clear any existing flags - execute_sql("UPDATE {$CFG->prefix}workshop_assessments SET donotuse = 0 - WHERE workshopid = $workshop->id", false); - if ($ntodrop) { - foreach ($drop as $assessmentid => $flag) { - if (!set_field("workshop_assessments", "donotuse", 1, "id", $assessmentid)) { - error("Analysis of assessments: unable to set donotuse field"); - } - $userid = get_field("workshop_assessments", "userid", "id", $assessmentid); - if (empty($ndropped[$userid])) { - $ndropped[$userid] = 1; - } else { - $ndropped[$userid]++; - } - } - } - - // echo "

".get_string("expectederror", "workshop", $varguess)."

\n"; - print_heading(get_string("errortable", "workshop")); - $table->head = array(" ",get_string("name"), get_string("averageerror", "workshop"), - get_string("averageerror", "workshop")."
". - get_string("excludingdroppedassessments", "workshop"), - get_string("numberofassessments", "workshop")); - $table->align = array ("left","left", "center", "center", "center"); - $table->size = array ("*", "*", "*", "*", "*"); - $table->cellpadding = 2; - $table->cellspacing = 0; - $n = 1; - foreach ($assessors as $userid => $error) { - if (!$user = get_record("user", "id", $userid)) { - error("Assessment analysis: user record not found"); - } - if ($vargood[$userid]) { - $vargoodtext = number_format($vargood[$userid] * 100 / $varguess, 2)."%"; - } else { - $vargoodtext = "-"; - } - if (empty($ndropped[$userid])) { - $numtext = "$nsubmissions[$userid]"; - } else { - $numtext = "$nsubmissions[$userid] <$ndropped[$userid]>"; - } - $table->data[] = array($n, fullname($user), - number_format($error * 100 / $varguess, 2)."%", $vargoodtext, - $numtext); - $n++; - } - print_table($table); - echo "

< > ".get_string("assessmentsexcluded", "workshop", $course->student)."

\n"; - echo "

".get_string("submissionsused", "workshop", count($num))."

\n";; - - // display student grades - print_heading(get_string("gradetable", "workshop")); - unset($table); - $table->head = array(get_string("name"), get_string("submission", "workshop"), - get_string("assessmentsdone", "workshop"), get_string("assessments", "workshop"), - get_string("studentassessments", "workshop", $course->teacher), - get_string("studentassessments", "workshop", $course->student), - get_string("submission", "workshop"), get_string("overallgrade", "workshop")); - $table->align = array ("left", "center", "center", "center", "center", "center", "center", "center"); - $table->size = array ("*", "*", "*", "*", "*", "*", "*", "*"); - $table->cellpadding = 2; - $table->cellspacing = 0; - $table->data[] = array("".get_string("weight", "workshop")."", " ", " ", - "".$WORKSHOP_FWEIGHTS[$workshop->gradingweight]."", " ", " ","1", " "); - $maxassessments = $workshop->nsassessments + $workshop->ntassessments; - foreach ($students as $user) { - if ($assessments = workshop_get_user_assessments_done($workshop, $user)) { - $n = 0; - foreach ($assessments as $assessment) { - if (!$assessment->donotuse) { - $n++; - } - } - if ($maxassessments) { - $assessmentgrade = ($n / $maxassessments) * $workshop->grade; - } else { - $assessmentgrade = 0; - } - } else { - // no assessments - $assessmentgrade = 0; - } - if ($submissions = workshop_get_user_submissions($workshop, $user)) { - foreach ($submissions as $submission) { - $submissiongrade = 0; - $n = 0; - if ($assessments = workshop_get_assessments($submission)) { - $sum = 0; - foreach ($assessments as $assessment) { - if (!$assessment->donotuse) { - $n++; - $sum += $assessment->grade; - } - } - if ($n) { - $submissiongrade = $sum / $n; - } - } - $finalgrade = ($assessmentgrade * $WORKSHOP_FWEIGHTS[$workshop->gradingweight] + - $submissiongrade) / ($WORKSHOP_FWEIGHTS[$workshop->gradingweight] + 1.0); - if ($n) { - $table->data[] = array(fullname($user), - workshop_print_submission_title($workshop, $submission), - workshop_print_user_assessments($workshop, $user), - number_format($assessmentgrade, 2), - workshop_print_submission_assessments($workshop, $submission, "teacher"), - workshop_print_submission_assessments($workshop, $submission, "student"), - number_format($submissiongrade, 2), - number_format($finalgrade, 2)); - } else { - $table->data[] = array(fullname($user), - workshop_print_submission_title($workshop, $submission), - workshop_print_user_assessments($workshop, $user), - number_format($assessmentgrade, 2), - workshop_print_submission_assessments($workshop, $submission, "teacher"), - workshop_print_submission_assessments($workshop, $submission, "student"), - "".get_string("noassessments", "workshop")."", - number_format($finalgrade, 2)); - } - // save grades in submission record - set_field("workshop_submissions", "teachergrade", intval($submissiongrade + 0.5), "id", - $submission->id); - set_field("workshop_submissions", "peergrade", intval($submissiongrade + 0.5), "id", - $submission->id); - set_field("workshop_submissions", "finalgrade", intval($finalgrade + 0.5), "id", - $submission->id); - set_field("workshop_submissions", "gradinggrade", intval($assessmentgrade + 0.5), "id", - $submission->id); - } - } else { - // no submissions - $finalgrade = ($assessmentgrade * $WORKSHOP_FWEIGHTS[$workshop->gradingweight]) / - ($WORKSHOP_FWEIGHTS[$workshop->gradingweight] + 1.0); - $table->data[] = array(fullname($user), - "-", workshop_print_user_assessments($workshop, $user), - number_format($assessmentgrade, 2), "-", "-", - get_string("nosubmission", "workshop"), - number_format($finalgrade,2)); - } - } - print_table($table); - echo "

< > ".get_string("assessmentdropped", "workshop")."

\n"; - echo "
"; - print_continue("view.php?a=$workshop->id"); - } - - - /*************** calculate final grades (by teacher) ***************************/ - elseif ($action == 'calculatefinalgrades') { - - $form = (object)$_POST; - - if (!isteacher($course->id)) { - error("Only teachers can look at this page"); - } + $groupid = 0; + } + // Get all the students + if (!$users = get_course_students($course->id, "u.lastname, u.firstname")) { + print_heading(get_string("nostudentsyet")); + print_footer($course); + exit; + } + + // show the final grades as stored in the tables... + print_heading_with_help(get_string("displayoffinalgrades", "workshop"), "finalgrades", "workshop"); + echo "
+ "; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "\n"; - // Get all the students in surname order - if (!$users = get_course_students($course->id, "u.firstname, u.lastname")) { - print_heading(get_string("nostudentsyet")); - print_footer($course); - exit; - } - - // set up the weights from the calculate final grades form... - if (isset($form->teacherweight)) { - $teacherweight = $form->teacherweight; - // ...and save them - set_field("workshop", "teacherweight", $teacherweight, "id", "$workshop->id"); - } - - if (isset($form->peerweight)) { - $peerweight = $form->peerweight; - // ...and save them - set_field("workshop", "peerweight", $peerweight, "id", "$workshop->id"); - } - - // get the include teachers grade flag - if (isset($form->includeteachersgrade)) { - $includeteachersgrade = $form->includeteachersgrade; - set_field("workshop", "includeteachersgrade", $includeteachersgrade, "id", "$workshop->id"); - } - - if (isset($form->biasweight)) { - $biasweight = $form->biasweight; - // ...and save them - set_field("workshop", "biasweight", $biasweight, "id", "$workshop->id"); - } - - if (isset($form->reliabilityweight)) { - $reliabilityweight = $form->reliabilityweight; - // ...and save them - set_field("workshop", "reliabilityweight", $reliabilityweight, "id", "$workshop->id"); - } - - if (isset($form->gradingweight)) { - $gradingweight = $form->gradingweight; - // ...and save them - set_field("workshop", "gradingweight", $gradingweight, "id", "$workshop->id"); - } - - // save number of entries in showleaguetable option - if ($form->nentries == 'All') { - $form->nentries = 99; - } - set_field("workshop", "showleaguetable", $form->nentries, "id", "$workshop->id"); - - // save the anonymous option - set_field("workshop", "anonymous", $form->anonymous, "id", "$workshop->id"); - - // work out what to show in the final grades tables and what to include in the calculation of the final grade - // teacher grades? - if ($workshop->gradingstrategy and $teacherweight) { - $useteachersgrades = 1; - } - else { - $useteachersgrades = 0; - } - // peergrades? - if ($workshop->gradingstrategy and $workshop->nsassessments and $peerweight) { - $usepeergrades = 1; - } - else { - $usepeergrades = 0; - } - // bias grades? - if ((($workshop->ntassessments >= 3) or ($workshop->nsassessments >= 3)) and ($useteachersgrades or $usepeergrades) - and $biasweight ) { - $usebiasgrades = 1; - } - else { - $usebiasgrades = 0; - } - // reliability grades? - if ((($workshop->ntassessments >= 3) or ($workshop->nsassessments >= 3)) and ($useteachersgrades or $usepeergrades) - and $reliabilityweight ) { - $usereliabilitygrades = 1; - } - else { - $usereliabilitygrades = 0; - } - // grading grades? - if (($workshop->ntassessments or $workshop->nsassessments) and $gradingweight ) { - $usegradinggrades = 1; - } - else { - $usegradinggrades = 0; - } - - // start to calculate the grand means - $sumallteachergrades = 0.0; - $nallteachergrades = 0; - $sumallpeergrades = 0.0; - $nallpeergrades = 0; - // get the grades of each student's submission... - // the method used allowed a submission to be graded by more than one teacher - if (workshop_count_student_submissions($workshop)) { - echo "
".get_string("studentsubmissions", "workshop", $course->student); - echo "
cellheading2\">".$course->student."cellheading2\">".get_string("submission", "workshop")."cellheading2\" align=\"center\">".get_string("assessmentsdone", "workshop"). + "cellheading2\" align=\"center\">".get_string("gradeforassessments", + "workshop")."cellheading2\" align=\"center\">".get_string("assessmentsby", "workshop", + $course->teachers)."cellheading2\" align=\"center\">".get_string("assessmentsby", "workshop", + $course->students)."cellheading2\" align=\"center\">".get_string("gradeforsubmission", + "workshop")."cellheading2\" align=\"center\">".get_string("overallgrade", "workshop"). + "
\n"; - echo "\n"; - echo "\n"; - if ($useteachersgrades) { - echo "\n"; - echo "\n"; - } - if ($usepeergrades) { - echo "\n"; - echo "\n"; - } - if ($useteachersgrades or $usepeergrades) { - echo "\n"; - } - // display weights - echo "\n"; - echo "\n"; - if ($useteachersgrades) { - echo "\n"; - } - if ($usepeergrades) { - echo "\n"; - } - if ($useteachersgrades or $usepeergrades) { - echo "\n"; - } - echo "\n"; - // go through the submissions in "user" order, makes comparing the two tables easier - foreach ($users as $user) { - if ($submissions = workshop_get_user_submissions($workshop, $user)) { - foreach ($submissions as $submission) { - $sumteachergrades = 0.0; - $nteachergrades = 0; - $sumpeergrades = 0.0; - $npeergrades = 0; - // have a look at each assessment and add to arrays - if ($assessments = workshop_get_assessments($submission)) { - foreach ($assessments as $assessment) { - if (isteacher($workshop->course, $assessment->userid)) { - // it's a teacher's - $sumteachergrades += $assessment->grade; - $nteachergrades++; - if ($includeteachersgrade) { // add it to the student grades - $sumpeergrades += $assessment->grade; - $npeergrades++; - } - } - else { - // its' a student's - $sumpeergrades += $assessment->grade; - $npeergrades++; - } - } - } - if ($nteachergrades) { - $teachergrade = intval($sumteachergrades / $nteachergrades + 0.5); - $sumallteachergrades += $teachergrade; - $nallteachergrades++; - } - else { - $teachergrade = 0; - } - if ($npeergrades) { - $peergrade = intval($sumpeergrades / $npeergrades + 0.5); - $sumallpeergrades += $peergrade; - $nallpeergrades++; - } - else { - $peergrade = 0; - } - if ($teacherweight + $peerweight > 0) { - $grade = intval((($useteachersgrades * $teachergrade * $WORKSHOP_FWEIGHTS[$teacherweight] + - $usepeergrades * $peergrade * $WORKSHOP_FWEIGHTS[$peerweight]) / - ($useteachersgrades * $WORKSHOP_FWEIGHTS[$teacherweight] + - $usepeergrades * $WORKSHOP_FWEIGHTS[$peerweight])) + 0.5); - } - else { - $grade = 0; - } - // display the grades... - echo "\n"; - echo "\n"; - if ($useteachersgrades) { - echo "\n"; - echo "\n"; - } - if ($usepeergrades) { - echo "\n"; - echo "\n"; - } - if ($useteachersgrades or $usepeergrades) { - echo "\n"; - } - // ...and save in the database - set_field("workshop_submissions", "teachergrade", $teachergrade, "id", $submission->id); - set_field("workshop_submissions", "peergrade", $peergrade, "id", $submission->id); - } - } - } - echo "
cellheading2\">$course->studentcellheading2\">".get_string("submissions","workshop")."cellheading2\">".get_string("assessmentsby", "workshop", $course->teachers)."cellheading2\">".get_string("numberofassessments", "workshop")."cellheading2\">".get_string("assessmentsby", "workshop", $course->students)."cellheading2\">".get_string("numberofassessments", "workshop")."cellheading2\">".get_string("gradeofsubmission", "workshop")."
cellheading2\">".get_string("weights","workshop")."cellheading2\"> cellheading2\">
$WORKSHOP_FWEIGHTS[$teacherweight]
cellheading2\">
$WORKSHOP_FWEIGHTS[$peerweight]
cellheading2\"> 
".fullname($user)."".workshop_print_submission_title($workshop, $submission)."$teachergrade[$nteachergrades]$peergrade[$npeergrades]$grade
\n"; - } - // now display the overall teacher and peer means - if ($nallteachergrades) { - $grandteachergrade = $sumallteachergrades / $nallteachergrades; - } - else { - $grandteachergrade = 0; - } - if ($nallpeergrades) { - $grandpeergrade = $sumallpeergrades / $nallpeergrades; - } - else { - $grandpeergrade = 0; - } - if ($useteachersgrades) { - echo "

".get_string("overallteachergrade", "workshop", number_format($grandteachergrade, 2))." [$nallteachergrades]\n"; - } - if ($usepeergrades) { - echo "

".get_string("overallpeergrade", "workshop", number_format($grandpeergrade, 2))." [$nallpeergrades]
\n"; - } - // run thru each users and see how their assessments faired, we may junk the grading stats but what the heck! foreach ($users as $user) { - // we need to calculate a user bias before we can calculate their reliability - $sumbias = 0.0; - // nbias is used later to show how many peer assessments the user has done - $nbias[$user->id] = 0; - if ($workshop->nsassessments) { // peer assessments? - // run thru this user's assessments on the STUDENT submissions - if ($assessments = workshop_get_student_assessments($workshop, $user)) { - foreach ($assessments as $assessment) { - $submission = get_record("workshop_submissions", "id", $assessment->submissionid); - // calculate the sum of "validity" values, the bias in a user's grading... - $sumbias += $submission->peergrade - $assessment->grade; - $nbias[$user->id]++; - } - } - } - if ($nbias[$user->id] > 1) { - // we could divide by n-1 to remove own score from calculation of mean but we don't because we re-use bias - // values in the calculation of reliability, and it's all relative anyway - $bias[$user->id] = $sumbias / $nbias[$user->id]; - } - else { - $bias[$user->id] = 0.0; - } - // now look at all the user's assessments of both the TEACHER's submissions and the STUDENT submissions - // to calculate their overall grading grade - $sumgradinggrade = 0.0; - $ngradinggrades = 0; - if ($workshop->ntassessments or $workshop->nsassessments) { // worth looking? - if ($assessments = workshop_get_user_assessments($workshop, $user)) { - foreach ($assessments as $assessment) { - if ($assessment->timegraded > 0) { - $sumgradinggrade += $assessment->gradinggrade; - $ngradinggrades++; - } - } - } - } - if ($ngradinggrades) { - $gradinggrade[$user->id] = $sumgradinggrade / $ngradinggrades; - } - else { - $gradinggrade[$user->id] = 0.0; - } - } - - // calculate the mean value of "reliability", the accuracy of a user's grading (disregarding bias) - // use a linear function rather than a squared function for reliability - // at the same time calculate a reliability of a "dumb user" whose grades everything at the grand mean value - $sumdumbreliability = 0.0; - $ndumbreliability =0; - foreach ($users as $user) { - $sumreliability = 0.0; - $nreliability = 0; - if ($workshop->nsassessments) { // worth a look? - // look only at the user's assessment of STUDENT submissions - if ($assessments = workshop_get_student_assessments($workshop, $user)) { - foreach ($assessments as $assessment) { - $submission = get_record("workshop_submissions", "id", $assessment->submissionid); - $sumreliability += abs($submission->peergrade - $assessment->grade - $bias[$user->id]); - $nreliability++; - $sumdumbreliability += abs($submission->peergrade - $grandpeergrade); - $ndumbreliability++; - } - } - } - // calculate the mean reliability values - if ($nreliability) { - $reliability[$user->id] = $sumreliability / $nreliability; - } - else { - $reliability[$user->id] = 999999; // big number - } - } - if ($ndumbreliability) { - $dumbreliability = $sumdumbreliability / $ndumbreliability; - } - else { - $dumbreliability = 999999; // big number - } - - // convert bias and reliability values into scales where 1 is prefect, 0 is no grading done... - // ...but first find the largest (absolute) value of the bias measures - if (max($bias) > abs(min($bias))) { - $maxbias = max($bias); - } - else { - $maxbias = abs(min($bias)); - } - - echo "

".get_string("studentgrades", "workshop", $course->student)."
\n"; - echo "
- \n"; - if ($useteachersgrades) { - echo "\n"; - } - if ($usepeergrades) { - echo "\n"; - } - if ($usebiasgrades) { - echo "\n"; - } - if ($usereliabilitygrades) { - echo "\n"; - } - if ($usegradinggrades) { - echo "\n"; - } - echo "\n"; - // now display the weights - echo "\n"; - if ($useteachersgrades) { - echo "\n"; - } - if ($usepeergrades) { - echo "\n"; - } - if ($usebiasgrades) { - echo "\n"; - } - if ($usereliabilitygrades) { - echo "\n"; - } - if ($usegradinggrades) { - echo "\n"; - } - echo "\n"; - foreach ($users as $user) { - // get user's best submission - $bestgrade = -1; - $teachergrade = 0; - $peergrade = 0; - if ($submissions = workshop_get_user_submissions($workshop, $user)) { - foreach ($submissions as $submission) { - $grade = ($submission->teachergrade * $WORKSHOP_FWEIGHTS[$teacherweight] + - $submission->peergrade * $WORKSHOP_FWEIGHTS[$peerweight]) / - ($WORKSHOP_FWEIGHTS[$teacherweight] + $WORKSHOP_FWEIGHTS[$peerweight]); - if ($grade > $bestgrade) { - $bestgrade = $grade; - $teachergrade = $submission->teachergrade; - $peergrade = $submission->peergrade; - $bestsubmission = $submission; - } - } - } - else { // funny this user did not submit - create a dummy submission to hold any grades they might have - unset($bestsubmission); - $bestsubmission->workshopid = $workshop->id; - $bestsubmission->userid = $user->id; - $bestsubmission->title = "No Submission"; - $bestsubmission->timecreated = 0; - if (!$bestsubmission->id = insert_record("workshop_submissions", $bestsubmission)) { - error("Unable to create dummy submission record"); - } - } - // biasgrade is scaled between zero and one NEED TO ADD TEST FOR NO PEER ASSESSMENTS OF SUBMITTED WORK - if ($maxbias) { - $biasgrade = max(($nbias[$user->id] / $workshop->nsassessments) - (abs($bias[$user->id]) / $maxbias), - 0.0); - } - else { - $biasgrade = 0; - } - // reliabilitygrade is scaled between zero and one - - if ($dumbreliability and $workshop->nsassessments) { - // nbias used here as it contains the number of assessments the user has done - $reliabilitygrade = max(($nbias[$user->id] / $workshop->nsassessments) - - ($reliability[$user->id] / $dumbreliability), 0.0); - } - else { - $reliabilitygrade = 0; - } - $biasscaled = intval($biasgrade * $workshop->grade + 0.5); - $reliabilityscaled = intval($reliabilitygrade * $workshop->grade + 0.5); - $gradingscaled = intval($gradinggrade[$user->id] * $workshop->grade / COMMENTSCALE + 0.5); - $finalgrade = intval((($teachergrade * $WORKSHOP_FWEIGHTS[$teacherweight] * $useteachersgrades) + - ($peergrade * $WORKSHOP_FWEIGHTS[$peerweight] * $usepeergrades) + - ($biasscaled * $WORKSHOP_FWEIGHTS[$biasweight] * $usebiasgrades) + - ($reliabilityscaled * $WORKSHOP_FWEIGHTS[$reliabilityweight] * $usereliabilitygrades) + - ($gradingscaled * $WORKSHOP_FWEIGHTS[$gradingweight] * $usegradinggrades) + 0.5) / - (($WORKSHOP_FWEIGHTS[$teacherweight] * $useteachersgrades) + - ($WORKSHOP_FWEIGHTS[$peerweight] * $usepeergrades) + - ($WORKSHOP_FWEIGHTS[$biasweight] * $usebiasgrades) + - ($WORKSHOP_FWEIGHTS[$reliabilityweight] * $usereliabilitygrades) + - ($WORKSHOP_FWEIGHTS[$gradingweight] * $usegradinggrades))); - echo ""; - if ($useteachersgrades) { - echo ""; - } - if ($usepeergrades) { - echo ""; - } - if ($usebiasgrades) { - echo ""; - } - if ($usereliabilitygrades) { - echo ""; - } - if ($usegradinggrades) { - echo ""; - } - echo "\n"; - - // save the grades - set_field("workshop_submissions", "biasgrade", $biasscaled, "id", $bestsubmission->id); - set_field("workshop_submissions", "reliabilitygrade", $reliabilityscaled, "id", $bestsubmission->id); - set_field("workshop_submissions", "gradinggrade", $gradingscaled, "id", $bestsubmission->id); - set_field("workshop_submissions", "finalgrade", $finalgrade, "id", $bestsubmission->id); - } - echo "
cellheading2\">$course->studentcellheading2\">".get_string("assessmentsby", "workshop", $course->teachers)."cellheading2\">".get_string("assessmentsby", "workshop", $course->students)."cellheading2\">".get_string("gradeforbias", "workshop")."cellheading2\">".get_string("gradeforreliability", "workshop")."cellheading2\">".get_string("gradeforassessments", "workshop")."cellheading2\">".get_string("overallgrade", "workshop")."
cellheading2\">".get_string("weights","workshop")."cellheading2\">$WORKSHOP_FWEIGHTS[$teacherweight]cellheading2\">$WORKSHOP_FWEIGHTS[$peerweight]cellheading2\">$WORKSHOP_FWEIGHTS[$biasweight]cellheading2\">$WORKSHOP_FWEIGHTS[$reliabilityweight]cellheading2\">$WORKSHOP_FWEIGHTS[$gradingweight]cellheading2\"> 
".fullname($user)."$teachergrade$peergrade$biasscaled$reliabilityscaled$gradingscaled$finalgrade

\n"; - print_string("allgradeshaveamaximumof", "workshop", $workshop->grade); - echo "

\n"; - - print_continue("view.php?a=$workshop->id"); - } - - - /*************** display final grades (by teacher) ***************************/ - elseif ($action == 'displayfinalgrades') { - // Get all the students - if (!$users = get_course_students($course->id, "u.lastname, u.firstname")) { - print_heading(get_string("nostudentsyet")); - print_footer($course); - exit; - } - - // get the final weights from the database - $teacherweight = get_field("workshop","teacherweight", "id", $workshop->id); - $peerweight = get_field("workshop","peerweight", "id", $workshop->id); - $includeteachersgrade = get_field("workshop","includeteachersgrade", "id", $workshop->id); - $biasweight = get_field("workshop","biasweight", "id", $workshop->id); - $reliabilityweight = get_field("workshop","reliabilityweight", "id", $workshop->id); - $gradingweight = get_field("workshop","gradingweight", "id", $workshop->id); - // work out what to show in the final grades tables and what to include in the calculation of the final grade - // teacher grades? - if ($workshop->gradingstrategy and $teacherweight) { - $useteachersgrades = 1; - } - else { - $useteachersgrades = 0; - } - // peergrades? - if ($workshop->gradingstrategy and $workshop->nsassessments and $peerweight) { - $usepeergrades = 1; - } - else { - $usepeergrades = 0; - } - // bias grades? - if ((($workshop->ntassessments >= 3) or ($workshop->nsassessments >= 3)) and ($useteachersgrades or $usepeergrades) - and $biasweight ) { - $usebiasgrades = 1; - } - else { - $usebiasgrades = 0; - } - // reliability grades? - if ((($workshop->ntassessments >= 3) or ($workshop->nsassessments >= 3)) and ($useteachersgrades or $usepeergrades) - and $reliabilityweight ) { - $usereliabilitygrades = 1; - } - else { - $usereliabilitygrades = 0; - } - // grading grades? - if (($workshop->ntassessments or $workshop->nsassessments) and $gradingweight ) { - $usegradinggrades = 1; - } - else { - $usegradinggrades = 0; - } - - // show the final grades as stored in the tables... - print_heading_with_help(get_string("displayoffinalgrades", "workshop"), "finalgrades", "workshop"); - echo "
- "; - echo ""; - if ($useteachersgrades) { - echo ""; - } - if ($usepeergrades) { - echo ""; - } - echo ""; - if ($usebiasgrades) { - echo ""; - } - if ($usereliabilitygrades) { - echo ""; - } - if ($usegradinggrades) { - echo ""; - } - echo "\n"; - // now the weights - echo ""; - echo "\n"; - if ($useteachersgrades) { - echo "\n"; - } - if ($usepeergrades) { - echo "\n"; - } - echo "\n"; - if ($usebiasgrades) { - echo "\n"; - } - if ($usereliabilitygrades) { - echo "\n"; - } - if ($usegradinggrades) { - echo "\n"; - } - echo "\n"; - foreach ($users as $user) { - if ($submissions = workshop_get_user_submissions($workshop, $user)) { - foreach ($submissions as $submission) { - echo ""; - echo "\n"; - if ($useteachersgrades) { - echo ""; - } - if ($usepeergrades) { - echo ""; - } - echo ""; - if ($usebiasgrades) { - echo ""; - } - if ($usereliabilitygrades) { - echo ""; - } - if ($usegradinggrades) { - echo ""; - } - echo "\n"; - } - } - } - echo "
cellheading2\">".$course->student."cellheading2\">".get_string("submission", "workshop")."cellheading2\" align=\"center\">".get_string("assessmentsby", "workshop", $course->teachers)."cellheading2\" align=\"center\">".get_string("assessmentsby", "workshop", $course->students)."cellheading2\" align=\"center\">".get_string("assessmentsdone", "workshop")."cellheading2\" align=\"center\">".get_string("gradeforbias", "workshop")."cellheading2\" align=\"center\">".get_string("gradeforreliability", "workshop")."cellheading2\" align=\"center\">".get_string("gradeforassessments", "workshop")."cellheading2\" align=\"center\">".get_string("overallgrade", "workshop")."
cellheading2\">".get_string("weights", "workshop")."cellheading2\" align=\"center\"> cellheading2\" align=\"center\">$WORKSHOP_FWEIGHTS[$teacherweight]cellheading2\" align=\"center\">$WORKSHOP_FWEIGHTS[$peerweight]cellheading2\" align=\"center\"> cellheading2\" align=\"center\">$WORKSHOP_FWEIGHTS[$biasweight]cellheading2\" align=\"center\">$WORKSHOP_FWEIGHTS[$reliabilityweight]cellheading2\" align=\"center\">$WORKSHOP_FWEIGHTS[$gradingweight]cellheading2\"> 
".fullname($user)."".workshop_print_submission_title($workshop, $submission)."".workshop_print_submission_assessments($workshop, $submission, "teacher")."".workshop_print_submission_assessments($workshop, $submission, "student")."".workshop_print_user_assessments($workshop, $user)."$submission->biasgrade$submission->reliabilitygrade$submission->gradinggrade$submission->finalgrade

\n"; - if ($workshop->showleaguetable) { - workshop_print_league_table($workshop); - if ($workshop->anonymous) { - echo "

".get_string("namesnotshowntostudents", "workshop", $course->students)."

\n"; - } - } - echo "

".get_string("allgradeshaveamaximumof", "workshop", $workshop->grade)."

\n"; - print_continue("view.php?a=$workshop->id"); - } - - - /*************** display final weights (by teacher) ***************************/ - elseif ($action == 'displayfinalweights') { - - if (!isteacher($course->id)) { - error("Only teachers can look at this page"); - } - - if ($workshop->phase != 5) { // is this at the expected phase? - print_heading(get_string("assignmentnotinthecorrectphase", "workshop")); - print_continue("view.php?a=$workshop->id"); - } - else { - - ?> -
- - -
- id); - $peerweight = get_field("workshop","peerweight", "id", $workshop->id); - $includeteachersgrade = get_field("workshop","includeteachersgrade", "id", $workshop->id); - $biasweight = get_field("workshop","biasweight", "id", $workshop->id); - $reliabilityweight = get_field("workshop","reliabilityweight", "id", $workshop->id); - $gradingweight = get_field("workshop","gradingweight", "id", $workshop->id); - - // now show the weights used in the final grades - print_heading_with_help(get_string("calculationoffinalgrades", "workshop"), "calculatingfinalgrade", "workshop"); - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "
cellheading2\">
". - get_string("weightsusedforfinalgrade", "workshop")."
".get_string("weightforteacherassessments", "workshop", $course->teacher).":"; - workshop_choose_from_menu($WORKSHOP_FWEIGHTS, "teacherweight", $teacherweight, ""); - echo "
".get_string("weightforpeerassessments", "workshop").":"; - workshop_choose_from_menu($WORKSHOP_FWEIGHTS, "peerweight", $peerweight, ""); - echo "
".get_string("weightforbias", "workshop").":"; - workshop_choose_from_menu($WORKSHOP_FWEIGHTS, "biasweight", $biasweight, ""); - echo "
".get_string("weightforreliability", "workshop").":"; - workshop_choose_from_menu($WORKSHOP_FWEIGHTS, "reliabilityweight", $reliabilityweight, ""); - echo "
".get_string("weightforgradingofassessments", "workshop").":"; - workshop_choose_from_menu($WORKSHOP_FWEIGHTS, "gradingweight", $gradingweight, ""); - echo "
cellheading2\">
". - get_string("optionforpeergrade", "workshop")."
".get_string("includeteachersgrade", "workshop").":"; - $options[0] = get_string("no"); $options[1] = get_string("yes"); - choose_from_menu($options, "includeteachersgrade", $includeteachersgrade, ""); - helpbutton("includeteachersgrade", get_string("includeteachersgrade", "workshop"), "workshop"); - echo "
\n"; - - print_heading_with_help(get_string("leaguetable", "workshop"), "leaguetable", "workshop"); - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "
".get_string("numberofentries", "workshop").":"; - $numbers[22] = 'All'; - $numbers[21] = 50; - for ($i=20; $i>=0; $i--) { - $numbers[$i] = $i; - } - $nentries = $workshop->showleaguetable; - if ($nentries == 99) { - $nentries = 'All'; - } - choose_from_menu($numbers, "nentries", "$nentries", ""); - echo "

".get_string("hidenamesfromstudents", "workshop", $course->students)."

\n"; - $options[0] = get_string("no"); $options[1] = get_string("yes"); - choose_from_menu($options, "anonymous", $workshop->anonymous, ""); - echo "

\n"; - echo "\n"; - echo "
"; - echo "
\n"; - } - } - - - /******************* list all submissions ************************************/ - elseif ($action == 'listallsubmissions' ) { - if (!$users = get_course_students($course->id)) { - print_heading(get_string("nostudentsyet")); - print_footer($course); - exit; - } - print_heading(get_string("listofallsubmissions", "workshop").":", "CENTER"); - workshop_list_all_submissions($workshop, $USER); - print_continue("view.php?id=$cm->id"); - - } - - - /******************* list for assessment student (submissions) ************************************/ - elseif ($action == 'listforassessmentstudent' ) { - if (!$users = get_course_students($course->id)) { - print_heading(get_string("nostudentsyet")); - print_footer($course); - exit; - } - workshop_list_unassessed_student_submissions($workshop, $USER); - print_continue("view.php?id=$cm->id"); - - } - - - /******************* list for assessment teacher (submissions) ************************************/ - elseif ($action == 'listforassessmentteacher' ) { - if (!$users = get_course_students($course->id)) { - print_heading(get_string("nostudentsyet")); - print_footer($course); - exit; - } - workshop_list_unassessed_teacher_submissions($workshop, $USER); - print_continue("view.php?id=$cm->id"); - - } - - - /******************* save analysis options (for teachers only) ************************************/ - elseif ($action == 'saveanalysisoptions' ) { - + // skip if student not in group + if ($groupid) { + if (!ismember($groupid, $user->id)) { + continue; + } + } + if ($submissions = workshop_get_user_submissions($workshop, $user)) { + $gradinggrade = workshop_gradinggrade($workshop, $user); + foreach ($submissions as $submission) { + $grade = workshop_submission_grade($workshop, $submission); + echo "$user->firstname $user->lastname"; + echo "".workshop_print_submission_title($workshop, $submission)."\n"; + echo "".workshop_print_user_assessments($workshop, $user).""; + echo "$gradinggrade"; + echo "".workshop_print_submission_assessments($workshop, $submission, + "teacher").""; + echo "".workshop_print_submission_assessments($workshop, $submission, + "student").""; + echo "$grade"; + echo "".number_format($gradinggrade + $grade, 1)."\n"; + } + } + } + echo "
\n"; + workshop_print_key($workshop); + if ($workshop->showleaguetable) { + workshop_print_league_table($workshop); + if ($workshop->anonymous) { + echo "

".get_string("namesnotshowntostudents", "workshop", $course->students)."

\n"; + } + } + echo "

".get_string("allgradeshaveamaximumof", "workshop", $workshop->grade)."

\n"; + print_continue("view.php?id=$cm->id"); + } + + + /******************* list all submissions ************************************/ + elseif ($action == 'listallsubmissions' ) { + if (!$users = get_course_students($course->id)) { + print_heading(get_string("nostudentsyet")); + print_footer($course); + exit; + } + print_heading(get_string("listofallsubmissions", "workshop").":", "CENTER"); + workshop_list_all_submissions($workshop, $USER); + print_continue("view.php?id=$cm->id"); + + } + + + /******************* list for assessment student (submissions) ************************************/ + elseif ($action == 'listforassessmentstudent' ) { + if (!$users = get_course_students($course->id)) { + print_heading(get_string("nostudentsyet")); + print_footer($course); + exit; + } + workshop_list_unassessed_student_submissions($workshop, $USER); + print_continue("view.php?id=$cm->id"); + + } + + + /******************* list for assessment teacher (submissions) ************************************/ + elseif ($action == 'listforassessmentteacher' ) { + if (!isteacher($course->id)) { - error("Only teachers can look at this page"); - } + error("Only teachers can look at this page"); + } - set_field("workshop", "teacherloading", $_POST['teacherloading'], "id", "$workshop->id"); - set_field("workshop", "gradingweight", $_POST['gradingweight'], "id", "$workshop->id"); - set_field("workshop", "assessmentstodrop", $_POST['assessmentstodrop'], "id", "$workshop->id"); - redirect("submissions.php?id=$cm->id&action=analysisofassessments", - get_string("savedok", "workshop")); - - } - + workshop_list_unassessed_teacher_submissions($workshop, $USER); + print_continue("view.php?id=$cm->id"); + + } + /*************** update (league table options teacher) ***************************/ elseif ($action == 'updateleaguetable') { @@ -1397,23 +304,6 @@ } - /*************** update over allocation (by teacher) ***************************/ - elseif ($action == 'updateoverallocation') { - - if (!isteacher($course->id)) { - error("Only teachers can look at this page"); - } - - $form = (object)$_POST; - - set_field("workshop", "overallocation", $form->overallocation, "id", $workshop->id); - echo "

".get_string("overallocation", "workshop").": $form->overallocation

\n"; - add_to_log($course->id, "workshop", "over allocation", "view.php?id=$cm->id", $form->overallocation,$cm->id); - - redirect("submissions.php?action=adminlist&id=$cm->id"); - } - - /******************* user confirm delete ************************************/ elseif ($action == 'userconfirmdelete' ) { diff --git a/mod/workshop/upload.php b/mod/workshop/upload.php index 29fb776110..8ed2171494 100644 --- a/mod/workshop/upload.php +++ b/mod/workshop/upload.php @@ -11,11 +11,9 @@ if (! $cm = get_record("course_modules", "id", $id)) { error("Course Module ID was incorrect"); } - if (! $course = get_record("course", "id", $cm->course)) { error("Course is misconfigured"); } - if (! $workshop = get_record("workshop", "id", $cm->instance)) { error("Course module is incorrect"); } @@ -108,8 +106,8 @@ else { notify(get_string("uploadnofilefound", "assignment")); } - } - print_continue("view.php?a=$workshop->id"); + } + print_continue("view.php?id=$cm->id"); print_footer($course); diff --git a/mod/workshop/version.php b/mod/workshop/version.php index fa67847064..bfc90b1b04 100644 --- a/mod/workshop/version.php +++ b/mod/workshop/version.php @@ -5,7 +5,7 @@ // This fragment is called by /admin/index.php //////////////////////////////////////////////////////////////////////////////// -$module->version = 2004060400; +$module->version = 2004081100; $module->requires = 2004052505; // Requires this Moodle version $module->cron = 60; diff --git a/mod/workshop/view.php b/mod/workshop/view.php index d6dcc523a0..cd9ee17b76 100644 --- a/mod/workshop/view.php +++ b/mod/workshop/view.php @@ -19,34 +19,18 @@ require("../../config.php"); require("lib.php"); require("locallib.php"); - - optional_variable($id); // Course Module ID - optional_variable($a); // workshop ID + + require_variable($id); // Course Module ID // get some useful stuff... - if ($id) { - if (! $cm = get_record("course_modules", "id", $id)) { - error("Course Module ID was incorrect"); - } - - if (! $course = get_record("course", "id", $cm->course)) { - error("Course is misconfigured"); - } - - if (! $workshop = get_record("workshop", "id", $cm->instance)) { - error("Course module is incorrect"); - } - - } else { - if (! $workshop = get_record("workshop", "id", $a)) { - error("Course module is incorrect"); - } - if (! $course = get_record("course", "id", $workshop->course)) { - error("Course is misconfigured"); - } - if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $course->id)) { - error("Course Module ID was incorrect"); - } + if (! $cm = get_record("course_modules", "id", $id)) { + error("Course Module ID was incorrect"); + } + if (! $course = get_record("course", "id", $cm->course)) { + error("Course is misconfigured"); + } + if (! $workshop = get_record("workshop", "id", $cm->instance)) { + error("Course module is incorrect"); } require_login($course->id); @@ -66,258 +50,163 @@ optional_variable($action); if (isteacher($course->id)) { - if (empty($action)) { // no action specified, either go straight to elements page else the admin page - // has the assignment any elements - if (count_records("workshop_elements", "workshopid", $workshop->id) >= $workshop->nelements) { - $action = "teachersview"; - } - else { - redirect("assessments.php?action=editelements&id=$cm->id"); - } - } - } - elseif (!isguest()) { // it's a student then - if (!$cm->visible) { - notice(get_string("activityiscurrentlyhidden")); - } - switch ($workshop->phase) { - case 0 : - case 1 : $action = 'notavailable'; break; - case 2 : - case 3 : - case 4 : $action = 'studentsview'; break; - case 5 : $action = 'notavailable'; break; - case 6 : $action = 'displayfinalgrade'; - } - } - else { // it's a guest, oh no! - $action = 'notavailable'; - } - - - /************** allow (peer) assessments only (move to phase 4) (for teachers)**/ - if ($action == 'allowassessments') { - - if (!isteacher($course->id)) { - error("Only teachers can look at this page"); - } - - // move to phase 4 - set_field("workshop", "phase", 4, "id", "$workshop->id"); - add_to_log($course->id, "workshop", "assessments only", "view.php?id=$cm->id", "$workshop->id", $cm->id); - redirect("view.php?a=$workshop->id", get_string("movingtophase", "workshop", 4)); - } - - - /************** allow both (submissions and assessments) (move to phase 3) (for teachers)**/ - if ($action == 'allowboth') { - - if (!isteacher($course->id)) { - error("Only teachers can look at this page"); - } - - // move to phase 3 - set_field("workshop", "phase", 3, "id", "$workshop->id"); - add_to_log($course->id, "workshop", "allow both", "view.php?id=$cm->id", "$workshop->id", $cm->id); - redirect("view.php?a=$workshop->id", get_string("movingtophase", "workshop", 3)); - } - - - /************** allow submissions only (move to phase 2) (for teachers)**/ - if ($action == 'allowsubmissions') { - - if (!isteacher($course->id)) { - error("Only teachers can look at this page"); - } + if (empty($action)) { // no action specified, either go straight to elements page else the admin page + // has the assignment any elements + if (count_records("workshop_elements", "workshopid", $workshop->id) >= $workshop->nelements) { + $action = "teachersview"; + } + else { + redirect("assessments.php?action=editelements&id=$cm->id"); + } + } + } + elseif (!isguest()) { // it's a student then + if (!$cm->visible) { + notice(get_string("activityiscurrentlyhidden")); + } + switch ($workshop->phase) { + case 0 : + case 1 : $action = 'notavailable'; break; + case 2 : + case 3 : + case 4 : $action = 'studentsview'; break; + case 5 : $action = 'displayfinalgrade'; + } + } + else { // it's a guest, oh no! + $action = 'notavailable'; + } + + + /************** allow (peer) assessments only (move to phase 4) (for teachers)**/ + if ($action == 'allowassessments') { + + if (!isteacher($course->id)) { + error("Only teachers can look at this page"); + } + + // move to phase 4 + set_field("workshop", "phase", 4, "id", "$workshop->id"); + add_to_log($course->id, "workshop", "assessments only", "view.php?id=$cm->id", "$workshop->id", $cm->id); + redirect("view.php?id=$cm->id", get_string("movingtophase", "workshop", 4)); + } + + + /************** allow both (submissions and assessments) (move to phase 3) (for teachers)**/ + if ($action == 'allowboth') { + + if (!isteacher($course->id)) { + error("Only teachers can look at this page"); + } + + // move to phase 3 + set_field("workshop", "phase", 3, "id", "$workshop->id"); + add_to_log($course->id, "workshop", "allow both", "view.php?id=$cm->id", "$workshop->id", $cm->id); + redirect("view.php?id=$cm->id", get_string("movingtophase", "workshop", 3)); + } + + + /************** allow submissions only (move to phase 2) (for teachers)**/ + if ($action == 'allowsubmissions') { + + if (!isteacher($course->id)) { + error("Only teachers can look at this page"); + } // move to phase 2, check that teacher has made enough submissions if (workshop_count_teacher_submissions($workshop) < $workshop->ntassessments) { redirect("view.php?id=$cm->id", get_string("notenoughexamplessubmitted", "workshop", $course->teacher)); - } - else { + } + else { + if ($n = workshop_count_teacher_submissions_for_assessment($workshop, $USER)) { + notify(get_string("teachersubmissionsforassessment", "workshop", $n)); + } set_field("workshop", "phase", 2, "id", "$workshop->id"); - add_to_log($course->id, "workshop", "submissions", "view.php?id=$cm->id", "$workshop->id", $cm->id); - redirect("view.php?id=$cm->id", get_string("movingtophase", "workshop", 2)); - } - } - - - /****************** close workshop for student assessments/submissions (move to phase 5) (for teachers)**/ - elseif ($action == 'closeworkshop') { - - if (!isteacher($course->id)) { - error("Only teachers can look at this page"); - } - - // move to phase 5 - set_field("workshop", "phase", 5, "id", "$workshop->id"); - add_to_log($course->id, "workshop", "close", "view.php?id=$cm->id", "$workshop->id", $cm->id); - redirect("view.php?a=$workshop->id", get_string("movingtophase", "workshop", 5)); - } - - - /****************** display final grade (for students) ************************************/ - elseif ($action == 'displayfinalgrade' ) { - - // get the final weights from the database - $teacherweight = get_field("workshop","teacherweight", "id", $workshop->id); - $peerweight = get_field("workshop","peerweight", "id", $workshop->id); - $includeteachersgrade = get_field("workshop","includeteachersgrade", "id", $workshop->id); - $biasweight = get_field("workshop","biasweight", "id", $workshop->id); - $reliabilityweight = get_field("workshop","reliabilityweight", "id", $workshop->id); - $gradingweight = get_field("workshop","gradingweight", "id", $workshop->id); - // work out what to show in the final grades tables and what to include in the calculation of the final grade - // teacher grades? - if ($workshop->gradingstrategy and $teacherweight) { - $useteachersgrades = 1; - } - else { - $useteachersgrades = 0; - } - // peergrades? - if ($workshop->gradingstrategy and $workshop->nsassessments and $peerweight) { - $usepeergrades = 1; - } - else { - $usepeergrades = 0; - } - // bias grades? - if ((($workshop->ntassessments >= 3) or ($workshop->nsassessments >= 3)) and $biasweight ) { - $usebiasgrades = 1; - } - else { - $usebiasgrades = 0; - } - // reliability grades? - if ((($workshop->ntassessments >= 3) or ($workshop->nsassessments >= 3)) and $reliabilityweight ) { - $usereliabilitygrades = 1; - } - else { - $usereliabilitygrades = 0; - } - // grading grades? - if (($workshop->ntassessments or $workshop->nsassessments) and $gradingweight ) { - $usegradinggrades = 1; - } - else { - $usegradinggrades = 0; - } - - // show the final grades as stored in the tables... - print_heading_with_help(get_string("displayoffinalgrades", "workshop"), "finalgrades", "workshop"); - if ($submissions = workshop_get_user_submissions($workshop, $USER)) { // any submissions from user? - echo "
"; - echo ""; - if ($useteachersgrades) { - echo "
".get_string("submissions", "workshop")."".get_string("teacherassessments", "workshop", + add_to_log($course->id, "workshop", "submissions", "view.php?id=$cm->id", "$workshop->id", $cm->id); + redirect("view.php?id=$cm->id", get_string("movingtophase", "workshop", 2)); + } + } + + + /****************** display final grade (for students) ************************************/ + elseif ($action == 'displayfinalgrade' ) { + + + // show the final grades as stored in the tables... + print_heading_with_help(get_string("displayoffinalgrades", "workshop"), "finalgrades", "workshop"); + if ($submissions = workshop_get_user_submissions($workshop, $USER)) { // any submissions from user? + echo "
"; + echo ""; + echo ""; + echo ""; + echo ""; - } - if ($usepeergrades) { - echo ""; - } - echo ""; - if ($usebiasgrades) { - echo ""; - } - if ($usereliabilitygrades) { - echo ""; - } - if ($usegradinggrades) { - echo ""; - } + echo ""; echo "\n"; - // now the weights - echo ""; - if ($useteachersgrades) { - echo "\n"; - } - if ($usepeergrades) { - echo "\n"; - } - echo "\n"; - if ($usebiasgrades) { - echo "\n"; - } - if ($usereliabilitygrades) { - echo "\n"; - } - if ($usegradinggrades) { - echo "\n"; - } - echo "\n"; + $gradinggrade = workshop_gradinggrade($workshop, $USER); foreach ($submissions as $submission) { + $grade = workshop_submission_grade($workshop, $submission); echo "\n"; - if ($useteachersgrades) { - echo ""; + echo ""; + echo ""; - } - if ($usepeergrades) { - echo ""; - } - echo ""; - if ($usebiasgrades) { - echo ""; - } - if ($usereliabilitygrades) { - echo ""; - } - if ($usegradinggrades) { - echo ""; - } - echo "\n"; + echo ""; + echo "\n"; } } echo "
".get_string("submissions", "workshop")."".get_string("assessmentsdone", "workshop")."".get_string("gradeforassessments", "workshop")."".get_string("teacherassessments", "workshop", $course->teacher)."".get_string("studentassessments", "workshop", + echo "".get_string("studentassessments", "workshop", $course->student)."".get_string("assessmentsdone", "workshop")."".get_string("gradeforbias", "workshop")."".get_string("gradeforreliability", "workshop")."".get_string("gradeforassessments", "workshop")."".get_string("gradeforsubmission", "workshop")."".get_string("overallgrade", "workshop")."
".get_string("weights", "workshop")."$WORKSHOP_FWEIGHTS[$teacherweight]$WORKSHOP_FWEIGHTS[$peerweight] $WORKSHOP_FWEIGHTS[$biasweight]$WORKSHOP_FWEIGHTS[$reliabilityweight]$WORKSHOP_FWEIGHTS[$gradingweight] 
".workshop_print_submission_title($workshop, $submission)."".workshop_print_submission_assessments($workshop, + echo "".workshop_print_user_assessments($workshop, $USER)."$gradinggrade".workshop_print_submission_assessments($workshop, $submission, "teacher")."".workshop_print_submission_assessments($workshop, + echo "".workshop_print_submission_assessments($workshop, $submission, "student")."".workshop_print_user_assessments($workshop, $USER)."$submission->biasgrade$submission->reliabilitygrade$submission->gradinggrade$submission->finalgrade
$grade".number_format($gradinggrade + $grade, 1)."

\n"; - echo "

< > ".get_string("assessmentdropped", "workshop")."

\n"; + workshop_print_key($workshop); if ($workshop->showleaguetable) { - workshop_print_league_table($workshop); - } - echo "
".get_string("allgradeshaveamaximumof", "workshop", $workshop->grade); - } - - - /****************** make final grades available (go to phase 6) (for teachers only)********/ - elseif ($action == 'makefinalgradesavailable') { - - if (!isteacher($course->id)) { - error("Only teachers can look at this page"); - } - - set_field("workshop", "phase", 6, "id", "$workshop->id"); - add_to_log($course->id, "workshop", "display grades", "view.php?id=$cm->id", "$workshop->id", $cm->id); - redirect("view.php?a=$workshop->id", get_string("movingtophase", "workshop", 6)); - } - - - /****************** assignment not available (for students)***********************/ - elseif ($action == 'notavailable') { - print_heading(get_string("notavailable", "workshop")); - } - - - /****************** set up assignment (move back to phase 1) (for teachers)***********************/ - elseif ($action == 'setupassignment') { - - if (!isteacher($course->id)) { - error("Only teachers can look at this page"); - } - - set_field("workshop", "phase", 1, "id", "$workshop->id"); - add_to_log($course->id, "workshop", "set up", "view.php?id=$cm->id", "$workshop->id", $cm->id); - redirect("view.php?a=$workshop->id", get_string("movingtophase", "workshop", 1)); - } - - - /****************** student's view could be in 1 of 4 stages ***********************/ - elseif ($action == 'studentsview') { - workshop_print_assignment_info($workshop); - // in Stage 1? - are there any teacher's submissions? and... - // ...has student assessed the required number of the teacher's submissions - if ($workshop->ntassessments and (!workshop_test_user_assessments($workshop, $USER))) { - print_heading(get_string("pleaseassesstheseexamplesfromtheteacher", "workshop", + workshop_print_league_table($workshop); + } + } + + + /****************** make final grades available (go to phase 5) (for teachers only)********/ + elseif ($action == 'makefinalgradesavailable') { + + if (!isteacher($course->id)) { + error("Only teachers can look at this page"); + } + + set_field("workshop", "phase", 5, "id", "$workshop->id"); + add_to_log($course->id, "workshop", "display grades", "view.php?id=$cm->id", "$workshop->id", $cm->id); + redirect("view.php?id=$cm->id", get_string("movingtophase", "workshop", 5)); + } + + + /****************** assignment not available (for students)***********************/ + elseif ($action == 'notavailable') { + print_heading(get_string("notavailable", "workshop")); + } + + + /****************** set up assignment (move back to phase 1) (for teachers)***********************/ + elseif ($action == 'setupassignment') { + + if (!isteacher($course->id)) { + error("Only teachers can look at this page"); + } + + set_field("workshop", "phase", 1, "id", "$workshop->id"); + add_to_log($course->id, "workshop", "set up", "view.php?id=$cm->id", "$workshop->id", $cm->id); + redirect("view.php?id=$cm->id", get_string("movingtophase", "workshop", 1)); + } + + + /****************** student's view could be in 1 of 4 stages ***********************/ + elseif ($action == 'studentsview') { + workshop_print_assignment_info($workshop); + // in Stage 1? - are there any teacher's submissions? and... + // ...has student assessed the required number of the teacher's submissions + if ($workshop->ntassessments and (!workshop_test_user_assessments($workshop, $USER))) { + print_heading(get_string("pleaseassesstheseexamplesfromtheteacher", "workshop", $course->teacher)); workshop_list_teacher_submissions($workshop, $USER); } @@ -341,11 +230,6 @@ } // in stage 3? - grade other student's submissions, resubmit and list all submissions else { - // list any assessments by teachers - if (workshop_count_teacher_assessments($workshop, $USER)) { - print_heading(get_string("assessmentsby", "workshop", $course->teachers)); - workshop_list_teacher_assessments($workshop, $USER); - } // is self assessment used in this workshop? if ($workshop->includeself) { // prints a table if there are any submissions which have not been self assessed yet @@ -360,6 +244,11 @@ print_heading(get_string("yourassessments", "workshop")); workshop_list_assessed_submissions($workshop, $USER); } + // list any assessments by teachers + if (workshop_count_teacher_assessments($workshop, $USER)) { + print_heading(get_string("assessmentsby", "workshop", $course->teachers)); + workshop_list_teacher_assessments($workshop, $USER); + } // ... and show peer assessments if (workshop_count_peer_assessments($workshop, $USER)) { print_heading(get_string("assessmentsby", "workshop", $course->students)); @@ -384,63 +273,74 @@ echo "
"; } } - } - // allow user to list their submissions and assessments in a general way???? - // print_heading("id\">". - // get_string("listofallsubmissions", "workshop")); - } - } - } - - - /****************** submission of assignment by teacher only***********************/ - elseif ($action == 'submitassignment') { - - if (!isteacher($course->id)) { - error("Only teachers can look at this page"); - } - - $strdifference = format_time($workshop->deadline - time()); - if (($workshop->deadline - time()) < 0) { - $strdifference = "$strdifference"; - } - $strduedate = userdate($workshop->deadline)." ($strdifference)"; - - workshop_print_assignment_info($workshop); + } + // allow user to list their submissions and assessments in a general way???? + // print_heading("id\">". + // get_string("listofallsubmissions", "workshop")); + } + } + } + + + /****************** submission of assignment by teacher only***********************/ + elseif ($action == 'submitassignment') { + + if (!isteacher($course->id)) { + error("Only teachers can look at this page"); + } + + $strdifference = format_time($workshop->deadline - time()); + if (($workshop->deadline - time()) < 0) { + $strdifference = "$strdifference"; + } + $strduedate = userdate($workshop->deadline)." ($strdifference)"; + + workshop_print_assignment_info($workshop); + + // list previous submissions from teacher + workshop_list_user_submissions($workshop, $USER); + + echo "
"; + + // print upload form + print_heading(get_string("submitassignment", "assignment").":"); + workshop_print_upload_form($workshop); + } + + + /****************** teacher's view - display admin page (current phase options) ************/ + elseif ($action == 'teachersview') { + + if (!isteacher($course->id)) { + error("Only teachers can look at this page"); + } + + /// Check to see if groups are being used in this workshop + /// and if so, set $currentgroup to reflect the current group + $changegroup = isset($_GET['group']) ? $_GET['group'] : -1; // Group change requested? + $groupmode = groupmode($course, $cm); // Groups are being used? + $currentgroup = get_and_set_current_group($course, $groupmode, $changegroup); - // list previous submissions from teacher - workshop_list_user_submissions($workshop, $USER); - - echo "
"; - - // print upload form - print_heading(get_string("submitassignment", "assignment").":"); - workshop_print_upload_form($workshop); - } - - - /****************** teacher's view - display admin page (current phase options) ************/ - elseif ($action == 'teachersview') { - - if (!isteacher($course->id)) { - error("Only teachers can look at this page"); + /// Allow the teacher to change groups (for this session) + if ($groupmode) { + if ($groups = get_records_menu("groups", "courseid", $course->id, "name ASC", "id,name")) { + print_group_menu($groups, $groupmode, $currentgroup, "view.php?id=$cm->id"); + } } - - print_heading_with_help(get_string("managingassignment", "workshop"), "managing", "workshop"); - - workshop_print_assignment_info($workshop); - - $tabs->names = array("1. ".get_string("phase1", "workshop"), + + print_heading_with_help(get_string("managingassignment", "workshop"), "managing2", "workshop"); + + workshop_print_assignment_info($workshop); + + $tabs->names = array("1. ".get_string("phase1", "workshop"), "2. ".get_string("phase2", "workshop", $course->student), "3. ".get_string("phase3", "workshop", $course->student), "4. ".get_string("phase4", "workshop", $course->student), - "5. ".get_string("phase5", "workshop"), - "6. ".get_string("phase6", "workshop")); + "5. ".get_string("phase5", "workshop")); $tabs->urls = array("view.php?id=$cm->id&action=setupassignment", "view.php?id=$cm->id&action=allowsubmissions", "view.php?id=$cm->id&action=allowboth", "view.php?id=$cm->id&action=allowassessments", - "view.php?id=$cm->id&action=closeworkshop", "view.php?id=$cm->id&action=makefinalgradesavailable"); if ($workshop->phase) { // phase 1 or more $tabs->highlight = $workshop->phase - 1; @@ -475,18 +375,19 @@ case 2: // submissions and assessments case 3: case 4: - if ($workshop->ntassessments) { // if teacher example show student assessments link - echo "

id&action=listungradedteachersubmissions\">". - get_string("ungradedassessmentsofteachersubmissions", "workshop", - workshop_count_ungraded_assessments_teacher($workshop))." \n"; - helpbutton("ungradedassessments_teacher", - get_string("ungradedassessmentsofteachersubmissions", "workshop"), "workshop"); - } - echo "

id&action=listungradedstudentsubmissions\">". - get_string("ungradedassessmentsofstudentsubmissions", "workshop", - workshop_count_ungraded_assessments_student($workshop))." \n"; - helpbutton("ungradedassessments_student", - get_string("ungradedassessmentsofstudentsubmissions", "workshop"), "workshop"); + if ($workshop->ntassessments) { // if teacher examples show student assessments link + if ($n = workshop_count_teacher_submissions_for_assessment($workshop, $USER)) { + echo "

id&action=listforassessmentteacher\">". + get_string("teachersubmissionsforassessment", "workshop", $n)." \n"; + helpbutton("assessmentofexamples", get_string("teachersubmissionsforassessment", + "workshop"), "workshop"); + } + } + echo "

id&action=gradeallassessments\">". + get_string("ungradedassessments", "workshop", + workshop_count_ungraded_assessments($workshop))." \n"; + helpbutton("ungradedassessments", + get_string("ungradedassessments", "workshop"), "workshop"); echo "

id&action=listforassessmentstudent\">". get_string("studentsubmissionsforassessment", "workshop", workshop_count_student_submissions_for_assessment($workshop, $USER))." \n"; @@ -494,31 +395,24 @@ get_string("studentsubmissionsforassessment", "workshop"), "workshop"); break; - case 5: // calculate final grades - if ($workshop->ntassessments) { // if teacher example show student assessments link - echo "

id&action=listungradedteachersubmissions\">". - get_string("ungradedassessmentsofteachersubmissions", "workshop", - workshop_count_ungraded_assessments_teacher($workshop))." \n"; - helpbutton("ungradedassessments_teacher", - get_string("ungradedassessmentsofteachersubmissions", "workshop"), "workshop"); - } - echo "

id&action=listungradedstudentsubmissions\">". - get_string("ungradedassessmentsofstudentsubmissions", "workshop", - workshop_count_ungraded_assessments_student($workshop))." \n"; - helpbutton("ungradedassessments_student", - get_string("ungradedassessmentsofstudentsubmissions", "workshop"), "workshop"); + case 5: // Show "Final" Grades + if ($workshop->ntassessments) { // if teacher examples show student assessments link + if ($n = workshop_count_teacher_submissions_for_assessment($workshop, $USER)) { + echo "

id&action=listforassessmentteacher\">". + get_string("teachersubmissionsforassessment", "workshop", $n)." \n"; + helpbutton("assessmentofexamples", get_string("teachersubmissionsforassessment", + "workshop"), "workshop"); + } + } + echo "

id&action=gradeallassessments\">". + get_string("ungradedassessments", "workshop", + workshop_count_ungraded_assessments($workshop))." \n"; + helpbutton("ungradedassessments", get_string("ungradedassessments", "workshop"), "workshop"); echo "

id&action=listforassessmentstudent\">". get_string("studentsubmissionsforassessment", "workshop", workshop_count_student_submissions_for_assessment($workshop, $USER))." \n"; helpbutton("gradingsubmissions", get_string("studentsubmissionsforassessment", "workshop"), "workshop"); - print_heading("id&action=displayfinalweights\">". - get_string("calculationoffinalgrades", "workshop").""); - print_heading("id&action=analysisofassessments\">". - get_string("analysisofassessments", "workshop").""); - break; - - case 6: // show final grades print_heading("id&action=displayfinalgrades\">". get_string("displayoffinalgrades", "workshop").""); }