MDL-68652 core_grades: Refactor grades functions.

get_gradable_users now has extra param to retrieve only active
users. Grade reports hase their own grade_report::get_gradable_users
since they decided whether to inlcude active users from report preferences
This commit is contained in:
Ilya Tregubov
2023-12-05 10:52:55 +08:00
committed by Ilya Tregubov
parent d18acd7025
commit 175eb51e18
9 changed files with 38 additions and 18 deletions
+2 -9
View File
@@ -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);
+21
View File
@@ -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);
}
}
@@ -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) {
@@ -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.
@@ -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);
+4 -2
View File
@@ -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;
+1 -1
View File
@@ -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))) {
+4 -4
View File
@@ -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));
}
}
+1
View File
@@ -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`