diff --git a/grade/lib.php b/grade/lib.php index c31b9a5654b..7b8e8a869aa 100644 --- a/grade/lib.php +++ b/grade/lib.php @@ -786,17 +786,10 @@ function grade_get_plugin_info($courseid, $active_type, $active_plugin) { * * @param int $courseid The course ID. * @param int|null $groupid The group ID (optional). + * @param bool $onlyactiveenrol Include only active enrolments. * @return array $users A list of enrolled gradable users. */ -function get_gradable_users(int $courseid, ?int $groupid = null): array { - global $CFG; - - $context = context_course::instance($courseid); - // Create a graded_users_iterator because it will properly check the groups etc. - $defaultgradeshowactiveenrol = !empty($CFG->grade_report_showonlyactiveenrol); - $onlyactiveenrol = get_user_preferences('grade_report_showonlyactiveenrol', $defaultgradeshowactiveenrol) || - !has_capability('moodle/course:viewsuspendedusers', $context); - +function get_gradable_users(int $courseid, ?int $groupid = null, bool $onlyactiveenrol = false): array { $course = get_course($courseid); $gui = new graded_users_iterator($course, null, $groupid); $gui->require_active_enrolment($onlyactiveenrol); diff --git a/grade/report/lib.php b/grade/report/lib.php index abe7dbeb83b..43026f595ce 100644 --- a/grade/report/lib.php +++ b/grade/report/lib.php @@ -932,5 +932,26 @@ abstract class grade_report { return $modnames; } + + /** + * Load a valid list of gradable users in a course. + * + * @param int $courseid The course ID. + * @param int|null $groupid The group ID (optional). + * @return array $users A list of enrolled gradable users. + */ + public static function get_gradable_users(int $courseid, ?int $groupid = null): array { + global $CFG; + require_once($CFG->dirroot . '/grade/lib.php'); + + $context = context_course::instance($courseid); + // Create a graded_users_iterator because it will properly check the groups etc. + $defaultgradeshowactiveenrol = !empty($CFG->grade_report_showonlyactiveenrol); + $onlyactiveenrol = get_user_preferences('grade_report_showonlyactiveenrol', $defaultgradeshowactiveenrol) || + !has_capability('moodle/course:viewsuspendedusers', $context); + + return get_gradable_users($courseid, $groupid, $onlyactiveenrol); + } + } diff --git a/grade/report/singleview/classes/local/screen/grade.php b/grade/report/singleview/classes/local/screen/grade.php index d898da5df21..fa606b8bdef 100644 --- a/grade/report/singleview/classes/local/screen/grade.php +++ b/grade/report/singleview/classes/local/screen/grade.php @@ -24,6 +24,7 @@ namespace gradereport_singleview\local\screen; +use grade_report; use gradereport_singleview\local\ui\range; use gradereport_singleview\local\ui\bulk_insert; use grade_grade; @@ -151,7 +152,7 @@ class grade extends tablelike implements selectable_items, filterable_items { */ public function init($selfitemisempty = false) { - $this->items = $this->load_users(); + $this->items = grade_report::get_gradable_users($this->courseid, $this->groupid); $this->totalitemcount = count($this->items); if ($selfitemisempty) { diff --git a/grade/report/singleview/classes/local/screen/screen.php b/grade/report/singleview/classes/local/screen/screen.php index b26c908dd93..2ff96baf15c 100644 --- a/grade/report/singleview/classes/local/screen/screen.php +++ b/grade/report/singleview/classes/local/screen/screen.php @@ -25,6 +25,7 @@ namespace gradereport_singleview\local\screen; use context_course; +use grade_report; use moodle_url; use html_writer; use grade_structure; @@ -33,6 +34,7 @@ use grade_item; use stdClass; defined('MOODLE_INTERNAL') || die; +require_once($CFG->dirroot . '/grade/report/lib.php'); /** * Abstract class used as a base for the 3 screens. diff --git a/grade/report/singleview/classes/local/screen/user.php b/grade/report/singleview/classes/local/screen/user.php index 7dbd042bc1e..19117d46e63 100644 --- a/grade/report/singleview/classes/local/screen/user.php +++ b/grade/report/singleview/classes/local/screen/user.php @@ -102,7 +102,7 @@ class user extends tablelike implements selectable_items { public function init($selfitemisempty = false) { if (!$selfitemisempty) { - $validusers = $this->load_users(); + $validusers = \grade_report::get_gradable_users($this->courseid, $this->groupid); if (!isset($validusers[$this->itemid])) { // If the passed user id is not valid, show the first user from the list instead. $this->item = reset($validusers); diff --git a/grade/report/singleview/index.php b/grade/report/singleview/index.php index 4569e3cbf51..68f4cbd5132 100644 --- a/grade/report/singleview/index.php +++ b/grade/report/singleview/index.php @@ -27,6 +27,7 @@ define('NO_OUTPUT_BUFFERING', true); require_once('../../../config.php'); require_once($CFG->dirroot.'/lib/gradelib.php'); require_once($CFG->dirroot.'/grade/lib.php'); +require_once($CFG->dirroot.'/grade/report/lib.php'); $courseid = required_param('id', PARAM_INT); $groupid = optional_param('group', null, PARAM_INT); @@ -90,7 +91,8 @@ switch ($itemtype) { // If there is a stored user item (last viewed) in a session variable, bypass the user select zero state // and display this user item. Also, make sure that the stored last viewed user is part of the current // list of gradable users in this course. - if ($lastvieweduseritemid && array_key_exists($lastvieweduseritemid, get_gradable_users($courseid, $currentgroup))) { + if ($lastvieweduseritemid && + array_key_exists($lastvieweduseritemid, grade_report::get_gradable_users($courseid, $currentgroup))) { $itemtype = 'user'; $itemid = $lastvieweduseritemid; } else { @@ -103,7 +105,7 @@ switch ($itemtype) { } // If the item id (user id) cannot be defined or the user id is not part of the list of gradable users, // display the user select zero state. - if (is_null($itemid) || !array_key_exists($itemid, get_gradable_users($courseid, $currentgroup))) { + if (is_null($itemid) || !array_key_exists($itemid, grade_report::get_gradable_users($courseid, $currentgroup))) { $itemtype = 'user_select'; } break; diff --git a/grade/report/user/index.php b/grade/report/user/index.php index f13280029ae..e8dbc291084 100644 --- a/grade/report/user/index.php +++ b/grade/report/user/index.php @@ -113,7 +113,7 @@ if (has_capability('moodle/grade:viewall', $context)) { $userid = $lastvieweduserid; } - $gradableusers = get_gradable_users($courseid, $currentgroup); + $gradableusers = grade_report::get_gradable_users($courseid, $currentgroup); // Validate whether the requested user is a valid gradable user in this course. If, not display the user select // zero state. if (empty($gradableusers) || ($userid && !array_key_exists($userid, $gradableusers))) { diff --git a/grade/tests/lib_test.php b/grade/tests/lib_test.php index eedff6ddc07..5f03f6dd50e 100644 --- a/grade/tests/lib_test.php +++ b/grade/tests/lib_test.php @@ -751,7 +751,7 @@ class lib_test extends \advanced_testcase { // Now, let's suspend the enrolment of student2. $this->getDataGenerator()->enrol_user($student2->id, $course->id, 'student', 'manual', 0, 0, ENROL_USER_SUSPENDED); // Should return only the active gradable users (student1 and student3). - $gradableusers = get_gradable_users($course->id); + $gradableusers = \grade_report::get_gradable_users($course->id); $this->assertEqualsCanonicalizing([$student1->id, $student3->id], array_keys($gradableusers)); // Give teacher 'viewsuspendedusers' capability and set a preference to display suspended users. @@ -761,17 +761,17 @@ class lib_test extends \advanced_testcase { $this->setUser($teacher); // Should return all gradable users (including suspended enrolments). - $gradableusers = get_gradable_users($course->id); + $gradableusers = \grade_report::get_gradable_users($course->id); $this->assertEqualsCanonicalizing([$student1->id, $student2->id, $student3->id], array_keys($gradableusers)); // Reactivate the course enrolment of student2. $this->getDataGenerator()->enrol_user($student2->id, $course->id, 'student', 'manual', 0, 0, ENROL_USER_ACTIVE); $this->setAdminUser(); // Should return all gradable users from group1 (student1 and student2). - $gradableusers = get_gradable_users($course->id, $group1->id); + $gradableusers = \grade_report::get_gradable_users($course->id, $group1->id); $this->assertEqualsCanonicalizing([$student1->id, $student2->id], array_keys($gradableusers)); // Should return all gradable users from group2 (student3). - $gradableusers = get_gradable_users($course->id, $group2->id); + $gradableusers = \grade_report::get_gradable_users($course->id, $group2->id); $this->assertEqualsCanonicalizing([$student3->id], array_keys($gradableusers)); } } diff --git a/grade/upgrade.txt b/grade/upgrade.txt index 7e4d0d076e2..7437190520a 100644 --- a/grade/upgrade.txt +++ b/grade/upgrade.txt @@ -2,6 +2,7 @@ This file describes API changes in /grade/* ; Information provided here is intended especially for developers. === 4.2.3 === +* The function get_gradable_users() in grade/lib.php has extra param now to retrieve only active enrolments. * The grade `itemname` property contained in the return structure of the following external methods is now PARAM_CLEANHTML: - `core_grades_get_gradeitems` - `gradereport_user_get_grade_items`