Skip to content

Commit

Permalink
MDL-52218 gradereport_grader: fixed 'grade:viewhidden' related errors
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
mdjnelson committed Jan 11, 2016
1 parent e65dfd9 commit 20180b3
Showing 1 changed file with 23 additions and 2 deletions.
25 changes: 23 additions & 2 deletions grade/report/grader/lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -538,8 +545,10 @@ public function load_final_grades() {

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
}
}
Expand All @@ -553,6 +562,8 @@ public function load_final_grades() {
$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];
}
}
}
Expand Down Expand Up @@ -887,13 +898,23 @@ public function get_right_rows($displayaverages) {
}
$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);
Expand Down

0 comments on commit 20180b3

Please sign in to comment.