MDL-47953 gradereport_grader: Accurate pagination with suspended users
Thanks to Zvonko Martinovic for pointing out the source of the bug.
This commit is contained in:
+29
-24
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user