diff --git a/course/classes/reportbuilder/datasource/participants.php b/course/classes/reportbuilder/datasource/participants.php index 7c503495b40..558a539a3d0 100644 --- a/course/classes/reportbuilder/datasource/participants.php +++ b/course/classes/reportbuilder/datasource/participants.php @@ -27,8 +27,10 @@ use core_group\reportbuilder\local\entities\group; use core_reportbuilder\datasource; use core_reportbuilder\local\entities\course; use core_reportbuilder\local\entities\user; +use core_reportbuilder\local\filters\select; use core_reportbuilder\local\helpers\database; use core_role\reportbuilder\local\entities\role; +use core_user\output\status_field; /** * Course participants datasource @@ -77,9 +79,9 @@ class participants extends datasource { // Join user entity. $userentity = new user(); $user = $userentity->get_table_alias('user'); - $userentity->add_joins($enrolmententity->get_joins()); - $userentity->add_join("LEFT JOIN {user} {$user} ON {$userenrolment}.userid = {$user}.id AND {$user}.deleted = 0"); - $this->add_entity($userentity); + $this->add_entity($userentity + ->add_joins($enrolmententity->get_joins()) + ->add_join("LEFT JOIN {user} {$user} ON {$user}.id = {$userenrolment}.userid AND {$user}.deleted = 0")); // Join the role entity. $roleentity = (new role()) @@ -108,8 +110,7 @@ class participants extends datasource { ->add_joins($userentity->get_joins()) ->add_join(" LEFT JOIN ({$groupsinnerselect}) {$groups} - ON {$groups}.courseid = {$course}.id - AND {$groups}.userid = {$user}.id") + ON {$groups}.courseid = {$course}.id AND {$groups}.userid = {$user}.id") ); // Join completion entity. @@ -130,12 +131,11 @@ class participants extends datasource { $accessentity = (new access()) ->set_table_alias('user', $user); $lastaccess = $accessentity->get_table_alias('user_lastaccess'); - $accessentity->add_joins($userentity->get_joins()); - $accessentity->add_join(" - LEFT JOIN {user_lastaccess} {$lastaccess} - ON {$lastaccess}.userid = {$user}.id AND {$lastaccess}.courseid = {$course}.id - "); - $this->add_entity($accessentity); + $this->add_entity($accessentity + ->add_joins($userentity->get_joins()) + ->add_join(" + LEFT JOIN {user_lastaccess} {$lastaccess} + ON {$lastaccess}.userid = {$user}.id AND {$lastaccess}.courseid = {$course}.id")); // Add all entities columns/filters/conditions. $this->add_all_from_entities(); @@ -158,8 +158,21 @@ class participants extends datasource { public function get_default_columns(): array { return [ 'course:coursefullnamewithlink', - 'enrol:name', 'user:fullnamewithlink', + 'enrol:name', + ]; + } + + /** + * Return the column sorting that will be added to the report upon creation + * + * @return int[] + */ + public function get_default_column_sorting(): array { + return [ + 'course:coursefullnamewithlink' => SORT_ASC, + 'user:fullnamewithlink' => SORT_ASC, + 'enrol:name' => SORT_ASC, ]; } @@ -182,8 +195,21 @@ class participants extends datasource { */ public function get_default_conditions(): array { return [ + 'enrolment:status', 'user:suspended', 'user:confirmed', ]; } + + /** + * Return the condition values that will be set for the report upon creation + * + * @return array + */ + public function get_default_condition_values(): array { + return [ + 'enrolment:status_operator' => select::EQUAL_TO, + 'enrolment:status_value' => status_field::STATUS_ACTIVE, + ]; + } } diff --git a/course/tests/reportbuilder/datasource/participants_test.php b/course/tests/reportbuilder/datasource/participants_test.php index e95d10cf286..8bbdb09e563 100644 --- a/course/tests/reportbuilder/datasource/participants_test.php +++ b/course/tests/reportbuilder/datasource/participants_test.php @@ -20,7 +20,6 @@ namespace core_course\reportbuilder\datasource; use completion_completion; use completion_criteria_self; -use core_collator; use core_reportbuilder\local\filters\boolean_select; use core_reportbuilder\local\filters\date; use core_reportbuilder\local\filters\duration; @@ -28,8 +27,8 @@ use core_reportbuilder\local\filters\select; use core_reportbuilder\local\filters\text; use core_reportbuilder_generator; use core_reportbuilder_testcase; +use core_user; use grade_item; -use moodle_url; defined('MOODLE_INTERNAL') || die(); @@ -41,8 +40,6 @@ require_once("{$CFG->dirroot}/reportbuilder/tests/helpers.php"); * * @package core_course * @covers \core_course\reportbuilder\datasource\participants - * @covers \core_course\reportbuilder\local\formatters\completion - * @covers \core_course\reportbuilder\local\formatters\enrolment * @copyright 2022 David Matamoros * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ @@ -62,11 +59,23 @@ class participants_test extends core_reportbuilder_testcase { * Test default datasource */ public function test_datasource_default(): void { - $this->resetAfterTest(); - $this->setAdminUser(); + global $DB; - $course = $this->getDataGenerator()->create_course(); - $user = $this->getDataGenerator()->create_and_enrol($course, 'student'); + $this->resetAfterTest(); + + // Course one, two manually enrolled users. + $courseone = $this->getDataGenerator()->create_course(['fullname' => 'Zebras']); + $userone = $this->getDataGenerator()->create_and_enrol($courseone, 'student', ['firstname' => 'Zoe']); + $usertwo = $this->getDataGenerator()->create_and_enrol($courseone, 'student', ['firstname' => 'Amy']); + + // Course two, two self enrolled users (one inactive). + $coursetwo = $this->getDataGenerator()->create_course(['fullname' => 'Aardvarks']); + + $enrol = $DB->get_record('enrol', ['courseid' => $coursetwo->id, 'enrol' => 'self']); + enrol_get_plugin($enrol->enrol)->update_status($enrol, ENROL_INSTANCE_ENABLED); + + $this->getDataGenerator()->enrol_user($userone->id, $coursetwo->id, null, 'self'); + $this->getDataGenerator()->enrol_user($usertwo->id, $coursetwo->id, null, 'self', 0, 0, ENROL_USER_SUSPENDED); /** @var core_reportbuilder_generator $generator */ $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); @@ -74,18 +83,20 @@ class participants_test extends core_reportbuilder_testcase { $content = $this->get_custom_report_content($report->get('id')); - // Consistent order, just in case. - core_collator::asort_array_of_arrays_by_key($content, 'c1_enrol'); - $content = array_values($content); + // Default columns are course, user, method. Sorted by each. + $courseoneurl = course_get_url($courseone); + $coursetwourl = course_get_url($coursetwo); - $courseurl = course_get_url($course); - $userurl = new moodle_url('/user/profile.php', ['id' => $user->id]); + $useroneurl = core_user::get_profile_url($userone); + $usertwourl = core_user::get_profile_url($usertwo); $this->assertEquals([ - ["{$course->fullname}", 'Guest access', ''], - ["{$course->fullname}", 'Manual enrolments', - "" . fullname($user) . ""], - ["{$course->fullname}", 'Self enrolment (Student)', ''], + ["{$coursetwo->fullname}", + "" . fullname($userone) . "", 'Self enrolment (Student)'], + ["{$courseone->fullname}", + "" . fullname($usertwo) . "", 'Manual enrolments'], + ["{$courseone->fullname}", + "" . fullname($userone) . "", 'Manual enrolments'], ], array_map('array_values', $content)); } @@ -136,7 +147,7 @@ class participants_test extends core_reportbuilder_testcase { /** @var core_reportbuilder_generator $generator */ $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); - $report = $generator->create_report(['name' => 'Courses', 'source' => participants::class, 'default' => false]); + $report = $generator->create_report(['name' => 'Participants', 'source' => participants::class, 'default' => false]); $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:fullname']); @@ -408,7 +419,7 @@ class participants_test extends core_reportbuilder_testcase { /** @var core_reportbuilder_generator $generator */ $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); - $report = $generator->create_report(['name' => 'Courses', 'source' => participants::class, 'default' => false]); + $report = $generator->create_report(['name' => 'Participants', 'source' => participants::class, 'default' => false]); // Add user firstname column to the report. $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:firstname']);