From 87914aa40720a88b40fddc029c325e7dd2c8e45e Mon Sep 17 00:00:00 2001 From: Frederic Massart Date: Thu, 5 Feb 2015 15:06:32 +0800 Subject: [PATCH] MDL-47953 gradereport_grader: Accurate pagination with suspended users Thanks to Zvonko Martinovic for pointing out the source of the bug. --- grade/report/grader/lib.php | 53 ++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php index d6700dd92f7..fb83a55e23a 100644 --- a/grade/report/grader/lib.php +++ b/grade/report/grader/lib.php @@ -415,8 +415,14 @@ 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'); + // Check the status of showing only active enrolments. + $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)); @@ -479,30 +485,29 @@ class grade_report_grader extends grade_report { $this->userselect = "AND g.userid $usql"; $this->userselect_params = $uparams; - // Add a flag to each user indicating whether their enrolment is active. - $sql = "SELECT ue.userid - FROM {user_enrolments} ue - JOIN {enrol} e ON e.id = ue.enrolid - WHERE ue.userid $usql - AND ue.status = :uestatus - AND e.status = :estatus - 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); + // First flag everyone as not suspended. 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)) { - unset($this->users[$user->id]); - } else { + $this->users[$user->id]->suspendedenrolment = false; + } + + // If we want to mix both suspended and not suspended users, let's find out who is suspended. + if (!$showonlyactiveenrol) { + $sql = "SELECT ue.userid + FROM {user_enrolments} ue + JOIN {enrol} e ON e.id = ue.enrolid + WHERE ue.userid $usql + AND ue.status = :uestatus + AND e.status = :estatus + AND e.courseid = :courseid + AND ue.timestart < :now1 AND (ue.timeend = 0 OR ue.timeend > :now2) + GROUP BY ue.userid"; + + $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); + + foreach ($this->users as $user) { $this->users[$user->id]->suspendedenrolment = !array_key_exists($user->id, $useractiveenrolments); } }