From 06e50afd5e4a75962c78fb2b9b5dafec1e57ba32 Mon Sep 17 00:00:00 2001 From: Mathew May Date: Sat, 5 Oct 2019 11:33:05 +0800 Subject: [PATCH] MDL-66077 course: Add WS to get list of users in a cmid Part of MDL-66074 --- course/amd/build/repository.min.js | Bin 756 -> 919 bytes course/amd/build/repository.min.js.map | Bin 4887 -> 5738 bytes course/amd/src/repository.js | 20 ++++++- course/externallib.php | 78 +++++++++++++++++++++++++ course/tests/externallib_test.php | 51 ++++++++++++++++ lib/db/services.php | 8 +++ 6 files changed, 156 insertions(+), 1 deletion(-) diff --git a/course/amd/build/repository.min.js b/course/amd/build/repository.min.js index 3c301ffbb76edb6478e06b52c09c6aced08212a8..2e4849bbfd8150fdf569564e138ff99e912682b6 100644 GIT binary patch delta 129 zcmeyuI-PyP5vIut7+Ksyi&Kk=-HP&ao%2hJic@{_Q%ZAEJzcEQO7oISGV}8k(o;)Z z^NR9wa#B-psMSc+te#xWq@$V&RTp0hGBiG^GCnysGet=!u_(RRsv5+$O01o{m&qIe DssJ%= delta 11 ScmbQv{)KhJ5vIxM%mx4)vjjT; diff --git a/course/amd/build/repository.min.js.map b/course/amd/build/repository.min.js.map index 21f6694971f3e01c39295fc6aa6120cd3e1fa790..1e49dc2d9b02edc66dfeac39bd8b1cb0679dedae 100644 GIT binary patch delta 641 zcmah{%Sr<=6s1)W@v#s@P|-^lzK9~?rUiv`9&MFci?(ir+D_9>u#?ebh9aeZ;6lm5 z59xonF9>e6Utuy8d_eIoZtgwj+;DTq^ZEcizS$_zBtc0KE^O|5h97c4@_s#Rk(`-` zNQ-g5)gtxLBFB4ry^inO@+h_#ckSL~tRGuwn|WklE1N+gjj>3pCTaAnvAMYAr8Skw zo}fKN?P;ohiHaC=!%(#fbfb>Ds5y`Fg~o|W#ak2QF)q~P$M|aIEUO@+Y@iaxB`vW~ z+rXx+N~>(69LBjJs#JF2yT=MOk5#fYUy#X(waJsRD&0)4GBKEu{n?e}P`d);>-j(# z1TGcec(g8Grj~Y3L$5}7Hv(Yj91N|4hVl~HE_GZrLqOjoALdpLI0-_|1a!`nfC|!u zuL2yO1y#x@YeE%TR0QBRqB$Xx)2rJf%!fm0gv<%3&o=d5ThNhHv-x7QdZl(>(clKU qV(=rXyeU%9`3-7bi&IhlGtosdKL39F10DToQlPkh{tS|X`JGQ?PtBYF delta 95 zcmaE*GhJ=M{mB}PvC;;vmd-l9j*k91&W_F=&N>Fpj*bS-K#so4<^_y58AVH-eSthz v4|knnCr8I(Cm_e%X>%VlAJgOnHdc1eFra{?>*gG`S3Hx0L>ErB71IR(QaBsq diff --git a/course/amd/src/repository.js b/course/amd/src/repository.js index 6340eab31b1..7e530a72543 100644 --- a/course/amd/src/repository.js +++ b/course/amd/src/repository.js @@ -94,8 +94,26 @@ define(['jquery', 'core/ajax'], function($, Ajax) { return Ajax.call([request])[0]; }; + /** + * Get the list of users enrolled in this cmid. + * + * @param {Number} cmid Course Module from which the users will be obtained + * @returns {Promise} Promise containing a list of users + */ + var getEnrolledUsersFromCourseModuleID = function(cmid) { + var request = { + methodname: 'core_course_get_enrolled_users_by_cmid', + args: { + cmid: cmid, + }, + }; + + return Ajax.call([request])[0]; + }; + return { getEnrolledCoursesByTimelineClassification: getEnrolledCoursesByTimelineClassification, - getLastAccessedCourses: getLastAccessedCourses + getLastAccessedCourses: getLastAccessedCourses, + getUsersFromCourseModuleID: getEnrolledUsersFromCourseModuleID, }; }); diff --git a/course/externallib.php b/course/externallib.php index bb2b08a7478..028f105b722 100644 --- a/course/externallib.php +++ b/course/externallib.php @@ -4053,4 +4053,82 @@ class core_course_external extends external_api { public static function get_recent_courses_returns() { return new external_multiple_structure(course_summary_exporter::get_read_structure(), 'Courses'); } + + /** + * Returns description of method parameters + * + * @return external_function_parameters + */ + public static function get_enrolled_users_by_cmid_parameters() { + return new external_function_parameters([ + 'cmid' => new external_value(PARAM_INT, 'id of the course module', VALUE_REQUIRED), + ]); + } + + /** + * Get all users in a course for a given cmid. + * + * @param int $cmid Course Module id from which the users will be obtained + * @return array List of users + * @throws invalid_parameter_exception + */ + public static function get_enrolled_users_by_cmid(int $cmid) { + $warnings = []; + + [ + 'cmid' => $cmid, + ] = self::validate_parameters(self::get_enrolled_users_by_cmid_parameters(), [ + 'cmid' => $cmid, + ]); + + list($course, $cm) = get_course_and_cm_from_cmid($cmid); + $coursecontext = context_course::instance($course->id); + self::validate_context($coursecontext); + + $enrolledusers = get_enrolled_users($coursecontext); + + $users = array_map(function ($user) { + $user->fullname = fullname($user); + return $user; + }, $enrolledusers); + sort($users); + + return [ + 'users' => $users, + 'warnings' => $warnings, + ]; + } + + /** + * Returns description of method result value + * + * @return external_description + */ + public static function get_enrolled_users_by_cmid_returns() { + return new external_single_structure([ + 'users' => new external_multiple_structure(self::user_description()), + 'warnings' => new external_warnings(), + ]); + } + + /** + * Create user return value description. + * + * @return single_structure_description + */ + public static function user_description() { + $userfields = array( + 'id' => new external_value(core_user::get_property_type('id'), 'ID of the user'), + 'fullname' => new external_value(PARAM_TEXT, 'The full name of the user', VALUE_OPTIONAL), + 'firstname' => new external_value( + core_user::get_property_type('firstname'), + 'The first name(s) of the user', + VALUE_OPTIONAL), + 'lastname' => new external_value( + core_user::get_property_type('lastname'), + 'The family name of the user', + VALUE_OPTIONAL), + ); + return new external_single_structure($userfields); + } } diff --git a/course/tests/externallib_test.php b/course/tests/externallib_test.php index ab857e93840..242b02cade1 100644 --- a/course/tests/externallib_test.php +++ b/course/tests/externallib_test.php @@ -2988,4 +2988,55 @@ class core_course_externallib_testcase extends externallib_advanced_testcase { $this->assertCount(1, $result); $this->assertEquals($courses[0]->id, array_shift($result)->id); } + + /** + * Test get enrolled users by cmid function. + */ + public function test_get_enrolled_users_by_cmid() { + $this->resetAfterTest(true); + + $user1 = self::getDataGenerator()->create_user(); + $user2 = self::getDataGenerator()->create_user(); + + // Set the first created user to the test user. + self::setUser($user1); + + // Create course to add the module. + $course1 = self::getDataGenerator()->create_course(); + + // Forum with tracking off. + $record = new stdClass(); + $record->course = $course1->id; + $forum1 = self::getDataGenerator()->create_module('forum', $record); + + // Following lines enrol and assign default role id to the users. + $this->getDataGenerator()->enrol_user($user1->id, $course1->id); + $this->getDataGenerator()->enrol_user($user2->id, $course1->id); + + // Create what we expect to be returned when querying the course module. + $expectedusers = array( + 'users' => array(), + 'warnings' => array(), + ); + + $expectedusers['users'][0] = [ + 'id' => $user1->id, + 'fullname' => fullname($user1), + 'firstname' => $user1->firstname, + 'lastname' => $user1->lastname, + ]; + $expectedusers['users'][1] = [ + 'id' => $user2->id, + 'fullname' => fullname($user2), + 'firstname' => $user2->firstname, + 'lastname' => $user2->lastname, + ]; + + // Test getting the users in a given context. + $users = core_course_external::get_enrolled_users_by_cmid($forum1->cmid); + $users = external_api::clean_returnvalue(core_course_external::get_enrolled_users_by_cmid_returns(), $users); + + $this->assertEquals(2, count($users['users'])); + $this->assertEquals($expectedusers, $users); + } } diff --git a/lib/db/services.php b/lib/db/services.php index 167e4314dbc..147079d167c 100644 --- a/lib/db/services.php +++ b/lib/db/services.php @@ -613,6 +613,14 @@ $functions = array( 'ajax' => true, 'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE), ), + 'core_course_get_enrolled_users_by_cmid' => array( + 'classname' => 'core_course_external', + 'methodname' => 'get_enrolled_users_by_cmid', + 'classpath' => 'course/externallib.php', + 'description' => 'List users bycourse module id.', + 'type' => 'read', + 'ajax' => true, + ), 'core_enrol_get_course_enrolment_methods' => array( 'classname' => 'core_enrol_external', 'methodname' => 'get_course_enrolment_methods', -- 2.43.0