$submitted = "<span class=\"redfont\">" . userdate($submission->timecreated) . "</span>"; } if (!$workshop->visible) { //Show dimmed if the mod is hidden $link = "<a class=\"dimmed\" href=\"view.php?id={$workshop->coursemodule}\">" . format_string($workshop->name, true) . "</a><br />"; } else { //Show normal if the mod is visible $link = "<a href=\"view.php?id={$workshop->coursemodule}\">" . format_string($workshop->name, true) . "</a><br />"; } if (workshop_is_student($workshop)) { $link .= " ({$submission->title})"; // show students the title of their submission(s) $gradinggrade = workshop_gradinggrade($workshop, $USER); $grade = workshop_submission_grade($workshop, $submission); if ($workshop->wtype) { if (workshop_count_assessments($submission)) { $info = get_string("gradeforassessments", "workshop") . ": {$gradinggrade}/{$workshop->gradinggrade}; " . get_string("gradeforsubmission", "workshop") . ": {$grade}/{$workshop->grade}"; } else { $info = get_string("gradeforassessments", "workshop") . ": {$gradinggrade}/{$workshop->gradinggrade}; " . get_string("gradeforsubmission", "workshop") . ": " . get_string("noassessments", "workshop"); } } else { // simple assignemnt, don't show grading grade $info = get_string("gradeforsubmission", "workshop") . ": {$grade}/{$workshop->grade}"; } if ($workshop->releasegrades > $timenow) { $info = get_string("notavailable", "workshop"); } } if ($course->format == "weeks" or $course->format == "topics") { $table->data[] = array($workshop->section, $link, $info, $submitted, $due); } else {
function workshop_grade_assessments($workshop, $verbose = false) { global $WORKSHOP_EWEIGHTS; // timeout after 10 minutes @set_time_limit(600); $timenow = time(); // set minumim value for the variance (of the elements) $minvar = 0.05; // check when the standard deviations were calculated $oldtotalassessments = get_field("workshop_elements", "totalassessments", "workshopid", $workshop->id, "elementno", 0); $totalassessments = count_records("workshop_assessments", "workshopid", $workshop->id); // calculate the std. devs every 10 assessments for low numbers of assessments, thereafter every 100 new assessments if ($totalassessments < 100 and $totalassessments - $oldtotalassessments > 10 or $totalassessments - $oldtotalassessments > 100) { // 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 (workshop_is_teacher($workshop, $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 (workshop_is_teacher($workshop, $assessment->userid)) { $num[$submission->id] += $workshop->teacherweight; // weight teacher's assessment } else { $num[$submission->id]++; // number of assessments } $nassessments[$submission->id]++; } else { if (workshop_is_teacher($workshop, $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 (workshop_is_teacher($workshop, $assessment->userid)) { $sum[$submission->id][$i] += $workshop->teacherweight * $grade; // teacher's grade } else { $sum[$submission->id][$i] += $grade; // student's grade } } else { if (workshop_is_teacher($workshop, $assessment->userid)) { $sum[$submission->id][$i] = $workshop->teacherweight * $grade; // teacher's grade } else { $sum[$submission->id][$i] = $grade; // students's grade } } } } } } 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]}<br />\n"; } $total += $n; // weighted total } } if ($verbose) { echo "<p style=\"text-align:center\">" . get_string("numberofsubmissions", "workshop", count($num)) . "<br />\n"; echo get_string("numberofassessmentsweighted", "workshop", $total) . "</p>\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++) { if ($n > 1) { $sd[$i] = sqrt($var[$i] / ($n - 1)); } else { $sd[$i] = 0; } set_field("workshop_elements", "stddev", $sd[$i], "workshopid", $workshop->id, "elementno", $i); set_field("workshop_elements", "totalassessments", $totalassessments, "workshopid", $workshop->id, "elementno", $i); if ($verbose) { echo get_string("standarddeviationofelement", "workshop", $i + 1) . " {$sd[$i]}<br />"; if ($sd[$i] <= $minvar) { print_string("standarddeviationnote", "workshop") . "<br />\n"; } } } } } // this section looks at each submission if the number of assessments made has increased it recalculates the // grading grades for those assessments // first get the assignment elements for the weights and the stddevs... if ($elementsraw = get_records("workshop_elements", "workshopid", $workshop->id, "elementno ASC")) { foreach ($elementsraw as $element) { $weight[] = $element->weight; // to renumber index 0,1,2... $sd[] = $element->stddev; // to renumber index 0,1,2... } } unset($num); // may have been used in calculating stddevs unset($sum); // ditto if ($submissions = get_records("workshop_submissions", "workshopid", $workshop->id)) { foreach ($submissions as $submission) { // see if the number of assessments has changed $nassessments = workshop_count_assessments($submission); if ($submission->nassessments != $nassessments) { // ...if there are three or more assessments calculate the variance of each assessment. // Use the variance to find the "best" assessment. (When there is only one or two assessments they // are not altered by this routine.) if ($verbose) { echo "Processing submission {$submission->id} ({$nassessments} asessments)...\n"; } if ($nassessments > 2) { $num = 0; // weighted number of assessments for ($i = 0; $i < $workshop->nelements; $i++) { $sum[$i] = 0; // weighted sum of grades } if ($assessments = workshop_get_assessments($submission)) { // first calculate the mean grades for each element foreach ($assessments as $assessment) { // test if assessment is "good", a teacher assessment always "good", but may be weighted out if (workshop_is_teacher($workshop, $assessment->userid)) { if (!$workshop->teacherweight) { // drop teacher's assessment as weight is zero continue; } } else { if (!$assessment->gradinggrade and $assessment->timegraded or $workshop->agreeassessments and !$assessment->timeagreed) { // it's a duff assessment, or it's not been agreed continue; } } if (workshop_is_teacher($workshop, $assessment->userid)) { $num += $workshop->teacherweight; // weight teacher's assessment } else { $num++; // student assessment just add one } for ($i = 0; $i < $workshop->nelements; $i++) { $grade = get_field("workshop_grades", "grade", "assessmentid", $assessment->id, "elementno", $i); if (workshop_is_teacher($workshop, $assessment->userid)) { $sum[$i] += $workshop->teacherweight * $grade; // teacher's grade } else { $sum[$i] += $grade; // student's grade } } } if ($num) { // could all the assessments be duff? for ($i = 0; $i < $workshop->nelements; $i++) { $mean[$i] = $sum[$i] / $num; if ($verbose) { echo "Submission: {$submission->id}; Element: {$i}; Mean: {$mean[$i]}\n"; } } } else { continue; // move to the next submission } // run through the assessments again to see which is the "best" one (the one // closest to the mean) $lowest = 10000000000.0; 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[$i] - $grade) * $WORKSHOP_EWEIGHTS[$weight[$i]] / $sd[$i]; } else { $temp = 0; } $var += $temp * $temp; } // find the "best" assessment of this submission if ($lowest > $var) { $lowest = $var; $bestassessmentid = $assessment->id; } } if (!($best = get_record("workshop_assessments", "id", $bestassessmentid))) { notify("Workshop grade assessments: cannot find best assessment"); continue; } if ($verbose) { echo "Best assessment is {$bestassessmentid};\n"; } foreach ($assessments as $assessment) { // don't overwrite teacher's grade if ($assessment->teachergraded) { continue; } if ($assessment->id == $bestassessmentid) { // 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 = round(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); } } } } else { // there are less than 3 assessments for this submission if ($assessments = workshop_get_assessments($submission)) { foreach ($assessments as $assessment) { if (!$assessment->timegraded and !$assessment->teachergraded) { // set the grading grade to the maximum and say it's been graded set_field("workshop_assessments", "gradinggrade", 100, "id", $assessment->id); set_field("workshop_assessments", "timegraded", $timenow, "id", $assessment->id); } } } } // set the number of assessments for this submission set_field("workshop_submissions", "nassessments", $nassessments, "id", $submission->id); } } } return; }
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"); } if (groupmode($course, $cm) == SEPARATEGROUPS) { $groupid = get_current_group($course->id); } else { $groupid = 0; } workshop_print_assignment_info($workshop); if (workshop_is_teacheredit($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 ($submissions = workshop_get_teacher_submissions($workshop)) { foreach ($submissions as $submission) { $action = "<a href=\"submissions.php?action=adminamendtitle&id={$cm->id}&sid={$submission->id}\">" . get_string("amendtitle", "workshop") . "</a>"; // has user already assessed this submission if ($assessment = get_record_select("workshop_assessments", "submissionid = {$submission->id}\n AND userid = {$USER->id}")) { $curtime = time(); if ($assessment->timecreated > $curtime) { // it's a "hanging" assessment $action .= " | <a href=\"assess.php?id={$cm->id}&sid={$submission->id}\">" . get_string("assess", "workshop") . "</a>"; } elseif ($curtime - $assessment->timecreated > $CFG->maxeditingtime) { $action .= " | <a href=\"assess.php?id={$cm->id}&sid={$submission->id}\">" . get_string("reassess", "workshop") . "</a>"; } else { // there's still time left to edit... $action .= " | <a href=\"assess.php?id={$cm->id}&sid={$submission->id}\">" . get_string("edit", "workshop") . "</a>"; } } else { // user has not graded this submission $action .= " | <a href=\"assess.php?id={$cm->id}&sid={$submission->id}\">" . get_string("assess", "workshop") . "</a>"; } if ($assessments = workshop_get_assessments($submission)) { $action .= " | <a href=\"assessments.php?action=adminlist&id={$cm->id}&sid={$submission->id}\">" . get_string("listassessments", "workshop") . "</a>"; } if (workshop_is_teacheredit($workshop)) { $action .= " | <a href=\"submissions.php?action=confirmdelete&id={$cm->id}&sid={$submission->id}\">" . get_string("delete", "workshop") . "</a>"; } $table->data[] = array("<a href=\"submissions.php?action=editsubmission&id={$cm->id}&sid={$submission->id}\">{$submission->title}</a>", $course->teacher, $action); } print_heading(get_string("studentsubmissions", "workshop", $course->teacher), "center"); print_table($table); } } // list student assessments // Get all the students... if ($users = workshop_get_students($workshop, "u.lastname, u.firstname")) { $timenow = time(); unset($table); $table->head = array(get_string("name"), get_string("title", "workshop"), get_string("action", "workshop")); $table->align = array("left", "left", "left"); $table->size = array("*", "*", "*"); $table->cellpadding = 2; $table->cellspacing = 0; $nassessments = 0; foreach ($users as $user) { // check group membership, if necessary if ($groupid) { // check user's group if (!groups_is_member($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 = ''; foreach ($assessments as $assessment) { if (!($submission = get_record("workshop_submissions", "id", $assessment->submissionid))) { error("Workshop_list_submissions_for_admin: Submission {$assessment->submissionid} not found!"); } $title .= $submission->title; if ($workshop->agreeassessments and !$assessment->timeagreed and workshop_is_student($workshop, $submission->userid)) { // agreements for student work only $title .= " <<" . number_format($assessment->grade * $workshop->grade / 100, 0) . " (" . number_format($assessment->gradinggrade * $workshop->gradinggrade / 100, 0) . ")>> "; } elseif ($assessment->timegraded) { 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) . " ((" . number_format($assessment->gradinggrade * $workshop->gradinggrade / 100, 0) . "))} "; } if ($realassessments = workshop_count_user_assessments_done($workshop, $user)) { $action = "<a href=\"assessments.php?action=adminlistbystudent&id={$cm->id}&userid={$user->id}\">" . get_string("liststudentsassessments", "workshop") . " ({$realassessments})</a>"; } else { $action = ""; } } $nassessments++; $table->data[] = array(fullname($user), $title, $action); } } if (isset($table->data)) { print_heading(get_string("studentassessments", "workshop", $course->student) . " [{$nassessments}]"); 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, \n STDDEV(gradinggrade) AS stddev, MIN(gradinggrade) AS min, MAX(gradinggrade) AS max \n FROM {$CFG->prefix}groups_members g, {$CFG->prefix}workshop_assessments a \n WHERE g.groupid = {$groupid} AND a.userid = g.userid AND a.timegraded > 0 \n AND a.workshopid = {$workshop->id}"); } else { // no group/all participants $stats = get_record_sql("SELECT COUNT(*) as count, AVG(gradinggrade) AS mean, \n STDDEV(gradinggrade) AS stddev, MIN(gradinggrade) AS min, MAX(gradinggrade) AS max \n FROM {$CFG->prefix}workshop_assessments a \n 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); echo "<p style=\"text-align:center\"><a href=\"assessments.php?id={$cm->id}&action=regradestudentassessments\">" . get_string("regradestudentassessments", "workshop") . "</a> "; helpbutton("regrading", get_string("regradestudentassessments", "workshop"), "workshop"); echo "</p>\n"; } } // now the sudent submissions unset($table); switch ($order) { case "title": $table->head = array("<a href=\"submissions.php?action=adminlist&id={$cm->id}&order=name\">" . get_string("submittedby", "workshop") . "</a>", get_string("title", "workshop"), get_string("submitted", "workshop"), get_string("action", "workshop")); break; case "name": $table->head = array(get_string("submittedby", "workshop"), "<a href=\"submissions.php?action=adminlist&id={$cm->id}&order=title\">" . get_string("title", "workshop") . "</a>", get_string("submitted", "workshop"), get_string("action", "workshop")); break; } $table->align = array("left", "left", "left", "left"); $table->size = array("*", "*", "*", "*"); $table->cellpadding = 2; $table->cellspacing = 0; $nsubmissions = 0; if ($submissions = workshop_get_student_submissions($workshop, $order)) { foreach ($submissions as $submission) { if (!($user = get_record("user", "id", $submission->userid))) { error("workshop_list_submissions_for_admin: failure to get user record"); } // check group membership, if necessary if ($groupid) { // check user's group if (!groups_is_member($groupid, $user->id)) { continue; // skip this user } } $datesubmitted = userdate($submission->timecreated); if ($submission->late) { $datesubmitted = "<span class=\"redfont\">" . $datesubmitted . "</span>"; } $action = "<a href=\"submissions.php?action=adminamendtitle&id={$cm->id}&sid={$submission->id}\">" . get_string("amendtitle", "workshop") . "</a>"; // has teacher already assessed this submission if ($assessment = get_record_select("workshop_assessments", "submissionid = {$submission->id}\n AND userid = {$USER->id}")) { $curtime = time(); if ($curtime - $assessment->timecreated > $CFG->maxeditingtime) { $action .= " | <a href=\"assess.php?id={$cm->id}&sid={$submission->id}\">" . get_string("reassess", "workshop") . "</a>"; } else { // there's still time left to edit... $action .= " | <a href=\"assess.php?id={$cm->id}&sid={$submission->id}\">" . get_string("edit", "workshop") . "</a>"; } } else { // user has not assessed this submission $action .= " | <a href=\"assess.php?id={$cm->id}&sid={$submission->id}\">" . get_string("assess", "workshop") . "</a>"; } if ($nassessments = workshop_count_assessments($submission)) { $action .= " | <a href=\"assessments.php?action=adminlist&id={$cm->id}&sid={$submission->id}\">" . get_string("listassessments", "workshop") . " ({$nassessments})</a>"; } if ($submission->late) { $action .= " | <a href=\"submissions.php?action=adminlateflag&id={$cm->id}&sid={$submission->id}\">" . get_string("clearlateflag", "workshop") . "</a>"; } $action .= " | <a href=\"submissions.php?action=confirmdelete&id={$cm->id}&sid={$submission->id}\">" . get_string("delete", "workshop") . "</a>"; $nsubmissions++; $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") . ")", $datesubmitted, $action); } print_heading(get_string("studentsubmissions", "workshop", $course->student) . " [{$nsubmissions}]", "center"); print_table($table); workshop_print_key($workshop); } }