From aa5132140bad9e738bd88de0b152b64b4abbf8d0 Mon Sep 17 00:00:00 2001 From: Rajesh Taneja Date: Mon, 1 Jul 2013 14:20:21 +0800 Subject: [PATCH] MDL-40358 Administration: Added group and status filter on user enrolment page --- enrol/locallib.php | 47 ++++++++++++++++++++++++++++++++++++++++++- enrol/users.php | 4 +++- enrol/users_forms.php | 16 +++++++++++++++ 3 files changed, 65 insertions(+), 2 deletions(-) diff --git a/enrol/locallib.php b/enrol/locallib.php index a2039da679e..bcc2a80745b 100644 --- a/enrol/locallib.php +++ b/enrol/locallib.php @@ -61,6 +61,16 @@ class course_enrolment_manager { * @var string */ protected $searchfilter = ''; + /** + * Limits the focus of the manager to users in specified group + * @var int + */ + protected $groupfilter = ''; + /** + * Limits the focus of the manager to users who match status active/inactive + * @var int + */ + protected $statusfilter = ''; /** * The total number of users enrolled in the course @@ -120,15 +130,19 @@ class course_enrolment_manager { * @param string $instancefilter * @param int $rolefilter If non-zero, filters to users with specified role * @param string $searchfilter If non-blank, filters to users with search text + * @param int $groupfilter if non-zero, filter users with specified group + * @param int $statusfilter if not -1, filter users with active/inactive enrollment. */ public function __construct(moodle_page $moodlepage, $course, $instancefilter = null, - $rolefilter = 0, $searchfilter = '') { + $rolefilter = 0, $searchfilter = '', $groupfilter = 0, $statusfilter = -1) { $this->moodlepage = $moodlepage; $this->context = context_course::instance($course->id); $this->course = $course; $this->instancefilter = $instancefilter; $this->rolefilter = $rolefilter; $this->searchfilter = $searchfilter; + $this->groupfilter = $groupfilter; + $this->statusfilter = $statusfilter; } /** @@ -158,6 +172,7 @@ class course_enrolment_manager { FROM {user} u JOIN {user_enrolments} ue ON (ue.userid = u.id AND ue.enrolid $instancessql) JOIN {enrol} e ON (e.id = ue.enrolid) + LEFT JOIN {groups_members} gm ON u.id = gm.userid WHERE $filtersql"; $this->totalusers = (int)$DB->count_records_sql($sqltotal, $params); } @@ -227,6 +242,7 @@ class course_enrolment_manager { JOIN {user_enrolments} ue ON (ue.userid = u.id AND ue.enrolid $instancessql) JOIN {enrol} e ON (e.id = ue.enrolid) LEFT JOIN {user_lastaccess} ul ON (ul.courseid = e.courseid AND ul.userid = u.id) + LEFT JOIN {groups_members} gm ON u.id = gm.userid WHERE $filtersql"; if ($sort === 'firstname') { $sql .= " ORDER BY u.firstname $direction, u.lastname $direction"; @@ -270,6 +286,29 @@ class course_enrolment_manager { $params['roleid'] = $this->rolefilter; } + // Group condition. + if ($this->groupfilter) { + $sql .= " AND gm.groupid = :groupid"; + $params['groupid'] = $this->groupfilter; + } + + // Status condition. + if ($this->statusfilter === ENROL_USER_ACTIVE) { + $sql .= " AND ue.status = :active AND e.status = :enabled AND ue.timestart < :now1 + AND (ue.timeend = 0 OR ue.timeend > :now2)"; + $now = round(time(), -2); // rounding helps caching in DB + $params += array('enabled' => ENROL_INSTANCE_ENABLED, + 'active' => ENROL_USER_ACTIVE, + 'now1' => $now, 'now2' => $now); + } else if ($this->statusfilter === ENROL_USER_SUSPENDED) { + $sql .= " AND ue.status = :inactive OR e.status = :disabled OR ue.timestart > :now1 + OR (ue.timeend <> 0 AND ue.timeend < :now2)"; + $now = round(time(), -2); // rounding helps caching in DB + $params += array('disabled' => ENROL_INSTANCE_DISABLED, + 'inactive' => ENROL_USER_SUSPENDED, + 'now1' => $now, 'now2' => $now); + } + return array($sql, $params); } @@ -852,6 +891,12 @@ class course_enrolment_manager { if ($this->searchfilter !== '') { $args['search'] = $this->searchfilter; } + if (!empty($this->groupfilter)) { + $args['group'] = $this->groupfilter; + } + if ($this->statusfilter !== -1) { + $args['status'] = $this->statusfilter; + } return $args; } diff --git a/enrol/users.php b/enrol/users.php index d8453fb1f80..6cffa8a638d 100644 --- a/enrol/users.php +++ b/enrol/users.php @@ -33,6 +33,8 @@ $action = optional_param('action', '', PARAM_ALPHANUMEXT); $filter = optional_param('ifilter', 0, PARAM_INT); $search = optional_param('search', '', PARAM_RAW); $role = optional_param('role', 0, PARAM_INT); +$fgroup = optional_param('filtergroup', 0, PARAM_INT); +$status = optional_param('status', -1, PARAM_INT); // When users reset the form, redirect back to first page without other params. if (optional_param('resetbutton', '', PARAM_RAW) !== '') { @@ -50,7 +52,7 @@ require_login($course); require_capability('moodle/course:enrolreview', $context); $PAGE->set_pagelayout('admin'); -$manager = new course_enrolment_manager($PAGE, $course, $filter, $role, $search); +$manager = new course_enrolment_manager($PAGE, $course, $filter, $role, $search, $fgroup, $status); $table = new course_enrolment_users_table($manager, $PAGE); $PAGE->set_url('/enrol/users.php', $manager->get_url_params()+$table->get_url_params()); navigation_node::override_active_url(new moodle_url('/enrol/users.php', array('id' => $id))); diff --git a/enrol/users_forms.php b/enrol/users_forms.php index 6bdb5500b3b..a854d80862e 100644 --- a/enrol/users_forms.php +++ b/enrol/users_forms.php @@ -163,6 +163,22 @@ class enrol_users_filter_form extends moodleform { $mform->addElement('select', 'role', get_string('role'), array(0 => get_string('all')) + $rolenames); + // Filter by group. + $allgroups = $manager->get_all_groups(); + $groupsmenu[0] = get_string('allparticipants'); + foreach($allgroups as $gid => $unused) { + $groupsmenu[$gid] = $allgroups[$gid]->name; + } + if (count($groupsmenu) > 1) { + $mform->addElement('select', 'filtergroup', get_string('group'), $groupsmenu); + } + + // Status active/inactive. + $mform->addElement('select', 'status', get_string('status'), + array(-1 => get_string('all'), + ENROL_USER_ACTIVE => get_string('active'), + ENROL_USER_SUSPENDED => get_string('inactive'))); + // Submit button does not use add_action_buttons because that adds // another fieldset which causes the CSS style to break in an unfixable // way due to fieldset quirks.