]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-13269 fixed regrading of activity raw grades; merged from MOODLE_19_STABLE
authorskodak <skodak>
Sun, 17 Feb 2008 16:01:24 +0000 (16:01 +0000)
committerskodak <skodak>
Sun, 17 Feb 2008 16:01:24 +0000 (16:01 +0000)
course/modedit.php
lib/grade/grade_item.php
lib/gradelib.php

index 0c5d5f2b8342ec62fcef075ff99dd1019f475858..c55880f3cfd3503ec8ec2b475b74a269880e12d6 100644 (file)
         }
 
         rebuild_course_cache($course->id);
-        
+        grade_regrade_final_grades($course->id);
+
         if (isset($fromform->submitbutton)) { 
             redirect("$CFG->wwwroot/mod/$module->name/view.php?id=$fromform->coursemodule");
         } else {
index f4f47ddfa13bb5046b20f5ee66ea9449bf495294..c2fe10e90217a0738951df127c02b06f9a695dab 100644 (file)
@@ -698,7 +698,9 @@ class grade_item extends grade_object {
     /**
      * Given a float grade value or integer grade scale, applies a number of adjustment based on
      * grade_item variables and returns the result.
-     * @param object $rawgrade The raw grade value.
+     * @param float $rawgrade The raw grade value.
+     * @param float $rawmin original rawmin
+     * @param float $rawmax original rawmax
      * @return mixed
      */
     function adjust_raw_grade($rawgrade, $rawmin, $rawmax) {
@@ -718,7 +720,7 @@ class grade_item extends grade_object {
 
             // Standardise score to the new grade range
             // NOTE: this is not compatible with current assignment grading
-            if ($rawmin != $this->grademin or $rawmax != $this->grademax) {
+            if ($this->itemmodule != 'assignment' and ($rawmin != $this->grademin or $rawmax != $this->grademax)) {
                 $rawgrade = grade_grade::standardise_score($rawgrade, $rawmin, $rawmax, $this->grademin, $this->grademax);
             }
 
@@ -743,7 +745,7 @@ class grade_item extends grade_object {
 
             // Convert scale if needed
             // NOTE: this is not compatible with current assignment grading
-            if ($rawmin != $this->grademin or $rawmax != $this->grademax) {
+            if ($this->itemmodule != 'assignment' and ($rawmin != $this->grademin or $rawmax != $this->grademax)) {
                 $rawgrade = grade_grade::standardise_score($rawgrade, $rawmin, $rawmax, $this->grademin, $this->grademax);
             }
 
@@ -1406,14 +1408,14 @@ class grade_item extends grade_object {
             $this->force_regrading();
 
         } else if ($this->is_course_item() and !$this->needsupdate) {
-            if (!grade_regrade_final_grades($this->courseid, $userid, $this)) {
+            if (grade_regrade_final_grades($this->courseid, $userid, $this) !== true) {
                 $this->force_regrading();
             }
 
         } else if (!$this->needsupdate) {
             $course_item = grade_item::fetch_course_item($this->courseid);
             if (!$course_item->needsupdate) {
-                if (!grade_regrade_final_grades($this->courseid, $userid, $this)) {
+                if (grade_regrade_final_grades($this->courseid, $userid, $this) !== true) {
                     $this->force_regrading();
                 }
             } else {
@@ -1483,27 +1485,24 @@ class grade_item extends grade_object {
         }
 
         // we need proper floats here for !== comparison later
-        if (!is_null($grade->rawgrade)) {
-            $grade->rawgrade = (float)$grade->rawgrade;
-        }
-
         $oldgrade = new object();
-        $oldgrade->finalgrade     = $grade->finalgrade;
-        $oldgrade->rawgrade       = $grade->rawgrade;
-        $oldgrade->rawgrademin    = $grade->rawgrademin;
-        $oldgrade->rawgrademax    = $grade->rawgrademax;
-        $oldgrade->rawscaleid     = $grade->rawscaleid;
+        $oldgrade->finalgrade     = grade_floatval($grade->finalgrade);
+        $oldgrade->rawgrade       = grade_floatval($grade->rawgrade);
+        $oldgrade->rawgrademin    = grade_floatval($grade->rawgrademin);
+        $oldgrade->rawgrademax    = grade_floatval($grade->rawgrademax);
+        $oldgrade->rawscaleid     = grade_floatval($grade->rawscaleid);
         $oldgrade->feedback       = $grade->feedback;
         $oldgrade->feedbackformat = $grade->feedbackformat;
 
-        // fist copy current grademin/max and scale
-        $grade->rawgrademin = $this->grademin;
-        $grade->rawgrademax = $this->grademax;
-        $grade->rawscaleid  = $this->scaleid;
+        // use new min and max
+        $grade->rawgrade    = grade_floatval($grade->rawgrade);
+        $grade->rawgrademin = grade_floatval($this->grademin);
+        $grade->rawgrademax = grade_floatval($this->grademax);
+        $grade->rawscaleid  = grade_floatval($this->scaleid);
 
         // change raw grade?
         if ($rawgrade !== false) {
-            $grade->rawgrade = $rawgrade;
+            $grade->rawgrade = grade_floatval($rawgrade);
         }
 
         // do we have comment from teacher?
@@ -1512,6 +1511,11 @@ class grade_item extends grade_object {
             $grade->feedbackformat = $feedbackformat;
         }
 
+        // update final grade if possible
+        if (!$grade->is_locked() and !$grade->is_overridden()) {
+            $grade->finalgrade = grade_floatval($this->adjust_raw_grade($grade->rawgrade, $grade->rawgrademin, $grade->rawgrademax));
+        }
+
         if (is_null($grade->rawgrade)) {
             $grade->timemodified = null; // dategraded hack - not graded if no grade present, comments do not count here as grading
         }
@@ -1536,11 +1540,9 @@ class grade_item extends grade_object {
         } else if (!$this->needsupdate) {
             $course_item = grade_item::fetch_course_item($this->courseid);
             if (!$course_item->needsupdate) {
-                if (!grade_regrade_final_grades($this->courseid, $userid, $this)) {
+                if (grade_regrade_final_grades($this->courseid, $userid, $this) !== true) {
                     $this->force_regrading();
                 }
-            } else {
-                $this->force_regrading();
             }
         }
 
index 677a7b4e6a797c0b067dcceb948865666f2883f7..abbecc836b5ad36cca62dea0ce984e1998cc4d3a 100644 (file)
@@ -768,7 +768,7 @@ function grade_regrade_final_grades($courseid, $userid=null, $updated_item=null)
         }
         if ($course_item->needsupdate) {
             $updated_item->force_regrading();
-            return 'Can not do fast regrading after updating of raw grades';
+            return array($course_item->id =>'Can not do fast regrading after updating of raw grades');
         }
 
     } else {
@@ -1243,4 +1243,15 @@ function grade_course_reset($courseid) {
     return true;
 }
 
+/**
+ * Convert number to float or null
+ * @param mixed number
+ * @return mixed float or null
+ */
+function grade_floatval($number) {
+    if (is_null($number)) {
+        return null;
+    }
+    return (float)$number;
+}
 ?>