From 1b735f27612f4110d1efbf14a267e91a7ead477a Mon Sep 17 00:00:00 2001 From: Marina Glancy Date: Tue, 20 Jun 2017 15:27:16 +0800 Subject: [PATCH 1/3] MDL-59055 grades: fix bug displaying item id instead of grade Thanks to Marcelo Santos for initial patch --- grade/report/grader/lib.php | 2 +- grade/report/lib.php | 2 +- lib/grade/grade_grade.php | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php index 6e9c98c2fd9..77da506e7b6 100644 --- a/grade/report/grader/lib.php +++ b/grade/report/grader/lib.php @@ -996,7 +996,7 @@ class grade_report_grader extends grade_report { // Get the decimal points preference for this item $decimalpoints = $item->get_decimals(); - if (in_array($itemid, $unknown)) { + if (array_key_exists($itemid, $unknown)) { $gradeval = null; } else if (array_key_exists($itemid, $altered)) { $gradeval = $altered[$itemid]; diff --git a/grade/report/lib.php b/grade/report/lib.php index d925ef7e372..4b0ad2e331d 100644 --- a/grade/report/lib.php +++ b/grade/report/lib.php @@ -525,7 +525,7 @@ abstract class grade_report { $aggregationweight = null; } } - } else if (!empty($hiding_affected['unknown'][$course_item->id])) { + } else if (array_key_exists($course_item->id, $hiding_affected['unknown'])) { //not sure whether or not this item depends on a hidden item if (!$this->showtotalsifcontainhidden[$courseid]) { //hide the grade diff --git a/lib/grade/grade_grade.php b/lib/grade/grade_grade.php index eb57b0dd7eb..dc265650c35 100644 --- a/lib/grade/grade_grade.php +++ b/lib/grade/grade_grade.php @@ -795,10 +795,10 @@ class grade_grade extends grade_object { for($i=0; $i<$max; $i++) { $found = false; foreach($todo as $key=>$do) { - $hidden_precursors = array_intersect($dependson[$do], $unknown); + $hidden_precursors = array_intersect($dependson[$do], array_keys($unknown)); if ($hidden_precursors) { // this item depends on hidden grade indirectly - $unknown[$do] = $do; + $unknown[$do] = $grade_grades[$do]->finalgrade; unset($todo[$key]); $found = true; continue; @@ -828,7 +828,7 @@ class grade_grade extends grade_object { ) { // This is a grade item that is not a category or course and has been affected by grade hiding. // I guess this means it is a calculation that needs to be recalculated. - $unknown[$do] = $do; + $unknown[$do] = $grade_grades[$do]->finalgrade; unset($todo[$key]); $found = true; continue; From b8bb94808c619fdbd0e1f42c53c9fe32d917310b Mon Sep 17 00:00:00 2001 From: Marina Glancy Date: Tue, 20 Jun 2017 15:46:08 +0800 Subject: [PATCH 2/3] MDL-59055 grades: provide backward-compatibility of changes --- grade/report/grader/lib.php | 2 +- grade/report/lib.php | 4 ++-- lib/grade/grade_grade.php | 9 ++++++--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php index 77da506e7b6..40afab03bc6 100644 --- a/grade/report/grader/lib.php +++ b/grade/report/grader/lib.php @@ -974,7 +974,7 @@ class grade_report_grader extends grade_report { $usergrades = $this->allgrades[$userid]; $hidingaffected = grade_grade::get_hiding_affected($usergrades, $allgradeitems); $altered = $hidingaffected['altered']; - $unknown = $hidingaffected['unknown']; + $unknown = $hidingaffected['unknowngrades']; unset($hidingaffected); } diff --git a/grade/report/lib.php b/grade/report/lib.php index 4b0ad2e331d..45c652eca28 100644 --- a/grade/report/lib.php +++ b/grade/report/lib.php @@ -525,14 +525,14 @@ abstract class grade_report { $aggregationweight = null; } } - } else if (array_key_exists($course_item->id, $hiding_affected['unknown'])) { + } else if (array_key_exists($course_item->id, $hiding_affected['unknowngrades'])) { //not sure whether or not this item depends on a hidden item if (!$this->showtotalsifcontainhidden[$courseid]) { //hide the grade $finalgrade = null; } else { //use reprocessed marks that exclude hidden items - $finalgrade = $hiding_affected['unknown'][$course_item->id]; + $finalgrade = $hiding_affected['unknowngrades'][$course_item->id]; if (array_key_exists($course_item->id, $hiding_affected['alteredgrademin'])) { $grademin = $hiding_affected['alteredgrademin'][$course_item->id]; diff --git a/lib/grade/grade_grade.php b/lib/grade/grade_grade.php index dc265650c35..f2b30af4606 100644 --- a/lib/grade/grade_grade.php +++ b/lib/grade/grade_grade.php @@ -727,8 +727,9 @@ class grade_grade extends grade_object { * * @param array $grade_grades all course grades of one user, & used for better internal caching * @param array $grade_items array of grade items, & used for better internal caching - * @return array This is an array of 3 arrays: - * unknown => list of item ids that may be affected by hiding (with the calculated grade as the value) + * @return array This is an array of following arrays: + * unknown => list of item ids that may be affected by hiding (with the ITEM ID as both the key and the value) - for BC with old gradereport plugins + * unknowngrades => list of item ids that may be affected by hiding (with the calculated grade as the value) * altered => list of item ids that are definitely affected by hiding (with the calculated grade as the value) * alteredgrademax => for each item in altered or unknown, the new value of the grademax * alteredgrademin => for each item in altered or unknown, the new value of the grademin @@ -779,6 +780,7 @@ class grade_grade extends grade_object { if (!$hiddenfound) { return array('unknown' => array(), + 'unknowngrades' => array(), 'altered' => array(), 'alteredgrademax' => array(), 'alteredgrademin' => array(), @@ -953,7 +955,8 @@ class grade_grade extends grade_object { } } - return array('unknown' => $unknown, + return array('unknown' => array_combine(array_keys($unknown), array_keys($unknown)), // Left for BC in case some gradereport plugins expect it. + 'unknowngrades' => $unknown, 'altered' => $altered, 'alteredgrademax' => $alteredgrademax, 'alteredgrademin' => $alteredgrademin, From 782f95ce5e6129654cc9cbd604442508ce7201ac Mon Sep 17 00:00:00 2001 From: Damyon Wiese Date: Thu, 3 Aug 2017 15:58:06 +0800 Subject: [PATCH 3/3] MDL-59055 grades: behat test --- grade/tests/behat/grade_hidden_items.feature | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/grade/tests/behat/grade_hidden_items.feature b/grade/tests/behat/grade_hidden_items.feature index fd7aa450f2d..d81ab20ff27 100644 --- a/grade/tests/behat/grade_hidden_items.feature +++ b/grade/tests/behat/grade_hidden_items.feature @@ -27,6 +27,14 @@ Feature: Student and teacher's view of aggregated grade items is consistent when | assign | C1 | a3 | Test assignment three | Submit something! | Sub category 2 | 100 | | assign | C1 | a4 | Test assignment four | Submit something! | Sub category 2 | 100 | And I log in as "admin" + And I am on "Course 1" course homepage + And I navigate to "Setup > Gradebook setup" in the course gradebook + And I press "Add grade item" + And I set the following fields to these values: + | Item name | calculated | + And I press "Save changes" + And I set "=[[a4]]/2" calculation for grade item "calculated" with idnumbers: + | Sub category 1 | sub1 | And I navigate to "Overview report" node in "Site administration > Grades > Report settings" And I set the field "s__grade_report_overview_showtotalsifcontainhidden" to "Show totals excluding hidden items" And I navigate to "User report" node in "Site administration > Grades > Report settings"