示例#1
0
     $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 {
示例#2
0
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;
}
示例#3
0
文件: locallib.php 项目: r007/PMoodle
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&amp;id={$cm->id}&amp;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}&amp;sid={$submission->id}\">" . get_string("assess", "workshop") . "</a>";
                    } elseif ($curtime - $assessment->timecreated > $CFG->maxeditingtime) {
                        $action .= " | <a href=\"assess.php?id={$cm->id}&amp;sid={$submission->id}\">" . get_string("reassess", "workshop") . "</a>";
                    } else {
                        // there's still time left to edit...
                        $action .= " | <a href=\"assess.php?id={$cm->id}&amp;sid={$submission->id}\">" . get_string("edit", "workshop") . "</a>";
                    }
                } else {
                    // user has not graded this submission
                    $action .= " | <a href=\"assess.php?id={$cm->id}&amp;sid={$submission->id}\">" . get_string("assess", "workshop") . "</a>";
                }
                if ($assessments = workshop_get_assessments($submission)) {
                    $action .= " | <a href=\"assessments.php?action=adminlist&amp;id={$cm->id}&amp;sid={$submission->id}\">" . get_string("listassessments", "workshop") . "</a>";
                }
                if (workshop_is_teacheredit($workshop)) {
                    $action .= " | <a href=\"submissions.php?action=confirmdelete&amp;id={$cm->id}&amp;sid={$submission->id}\">" . get_string("delete", "workshop") . "</a>";
                }
                $table->data[] = array("<a href=\"submissions.php?action=editsubmission&amp;id={$cm->id}&amp;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 .= " &lt;&lt;" . number_format($assessment->grade * $workshop->grade / 100, 0) . " (" . number_format($assessment->gradinggrade * $workshop->gradinggrade / 100, 0) . ")&gt;&gt; ";
                    } 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 .= " &lt;" . number_format($assessment->grade * $workshop->grade / 100, 0) . " (" . number_format($assessment->gradinggrade * $workshop->gradinggrade / 100, 0) . ")&gt; ";
                        }
                    } 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&amp;id={$cm->id}&amp;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}&amp;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&amp;id={$cm->id}&amp;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&amp;id={$cm->id}&amp;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&amp;id={$cm->id}&amp;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}&amp;sid={$submission->id}\">" . get_string("reassess", "workshop") . "</a>";
                } else {
                    // there's still time left to edit...
                    $action .= " | <a href=\"assess.php?id={$cm->id}&amp;sid={$submission->id}\">" . get_string("edit", "workshop") . "</a>";
                }
            } else {
                // user has not assessed this submission
                $action .= " | <a href=\"assess.php?id={$cm->id}&amp;sid={$submission->id}\">" . get_string("assess", "workshop") . "</a>";
            }
            if ($nassessments = workshop_count_assessments($submission)) {
                $action .= " | <a href=\"assessments.php?action=adminlist&amp;id={$cm->id}&amp;sid={$submission->id}\">" . get_string("listassessments", "workshop") . " ({$nassessments})</a>";
            }
            if ($submission->late) {
                $action .= " | <a href=\"submissions.php?action=adminlateflag&amp;id={$cm->id}&amp;sid={$submission->id}\">" . get_string("clearlateflag", "workshop") . "</a>";
            }
            $action .= " | <a href=\"submissions.php?action=confirmdelete&amp;id={$cm->id}&amp;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);
    }
}