]> git.mjollnir.org Git - moodle.git/commitdiff
New version (2003113000), Analysis of Assessments added.
authorrkingdon <rkingdon>
Mon, 1 Dec 2003 12:19:48 +0000 (12:19 +0000)
committerrkingdon <rkingdon>
Mon, 1 Dec 2003 12:19:48 +0000 (12:19 +0000)
mod/workshop/db/mysql.php
mod/workshop/db/mysql.sql
mod/workshop/lib.php
mod/workshop/submissions.php
mod/workshop/version.php
mod/workshop/view.php

index afbbe0305ce1d47e63b61f24d076fa9b3c2cc05c..44c35dfefaf1a52e5c6340b653a9ec8af4558d36 100644 (file)
@@ -65,7 +65,17 @@ function workshop_upgrade($oldversion) {
         execute_sql("INSERT INTO `{$CFG->prefix}log_display` VALUES ('workshop', 'view', 'workshop', 'name')");
         execute_sql("INSERT INTO `{$CFG->prefix}log_display` VALUES ('workshop', 'update', 'workshop', 'name')");
     }
-
+    
+    if ($oldversion < 2003113000) {
+        execute_sql("ALTER TABLE `{$CFG->prefix}workshop` ADD `teacherloading` tinyint(3) unsigned 
+                NOT NULL default '5'");
+        execute_sql("ALTER TABLE `{$CFG->prefix}workshop` ADD `assessmentstodrop` tinyint(3) unsigned 
+                NOT NULL default '0'");
+        execute_sql("ALTER TABLE `{$CFG->prefix}workshop_assessments` ADD `donotuse` tinyint(3) unsigned 
+                NOT NULL default '0' AFTER `resubmission`");
+        execute_sql("ALTER TABLE `{$CFG->prefix}workshop_grades` ADD INDEX (`assessmentid`)");
+    }
+    
     return true;
 }
 
index 5c0bd39ab3665e4c9aa94d6350f33c3b1e380be7..356ff53043c6616c32378c5774727d99fd8f3d9b 100644 (file)
@@ -30,6 +30,8 @@ CREATE TABLE `prefix_workshop` (
   `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',
   `showleaguetable` tinyint(3) unsigned NOT NULL default '0',
   PRIMARY KEY  (`id`)
 ) COMMENT='Defines workshop';
@@ -73,6 +75,7 @@ CREATE TABLE `prefix_workshop_assessments` (
   `gradinggrade` int(3) NOT NULL default '0',
   `mailed` tinyint(3) unsigned NOT NULL default '0',
   `resubmission` tinyint(3) unsigned NOT NULL default '0',
+  `donotuse` tinyint(3) unsigned NOT NULL default '0',
   `generalcomment` text NOT NULL,
   `teachercomment` text NOT NULL,
   PRIMARY KEY  (`id`)
index c2ea3023f64ba4ddf284fca221ea33a117c75a22..fc0a2a753bad77b248da502d85bcef404b2357ef 100644 (file)
@@ -46,7 +46,7 @@ $WORKSHOP_EWEIGHTS = array(  0 => -4.0, 1 => -2.0, 2 => -1.5, 3 => -1.0, 4 => -0
                              14 => 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); 
+                                                        7 => 2.0, 8 => 3.0, 9 => 5.0, 10 => 7.5, 11=> 10.0, 12=>50.0); 
 
 if (!defined("COMMENTSCALE")) {
        define("COMMENTSCALE", 20);
@@ -3384,38 +3384,57 @@ function workshop_print_submission_assessments($workshop, $submission, $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 .= "<A HREF=\"assessments.php?action=viewassessment&a=$workshop->id&aid=$assessment->id\">[";
+                        
+                                               $str .= "<A HREF=\"assessments.php?action=viewassessment&a=$workshop->id&aid=$assessment->id\">";
+                        if ($assessment->donotuse) {
+                            $str .= "&lt;";
+                        } else {
+                            $str .= "[";
+                        }
                                                $str .= number_format($assessment->grade, 0);
                                                if ($assessment->gradinggrade) { // funny, teacher is grading self!
                                                        $str .= "/".number_format($assessment->gradinggrade*100/COMMENTSCALE, 0)."%";
-                                                       }
-                                               $str .= "]</A> ";
                                                }
+                        if ($assessment->donotuse) {
+                                                   $str .= "&gt;</A> ";
+                        } else {
+                                               $str .= "]</A> ";
+                        }
                                        }
+                               }
                                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 .= "<A HREF=\"assessments.php?action=viewassessment&a=$workshop->id&aid=$assessment->id\">{";
+                                               $str .= "<A HREF=\"assessments.php?action=viewassessment&a=$workshop->id&aid=$assessment->id\">";
+                        if ($assessment->donotuse) {
+                            $str .= "&lt;";
+                        } else {
+                            $str .= "{";
+                        }
                                                $str .= number_format($assessment->grade, 0);
                                                if ($assessment->gradinggrade) {
                                                        $str .= "/".number_format($assessment->gradinggrade*100/COMMENTSCALE, 0)."%";
-                                                       }
-                                               $str .= "}</A> ";
                                                }
+                        if ($assessment->donotuse) {
+                                                   $str .= "&gt;</A> ";
+                        } else {
+                                                   $str .= "}</A> ";
+                        }
                                        }
+                               }
                                break;
-                       }
                }
+       }
        if (!$str) {
                $str = "&nbsp;";   // be kind to Mozilla browsers!
-               }
+       }
     return $str;
 }
 
@@ -3569,7 +3588,7 @@ 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 ($assessments = workshop_get_user_assessments($workshop, $user)) {
+       if ($assessments = workshop_get_user_assessments_done($workshop, $user)) {
                $n = count($assessments);
                $str = "$n  (";
                foreach ($assessments as $assessment) {
@@ -3577,19 +3596,23 @@ function workshop_print_user_assessments($workshop, $user) {
                                $gradingscaled = intval($assessment->gradinggrade * $workshop->grade / COMMENTSCALE);
                                $str .= "<A HREF=\"assessments.php?action=viewassessment&a=$workshop->id&aid=$assessment->id\">";
                                $str .= "$gradingscaled</A> ";
-                               }
+                       }
                        else {
                                $str .= "<A HREF=\"assessments.php?action=viewassessment&a=$workshop->id&aid=$assessment->id\">";
-                               $str .= "-</A> ";
-                               }
+                if ($assessment->donotuse) {
+                    $str .= "&lt;".number_format($assessment->grade, 0)."&gt;</A> ";
+                } else {
+                    $str .= number_format($assessment->grade, 0)."</A> ";
+                }
                        }
-               $str .= ")";
                }
+               $str .= ")";
+       }
        else {
                $str ="0";
-               }
-    return $str;
        }
+    return $str;
+}
 
 
 //////////////////////////////////////////////////////////////////////////////////////
index 0cf473289fc9bad4333f465b16e5b98814cb66d1..1af57ad8ffed06c74841b9f2b6f6bb3f2334f9e2 100644 (file)
@@ -6,6 +6,7 @@
        adminconfirmdelete
        admindelete
        adminlist
+    analysisofassessments
        calculatefinalgrades
        displayfinalgrades (teachers only)
        displayfinalweights
@@ -96,9 +97,9 @@
                <?PHP
 
                // now get the comment
-               echo "<tr valign=\"top\">\n";\r
-               echo "  <td align=\"right\"><P><B>". get_string("title", "workshop").":</b></p></td>\n";\r
-               echo "  <td>\n";\r
+               echo "<tr valign=\"top\">\n";
+               echo "  <td align=\"right\"><P><B>". get_string("title", "workshop").":</b></p></td>\n";
+               echo "  <td>\n";
                echo "          <input type=\"text\" name=\"title\" size=\"60\" maxlength=\"100\" value=\"$submission->title\">\n";
                echo "  </td></tr></table>\n";
                echo "<input type=submit VALUE=\"".get_string("amendtitle", "workshop")."\">\n";
                }
        
 
+       /*************** 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 "<form name=\"optionsform\" method=\"post\" action=\"submissions.php\">\n";
+        echo "<INPUT TYPE=\"hidden\" NAME=\"id\" VALUE=\"$cm->id\">\n";
+        echo "<input type=\"hidden\" name=\"action\" value=\"saveanalysisoptions\">\n";
+
+        // 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 "<center><TABLE WIDTH=\"50%\" BORDER=\"1\">\n";
+        echo "<TR><td COLSPAN=\"2\" bgcolor=\"$THEME->cellheading2\"><CENTER><B>".
+            get_string("optionsusedinanalysis", "workshop")."</B></CENTER></TD></TR>\n";
+        echo "<tr><td align=\"right\">".get_string("loadingforteacherassessments", "workshop", 
+                $course->teacher).":</td>\n";
+        echo "<TD>";
+        workshop_choose_from_menu($WORKSHOP_FWEIGHTS, "teacherloading", $teacherloading, "");
+        echo "</TD></TR>\n";
+        echo "<tr><td align=\"right\">".get_string("weightforgradingofassessments", "workshop").":</td>\n";
+        echo "<TD>";
+        workshop_choose_from_menu($WORKSHOP_FWEIGHTS, "gradingweight", $gradingweight, "");
+        echo "</TD></TR>\n";
+        echo "<TR><TD ALIGN=\"right\">".get_string("percentageofassessments", "workshop").":</TD>\n";
+        echo "<TD>";
+               for ($i = 0; $i <= 100; $i++) {
+                       $numbers[$i] = $i;
+               }
+        choose_from_menu($numbers, "assessmentstodrop", $assessmentstodrop, "");
+        echo "</TD></TR>\n";
+        echo "</TABLE><br />\n";
+        echo "<INPUT TYPE=submit VALUE=\"".get_string("repeatanalysis", "workshop")."\">\n";
+        echo "</FORM>\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;
+        } 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 "<p>".get_string("numberofsubmissions", "workshop", count($num))."</p>\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]}<br />\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]<br />";
+                    if ($sd[$i] <= $minvar) {
+                            get_string("standarddeviationnote", "workshop")."<br />\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 "$user->firstname $user->lastname Error: {$newassessors[$userid]}; n: $n<br />\n";
+               }
+            
+            // echo "<hr>\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")."<br />\n";
+            echo get_string("numberofassessmentschanged", "workshop", $nchanged)."<br />\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 "<p>".get_string("expectederror", "workshop", $varguess)."</p>\n";
+        print_heading(get_string("errortable", "workshop"));
+               $table->head = array(" ",get_string("name"), get_string("averageerror", "workshop"), 
+                get_string("averageerror", "workshop")."<br />".
+                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] &lt;$ndropped[$userid]&gt;";
+            } 
+            $table->data[] = array($n, "$user->firstname $user->lastname", 
+                    number_format($error * 100 / $varguess, 2)."%", $vargoodtext, 
+                    $numtext);
+            $n++;
+               }
+               print_table($table);
+        echo "<p>&lt; &gt; ".get_string("assessmentsexcluded", "workshop", $course->student)."</p>\n";
+        echo "<p>".get_string("submissionsused", "workshop", count($num))."</p>\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("<b>".get_string("weight", "workshop")."</b>", " ", " ",  
+                "<b>".$WORKSHOP_FWEIGHTS[$workshop->gradingweight]."</b>", " ", " ","<b>1</b>", " ");
+        $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;
+                        }
+                    }
+                    $totalgrade = ($assessmentgrade * $WORKSHOP_FWEIGHTS[$workshop->gradingweight] +
+                        $submissiongrade) / ($WORKSHOP_FWEIGHTS[$workshop->gradingweight] + 1.0);
+                               if ($n) {
+                        $table->data[] = array("$user->firstname $user->lastname", 
+                            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($totalgrade, 2));
+                    } else {
+                                   $table->data[] = array("$user->firstname $user->lastname", 
+                            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"),
+                            "<b>".get_string("noassessments", "workshop")."</b>",
+                            number_format($totalgrade, 2));
+                    }
+                    // save grades in submission record
+                    set_field("workshop_submissions", "finalgrade", $submissiongrade, "id", $submission->id);
+                    set_field("workshop_submissions", "gradinggrade", $assessmentgrade, "id", 
+                            $submission->id);
+                }       
+            } else {
+                // no submissions
+                $totalgrade = ($assessmentgrade * $WORKSHOP_FWEIGHTS[$workshop->gradingweight]) /
+                    ($WORKSHOP_FWEIGHTS[$workshop->gradingweight] + 1.0);
+                       $table->data[] = array("$user->firstname $user->lastname", 
+                            "-", workshop_print_user_assessments($workshop, $user),
+                            number_format($assessmentgrade, 2), "-", "-",
+                            get_string("nosubmission", "workshop"), 
+                            number_format($totalgrade,2));
+            }
+               }
+               print_table($table);
+        echo "<p>&lt; &gt; ".get_string("assessmentdropped", "workshop")."</p>\n";
+        echo "</CENTER>";
+               print_continue("view.php?a=$workshop->id");
+    }
+
+
        /*************** calculate final grades (by teacher) ***************************/
        elseif ($action == 'calculatefinalgrades') {
 
        /*************** display final grades (by teacher) ***************************/
        elseif ($action == 'displayfinalgrades') {
                // 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")) {
                        print_heading(get_string("nostudentsyet"));
                        print_footer($course);
                        exit;
-                       }
+               }
                
                // get the final weights from the database
                $teacherweight = get_field("workshop","teacherweight", "id", $workshop->id);
                // 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 "<center><table border=\"1\" width=\"90%\"><tr>
                        <td bgcolor=\"$THEME->cellheading2\"><b>".$course->student."</b></td>";
-               echo "<td bgcolor=\"$THEME->cellheading2\"><b>".get_string("submissions", "workshop")."</b></td>";
+               echo "<td bgcolor=\"$THEME->cellheading2\"><b>".get_string("submission", "workshop")."</b></td>";
                if ($useteachersgrades) {
                        echo "<td bgcolor=\"$THEME->cellheading2\" align=\"center\"><b>".get_string("assessmentsby", "workshop", $course->teachers)."</b></td>";
-                       }
+               }
                if ($usepeergrades) {
                        echo "<td bgcolor=\"$THEME->cellheading2\" align=\"center\"><b>".get_string("assessmentsby", "workshop", $course->students)."</b></td>";
-                       }
+               }
                echo "<td bgcolor=\"$THEME->cellheading2\" align=\"center\"><b>".get_string("assessmentsdone", "workshop")."</b></td>";
                if ($usebiasgrades) {
                        echo "<td bgcolor=\"$THEME->cellheading2\" align=\"center\"><b>".get_string("gradeforbias", "workshop")."</b></td>";
-                       }
+               }
                if ($usereliabilitygrades) {
                        echo "<td bgcolor=\"$THEME->cellheading2\" align=\"center\"><b>".get_string("gradeforreliability", "workshop")."</b></td>";
-                       }
+               }
                if ($usegradinggrades) {
                        echo "<td bgcolor=\"$THEME->cellheading2\" align=\"center\"><b>".get_string("gradeforassessments", "workshop")."</b></td>";
-                       }
+               }
                echo "<td bgcolor=\"$THEME->cellheading2\" align=\"center\"><b>".get_string("overallgrade", "workshop")."</b></td></TR>\n";
                // now the weights
                echo "<TR><td bgcolor=\"$THEME->cellheading2\"><b>".get_string("weights", "workshop")."</b></td>";
                echo "<td bgcolor=\"$THEME->cellheading2\" align=\"center\"><b>&nbsp;</b></td>\n";
                if ($useteachersgrades) {
                        echo "<td bgcolor=\"$THEME->cellheading2\" align=\"center\"><b>$WORKSHOP_FWEIGHTS[$teacherweight]</b></td>\n";
-                       }
+               }
                if ($usepeergrades) {
                        echo "<td bgcolor=\"$THEME->cellheading2\" align=\"center\"><b>$WORKSHOP_FWEIGHTS[$peerweight]</b></td>\n";
-                       }
+               }
                echo "<td bgcolor=\"$THEME->cellheading2\" align=\"center\"><b>&nbsp;</b></td>\n";
                if ($usebiasgrades) {
                        echo "<td bgcolor=\"$THEME->cellheading2\" align=\"center\"><b>$WORKSHOP_FWEIGHTS[$biasweight]</b></td>\n";
-                       }
+               }
                if ($usereliabilitygrades) {
                        echo "<td bgcolor=\"$THEME->cellheading2\" align=\"center\"><b>$WORKSHOP_FWEIGHTS[$reliabilityweight]</b></td>\n";
-                       }
+               }
                if ($usegradinggrades) {
                        echo "<td bgcolor=\"$THEME->cellheading2\" align=\"center\"><b>$WORKSHOP_FWEIGHTS[$gradingweight]</b></td>\n";
-                       }
+               }
                echo "<td bgcolor=\"$THEME->cellheading2\"><b>&nbsp;</b></td></tr>\n";
                foreach ($users as $user) {
                        if ($submissions = workshop_get_user_submissions($workshop, $user)) {
                                        echo "<td>".workshop_print_submission_title($workshop, $submission)."</td>\n";
                                        if ($useteachersgrades) {
                                                echo "<td align=\"center\">".workshop_print_submission_assessments($workshop, $submission, "teacher")."</td>";
-                                               }
+                                       }
                                        if ($usepeergrades) {
                                                echo "<td align=\"center\">".workshop_print_submission_assessments($workshop, $submission, "student")."</td>";
-                                               }
+                                       }
                                        echo "<td align=\"center\">".workshop_print_user_assessments($workshop, $user)."</td>";
                                        if ($usebiasgrades) {
-                                               echo "<td align=\"center\">$submission->biasgrade</td>";
-                                               }
+                                       echo "<td align=\"center\">$submission->biasgrade</td>";
+                                       }
                                        if ($usereliabilitygrades) {
                                                echo "<td align=\"center\">$submission->reliabilitygrade</td>";
-                                               }
+                                       }
                                        if ($usegradinggrades) {
                                                echo "<td align=\"center\">$submission->gradinggrade</td>";
-                                               }
-                                       echo "<td align=\"center\">$submission->finalgrade</td></tr>\n";
                                        }
+                                       echo "<td align=\"center\">$submission->finalgrade</td></tr>\n";
                                }
                        }
+               }
                echo "</table><br clear=\"all\">\n";
                if ($workshop->showleaguetable) {
                        workshop_print_league_table($workshop);
                        if ($workshop->anonymous) {
                                echo "<p>".get_string("namesnotshowntostudents", "workshop", $course->students)."</p>\n";
-                               }
                        }
+               }
                echo "<p>".get_string("allgradeshaveamaximumof", "workshop", $workshop->grade)."</p>\n";
                print_continue("view.php?a=$workshop->id");
-               }\r
+       }
 
 
        /*************** display final weights (by teacher) ***************************/
                }
        
 
+       /******************* save analysis options (for teachers only) ************************************/
+       elseif ($action == 'saveanalysisoptions' ) {
+       
+        if (!isteacher($course->id)) {
+                       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"));
+               
+               }
+       
+
        /*************** update over allocation (by teacher) ***************************/
        elseif ($action == 'updateoverallocation') {
                
index 7551b750abc9b6e6ee4fe29ab26aba4018c92b53..42326d7383959b271419359741c69317c13369d3 100644 (file)
@@ -5,7 +5,7 @@
 //  This fragment is called by /admin/index.php
 ////////////////////////////////////////////////////////////////////////////////
 
-$module->version  = 2003100800;
+$module->version  = 2003113000;
 $module->cron     = 60;
 
 ?>
index fbbf3b09f7f7d2af9bd6b1b74c786fcde87e7088..47c875acddb3421ba0cb7c3280646f33ba1a7309 100644 (file)
                             get_string("studentsubmissionsforassessment", "workshop"), "workshop");
                                        print_heading("<a href=\"submissions.php?id=$cm->id&action=displayfinalweights\">".
                                                  get_string("calculationoffinalgrades", "workshop")."</a>");
+                                       print_heading("<a href=\"submissions.php?id=$cm->id&action=analysisofassessments\">".
+                                                 get_string("analysisofassessments", "workshop")."</a>");
                                        break;
                                        
                                case 6: // show final grades