MDL-51552 gradebook: Single view bulk insert fix.
authorAdrian Greeve <adrian@moodle.com>
Mon, 12 Oct 2015 08:43:22 +0000 (16:43 +0800)
committerAdrian Greeve <adrian@moodle.com>
Thu, 29 Oct 2015 08:00:46 +0000 (16:00 +0800)
Single view now doesn't overwrite non-empty grades.

A thank you to Sam Anderson and Robert Russo for providing a patch.

grade/report/singleview/classes/local/screen/grade.php
grade/report/singleview/classes/local/screen/user.php
grade/report/singleview/classes/local/ui/finalgrade.php

index afccbd6..ddebda7 100644 (file)
@@ -333,19 +333,13 @@ class grade extends tablelike implements selectable_items, filterable_items {
 
                     $data->$field = empty($grade) ? $null : $grade->finalgrade;
                     $data->{"old$field"} = $data->$field;
-
-                    preg_match('/_(\d+)_(\d+)/', $field, $oldoverride);
-                    $oldoverride = 'oldoverride' . $oldoverride[0];
-                    if (empty($data->$oldoverride)) {
-                        $data->$field = (!isset($grade->rawgrade)) ? $null : $grade->rawgrade;
-                    }
                 }
             }
 
             foreach ($data as $varname => $value) {
                 if (preg_match('/^oldoverride_(\d+)_(\d+)/', $varname, $matches)) {
-                    // If we've selected override or overriding all grades.
-                    if (!empty($data->$matches[0]) || $filter == 'all') {
+                    // If we've selected overriding all grades.
+                    if ($filter == 'all') {
                         $override = "override_{$matches[1]}_{$matches[2]}";
                         $data->$override = '1';
                     }
index 1c677a3..3043a86 100644 (file)
@@ -336,29 +336,32 @@ class user extends tablelike implements selectable_items {
                 }
 
                 $oldfinalgradefield = "oldfinalgrade_{$gradeitem->id}_{$this->itemid}";
-                if (!empty($data->$oldfinalgradefield)) {
+                // Bulk grade changes for all grades need to be processed and shouldn't be skipped if they had a previous grade.
+                if ($gradeitem->is_course_item() || ($filter != 'all' && !empty($data->$oldfinalgradefield))) {
+                    if ($gradeitem->is_course_item()) {
+                        // The course total should not be overridden.
+                        unset($data->$field);
+                        unset($data->oldfinalgradefield);
+                        $oldoverride = "oldoverride_{$gradeitem->id}_{$this->itemid}";
+                        unset($data->$oldoverride);
+                        $oldfeedback = "oldfeedback_{$gradeitem->id}_{$this->itemid}";
+                        unset($data->$oldfeedback);
+                    }
                     continue;
                 }
                 $grade = grade_grade::fetch(array(
-                    'itemid' => $this->itemid,
+                    'itemid' => $gradeitemid,
                     'userid' => $userid
                 ));
 
                 $data->$field = empty($grade) ? $null : $grade->finalgrade;
                 $data->{"old$field"} = $data->$field;
-
-                preg_match('/_(\d+)_(\d+)/', $field, $oldoverride);
-                $oldoverride = 'oldoverride' . $oldoverride[0];
-                if (empty($data->$oldoverride)) {
-                    $data->$field = (!isset($grade->rawgrade)) ? $null : $grade->rawgrade;
-                }
-
             }
 
             foreach ($data as $varname => $value) {
                 if (preg_match('/^oldoverride_(\d+)_(\d+)/', $varname, $matches)) {
-                    // If we've selected override or overriding all grades.
-                    if (!empty($data->$matches[0]) || $filter == 'all') {
+                    // If we've selected overriding all grades.
+                    if ($filter == 'all') {
                         $override = "override_{$matches[1]}_{$matches[2]}";
                         $data->$override = '1';
                     }
index d57083f..fe9a17e 100644 (file)
@@ -47,14 +47,7 @@ class finalgrade extends grade_attribute_format implements unique_value, be_disa
     public function get_value() {
         $this->label = $this->grade->grade_item->itemname;
 
-        $isoverridden = $this->grade->is_overridden();
-        // If the grade is overridden or the grade type is not an activity then use finalgrade.
-        if (!empty($isoverridden) || $this->grade->grade_item->itemtype != 'mod') {
-            $val = $this->grade->finalgrade;
-        } else {
-            $val = $this->grade->rawgrade;
-        }
-
+        $val = $this->grade->finalgrade;
         if ($this->grade->grade_item->scaleid) {
             return $val ? (int)$val : -1;
         } else {