From 20180b316756416db5c4612f42ddb1f73f729e5d Mon Sep 17 00:00:00 2001 From: Mark Nelson Date: Thu, 7 Jan 2016 19:34:19 +0800 Subject: [PATCH 1/2] MDL-52218 gradereport_grader: fixed 'grade:viewhidden' related errors There were two main reasons why there were PHP errors. 1) We were not passing variables as references. 2) When we were restricting the number of items shown in the report we were not collecting all of the dependencies which were required when a user did *not* have the capability 'moodle/grade:viewhidden'. This would cause an undefined offset error due to the index missing in the dependency array. This also meant that a user without the capability 'moodle/grade:viewhidden' could view the course total without hidden items being taken into account if they were not being displayed. To resolve this we now pass all the grades and grade items when the user does not have the capability - which also solves the PHP errors listed above. --- grade/report/grader/lib.php | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php index aba460fb9e0..0900392a807 100644 --- a/grade/report/grader/lib.php +++ b/grade/report/grader/lib.php @@ -38,6 +38,13 @@ class grade_report_grader extends grade_report { */ public $grades; + /** + * Contains all the grades for the course - even the ones not displayed in the grade tree. + * + * @var array $allgrades + */ + private $allgrades; + /** * Array of errors for bulk grades updating. * @var array $gradeserror @@ -538,8 +545,10 @@ class grade_report_grader extends grade_report { if ($grades = $DB->get_records_sql($sql, $params)) { foreach ($grades as $graderec) { + $grade = new grade_grade($graderec, false); + $this->allgrades[$graderec->userid][$graderec->itemid] = $grade; if (in_array($graderec->userid, $userids) and array_key_exists($graderec->itemid, $this->gtree->get_items())) { // some items may not be present!! - $this->grades[$graderec->userid][$graderec->itemid] = new grade_grade($graderec, false); + $this->grades[$graderec->userid][$graderec->itemid] = $grade; $this->grades[$graderec->userid][$graderec->itemid]->grade_item = $this->gtree->get_item($graderec->itemid); // db caching } } @@ -553,6 +562,8 @@ class grade_report_grader extends grade_report { $this->grades[$userid][$itemid]->itemid = $itemid; $this->grades[$userid][$itemid]->userid = $userid; $this->grades[$userid][$itemid]->grade_item = $this->gtree->get_item($itemid); // db caching + + $this->allgrades[$userid][$itemid] = $this->grades[$userid][$itemid]; } } } @@ -887,13 +898,23 @@ class grade_report_grader extends grade_report { } $jsscales = $scalesarray; + // Get all the grade items if the user can not view hidden grade items. + // It is possible that the user is simply viewing the 'Course total' by switching to the 'Aggregates only' view + // and that this user does not have the ability to view hidden items. In this case we still need to pass all the + // grade items (in case one has been hidden) as the course total shown needs to be adjusted for this particular + // user. + if (!$this->canviewhidden) { + $allgradeitems = grade_item::fetch_all(array('courseid' => $this->courseid)); + } + foreach ($this->users as $userid => $user) { if ($this->canviewhidden) { $altered = array(); $unknown = array(); } else { - $hidingaffected = grade_grade::get_hiding_affected($this->grades[$userid], $this->gtree->get_items()); + $usergrades = $this->allgrades[$userid]; + $hidingaffected = grade_grade::get_hiding_affected($usergrades, $allgradeitems); $altered = $hidingaffected['altered']; $unknown = $hidingaffected['unknown']; unset($hidingaffected); From ae139d79112094c89f195cbe47f29142045fe963 Mon Sep 17 00:00:00 2001 From: Mark Nelson Date: Fri, 8 Jan 2016 15:34:51 +0800 Subject: [PATCH 2/2] MDL-52218 gradereport_grader: added behat test for switching views --- .../grader/tests/behat/switch_views.feature | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 grade/report/grader/tests/behat/switch_views.feature diff --git a/grade/report/grader/tests/behat/switch_views.feature b/grade/report/grader/tests/behat/switch_views.feature new file mode 100644 index 00000000000..db1d5b7724b --- /dev/null +++ b/grade/report/grader/tests/behat/switch_views.feature @@ -0,0 +1,121 @@ +@gradereport @gradereport_grader +Feature: We can change what we are viewing on the grader report + In order to check the expected results are displayed + As a teacher + I need to assign grades and check that they display correctly in the gradebook when switching between views. + + Background: + Given the following "courses" exist: + | fullname | shortname | format | + | Course 1 | C1 | topics | + And the following "users" exist: + | username | firstname | lastname | email | + | teacher1 | Teacher | 1 | teacher1@example.com | + | student1 | Student | 1 | student1@example.com | + And the following "course enrolments" exist: + | user | course | role | + | teacher1 | C1 | editingteacher | + | student1 | C1 | student | + And I log in as "teacher1" + And I follow "Course 1" + And I turn editing mode on + And I add a "Assignment" to section "1" and I fill the form with: + | Assignment name | Test assignment name 1 | + | Description | Submit your online text | + | assignsubmission_onlinetext_enabled | 1 | + And I add a "Assignment" to section "1" and I fill the form with: + | Assignment name | Test assignment name 2 | + | Description | Submit your online text | + | assignsubmission_onlinetext_enabled | 1 | + And I log out + And I log in as "student1" + And I follow "Course 1" + And I follow "Test assignment name 1" + When I press "Add submission" + And I set the following fields to these values: + | Online text | This is a submission for assignment 1 | + And I press "Save changes" + Then I should see "Submitted for grading" + And I follow "Course 1" + And I follow "Test assignment name 2" + When I press "Add submission" + And I set the following fields to these values: + | Online text | This is a submission for assignment 2 | + And I press "Save changes" + Then I should see "Submitted for grading" + And I log out + And I log in as "teacher1" + And I follow "Course 1" + And I navigate to "Grades" node in "Course administration" + And I turn editing mode on + And I give the grade "80.00" to the user "Student 1" for the grade item "Test assignment name 1" + And I give the grade "90.00" to the user "Student 1" for the grade item "Test assignment name 2" + And I press "Save changes" + And I turn editing mode off + + @javascript + Scenario: View and minimise the grader report containing hidden activities + And I follow "Course 1" + And I turn editing mode on + And I open "Test assignment name 2" actions menu + And I click on "Hide" "link" in the "Test assignment name 2" activity + And I follow "Course 1" + And I navigate to "Grades" node in "Course administration" + And I select "Grader report" from the "Grade report" singleselect + And I should see "Test assignment name 1" + And I should see "Test assignment name 2" + And I should see "Course total" + And the following should exist in the "user-grades" table: + | -1- | -4- | -5- | -6- | + | Student 1 | 80 | 90 | 170 | + And I click on "Change to aggregates only" "link" + And I should not see "Test assignment name 1" + And I should not see "Test assignment name 2" + And I should see "Course total" + And the following should exist in the "user-grades" table: + | -1- | -4- | + | Student 1 | 170 | + And I click on "Change to grades only" "link" + And I should see "Test assignment name 1" + And I should see "Test assignment name 2" + And I should not see "Course total" + And the following should exist in the "user-grades" table: + | -1- | -4- | -5- | + | Student 1 | 80 | 90 | + + @javascript + Scenario: View and minimise the grader report containing hidden activities without the 'moodle/grade:viewhidden' capability + And I follow "Course 1" + And I turn editing mode on + And I open "Test assignment name 2" actions menu + And I click on "Hide" "link" in the "Test assignment name 2" activity + And I log out + And I log in as "admin" + And I set the following system permissions of "Teacher" role: + | capability | permission | + | moodle/grade:viewhidden | Prevent | + And I log out + And I log in as "teacher1" + And I follow "Course 1" + And I navigate to "Grades" node in "Course administration" + And I select "Grader report" from the "Grade report" singleselect + And I should see "Test assignment name 1" + And I should see "Test assignment name 2" + And I should see "Course total" + And the following should exist in the "user-grades" table: + | -1- | -4- | -5- | -6- | + | Student 1 | 80 | - | 80 | + And I click on "Change to aggregates only" "link" + And I should not see "Test assignment name 1" + And I should not see "Test assignment name 2" + And I should see "Course total" + And the following should exist in the "user-grades" table: + | -1- | -4- | + | Student 1 | 80 | + And I click on "Change to grades only" "link" + And I should see "Test assignment name 1" + And I should see "Test assignment name 2" + And I should not see "Course total" + And the following should exist in the "user-grades" table: + | -1- | -4- | -5- | + | Student 1 | 80 | - |