diff --git a/lib/grade/grade_category.php b/lib/grade/grade_category.php index 2494c7060f5..e331d0b2133 100644 --- a/lib/grade/grade_category.php +++ b/lib/grade/grade_category.php @@ -722,6 +722,16 @@ class grade_category extends grade_object { } + // First, check if all grades are null, because the final grade will be null + // even when aggreateonlygraded is true. + $allnull = true; + foreach ($grade_values as $v) { + if (!is_null($v)) { + $allnull = false; + break; + } + } + // For items with no value, and not excluded - either set their grade to 0 or exclude them. foreach ($items as $itemid=>$value) { if (!isset($grade_values[$itemid]) and !in_array($itemid, $excluded)) { @@ -789,9 +799,13 @@ class grade_category extends grade_object { $result['grademin'] = 0; } - // Recalculate the grade back to requested range. - $finalgrade = grade_grade::standardise_score($agg_grade, 0, 1, $result['grademin'], $result['grademax']); - $grade->finalgrade = $this->grade_item->bounded_grade($finalgrade); + if ($allnull) { + $grade->finalgrade = null; + } else { + // Recalculate the grade back to requested range. + $finalgrade = grade_grade::standardise_score($agg_grade, 0, 1, $result['grademin'], $result['grademax']); + $grade->finalgrade = $this->grade_item->bounded_grade($finalgrade); + } $oldrawgrademin = $grade->rawgrademin; $oldrawgrademax = $grade->rawgrademax;