From 43ff2e88c0f45ed8b525b23d05125270cd9754f7 Mon Sep 17 00:00:00 2001
From: Marina Glancy <marina@moodle.com>
Date: Thu, 11 Dec 2014 18:36:38 +0800
Subject: [PATCH] MDL-47953 gradebook: correct pagination of users

Thanks to Zvonko Martinovic for pointing out the source of the bug
---
 grade/report/grader/lib.php | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php
index d6700dd..f5b287e 100644
--- a/grade/report/grader/lib.php
+++ b/grade/report/grader/lib.php
@@ -415,8 +415,13 @@ class grade_report_grader extends grade_report {
         // Limit to users with a gradeable role.
         list($gradebookrolessql, $gradebookrolesparams) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0');
 
+        $coursecontext = $this->context->get_course_context(true);
+        $defaultgradeshowactiveenrol = !empty($CFG->grade_report_showonlyactiveenrol);
+        $showonlyactiveenrol = get_user_preferences('grade_report_showonlyactiveenrol', $defaultgradeshowactiveenrol);
+        $showonlyactiveenrol = $showonlyactiveenrol || !has_capability('moodle/course:viewsuspendedusers', $coursecontext);
+
         // Limit to users with an active enrollment.
-        list($enrolledsql, $enrolledparams) = get_enrolled_sql($this->context);
+        list($enrolledsql, $enrolledparams) = get_enrolled_sql($this->context, '', 0, $showonlyactiveenrol);
 
         // Fields we need from the user table.
         $userfields = user_picture::fields('u', get_extra_user_fields($this->context));
@@ -474,7 +479,7 @@ class grade_report_grader extends grade_report {
             $this->userselect = '';
             $this->users = array();
             $this->userselect_params = array();
-        } else {
+        } else if (!$showonlyactiveenrol) {
             list($usql, $uparams) = $DB->get_in_or_equal(array_keys($this->users), SQL_PARAMS_NAMED, 'usid0');
             $this->userselect = "AND g.userid $usql";
             $this->userselect_params = $uparams;
@@ -489,15 +494,11 @@ class grade_report_grader extends grade_report {
                            AND e.courseid = :courseid
                            AND ue.timestart < :now1 AND (ue.timeend = 0 OR ue.timeend > :now2)
                   GROUP BY ue.userid";
-            $coursecontext = $this->context->get_course_context(true);
             $time = time();
             $params = array_merge($uparams, array('estatus' => ENROL_INSTANCE_ENABLED, 'uestatus' => ENROL_USER_ACTIVE,
                     'courseid' => $coursecontext->instanceid, 'now1' => $time, 'now2' => $time));
             $useractiveenrolments = $DB->get_records_sql($sql, $params);
 
-            $defaultgradeshowactiveenrol = !empty($CFG->grade_report_showonlyactiveenrol);
-            $showonlyactiveenrol = get_user_preferences('grade_report_showonlyactiveenrol', $defaultgradeshowactiveenrol);
-            $showonlyactiveenrol = $showonlyactiveenrol || !has_capability('moodle/course:viewsuspendedusers', $coursecontext);
             foreach ($this->users as $user) {
                 // If we are showing only active enrolments, then remove suspended users from list.
                 if ($showonlyactiveenrol && !array_key_exists($user->id, $useractiveenrolments)) {
@@ -506,6 +507,10 @@ class grade_report_grader extends grade_report {
                     $this->users[$user->id]->suspendedenrolment = !array_key_exists($user->id, $useractiveenrolments);
                 }
             }
+        } else {
+            foreach ($this->users as $user) {
+                $this->users[$user->id]->suspendedenrolment = false;
+            }
         }
         return $this->users;
     }
-- 
1.8.3.2

