diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php index 2261691d23d..47c31e912ef 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]; } } } @@ -898,13 +909,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); 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 | - |