]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-9628 Enabling multiple feedback and grades update. Feedbacks now working, but...
authornicolasconnault <nicolasconnault>
Wed, 11 Jul 2007 16:54:11 +0000 (16:54 +0000)
committernicolasconnault <nicolasconnault>
Wed, 11 Jul 2007 16:54:11 +0000 (16:54 +0000)
grade/report/grader/index.php
lib/grade/grade_item.php

index 8deebf0cc2576db7471b16aed1a293d8bfd2587b..686a05e98cd4085eaae758af3981df384397bca1 100644 (file)
@@ -58,20 +58,28 @@ function grader_report_print_toggle($type, $baseurl, $return=false) {
 }
 
 
-/// processing posted grades here
+/// processing posted grades & feedback here
 
 if ($data = data_submitted() and confirm_sesskey()) {
 
     // always initialize all arrays
     $queue = array();
 
-    foreach ($data as $varname => $postedgrade) {
+    foreach ($data as $varname => $postedvalue) {
         // this is a bit tricky - we have to first load all grades into memory,
         // check if changed and only then start updating the final grades because
         // columns might depend one on another - the result would be overriden calculated and category grades
 
-        // skip, not a grade
-        if (!strstr($varname, 'grade')) {
+        $needsupdate = false;
+        $note = false; // TODO implement note??
+
+        // skip, not a grade nor feedback
+        $data_type = '';
+        if (strstr($varname, 'grade')) {
+            $data_type = 'grade';
+        } elseif (strstr($varname, 'feedback')) {
+            $data_type = 'feedback';
+        } else {
             continue;
         }
 
@@ -84,47 +92,71 @@ if ($data = data_submitted() and confirm_sesskey()) {
             error('Incorrect grade item id');
         }
 
-        if ($grade_item->gradetype == GRADE_TYPE_SCALE) {
-            if ($postedgrade == -1) { // -1 means no grade
-                $finalgrade = null;
-            } else {
-                $finalgrade = (float)$postedgrade;
-            }
-        } else {
-            if ($postedgrade == '') { // empty string means no grade
-                $finalgrade = null;
+        // Pre-process grade
+        if ($data_type == 'grade') {
+
+            if ($grade_item->gradetype == GRADE_TYPE_SCALE) {
+                if ($postedvalue == -1) { // -1 means no grade
+                    $finalgrade = null;
+                } else {
+                    $finalgrade = (float)$postedvalue;
+                }
             } else {
-                $finalgrade = format_grade($postedgrade);
+                if ($postedvalue == '') { // empty string means no grade
+                    $finalgrade = null;
+                } else {
+                    $finalgrade = format_grade($postedvalue);
+                }
             }
-        }
 
-        if (!is_null($finalgrade) and ($finalgrade < $grade_item->grademin or $finalgrade > $grade_item->grademax)) {
-            $gradeserror[$grade_item->id][$userid] = 'outofrange'; //TODO: localize
-            // another possiblity is to use bounded number instead
-            continue;
+            if (!is_null($finalgrade) and ($finalgrade < $grade_item->grademin or $finalgrade > $grade_item->grademax)) {
+                $gradeserror[$grade_item->id][$userid] = 'outofrange'; //TODO: localize
+                // another possiblity is to use bounded number instead
+                continue;
+            }
         }
 
+        // Get the grade object to compare old value with new value
         if ($grade = grade_grades::fetch(array('userid'=>$userid, 'itemid'=>$grade_item->id))) {
-            if (!is_null($grade->finalgrade)) {
-                $grade->finalgrade = (float)$grade->finalgrade;
-            }
-            if ($grade->finalgrade === $finalgrade) {
-                // we must not update all grades, only changed ones - we do not want to mark everything as overriden
-                continue;
+            if ($data_type == 'feedback') {
+                $finalgrade = false;
+                $text = $grade->load_text();
+                if ($text != s($postedvalue)) {
+                    $feedback = s($postedvalue);
+                    $feedbackformat = GRADER_REPORT_FEEDBACK_FORMAT_TEXT;
+                    $needsupdate = true;
+                }
+            } elseif ($data_type == 'grade') {
+                $feedback = false;
+                $feedbackformat = false;
+                if (!is_null($grade->finalgrade)) {
+                    $grade->finalgrade = (float)$grade->finalgrade;
+                }
+                if ($grade->finalgrade === $finalgrade) {
+                    $needsupdate = true;
+                }
             }
-        }
 
-        $gradedata = new object();
-        $gradedata->grade_item = $grade_item;
-        $gradedata->finalgrade = $finalgrade;
-        $gradedata->userid     = $userid;
+        }
 
-        $queue[] = $gradedata;
+        // we must not update all grades, only changed ones - we do not want to mark everything as overriden
+        if ($needsupdate) {
+            $gradedata = new object();
+            $gradedata->grade_item     = $grade_item;
+            $gradedata->userid         = $userid;
+            $gradedata->note           = $note;
+            $gradedata->finalgrade     = $finalgrade;
+            $gradedata->feedback       = $feedback;
+            $gradedata->feedbackformat = $feedbackformat;
+
+            $queue[] = $gradedata;
+        }
     }
 
     // now we update the new final grade for each changed grade
     foreach ($queue as $gradedata) {
-        $gradedata->grade_item->update_final_grade($gradedata->userid, $gradedata->finalgrade, 'gradebook');
+        $gradedata->grade_item->update_final_grade($gradedata->userid, $gradedata->finalgrade, 'gradebook',
+                                                   $gradedata->note, $gradedata->feedback, $gradedata->feedbackformat);
     }
 }
 
index 2bc262d3604cd5b18ef86cf21bcaa4b3a7575a68..2c7ba0a667e5078661d0541bd1c3b119b9ff2143 100644 (file)
@@ -1059,6 +1059,7 @@ class grade_item extends grade_object {
      * @param mixed $feedback teachers feedback as string - false means do not change
      * @param int $feedbackformat
      * @return boolean success
+     * TODO Allow for a change of feedback without a change of finalgrade. Currently I get notice about uninitialised $result
      */
     function update_final_grade($userid, $finalgrade=false, $source=NULL, $note=NULL, $feedback=false, $feedbackformat=FORMAT_MOODLE, $usermodified=null) {
         global $USER;