From d16ed5a5e95ca3819d703304828b0747682b09c8 Mon Sep 17 00:00:00 2001 From: Juan Leyva Date: Wed, 29 Mar 2023 16:01:39 +0200 Subject: [PATCH] MDL-77788 mod_assign: Apply format_string to group names in WS --- mod/assign/externallib.php | 21 ++++++++---- mod/assign/tests/externallib_test.php | 49 +++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 6 deletions(-) diff --git a/mod/assign/externallib.php b/mod/assign/externallib.php index 04105c0cb58..533a00076e6 100644 --- a/mod/assign/externallib.php +++ b/mod/assign/externallib.php @@ -2658,6 +2658,7 @@ class mod_assign_external extends \mod_assign\external\external_api { global $DB, $CFG; require_once($CFG->dirroot . "/mod/assign/locallib.php"); require_once($CFG->dirroot . "/user/lib.php"); + require_once($CFG->libdir . '/grouplib.php'); $params = self::validate_parameters(self::list_participants_parameters(), array( @@ -2679,8 +2680,10 @@ class mod_assign_external extends \mod_assign\external\external_api { $assign->require_view_grades(); $participants = array(); + $coursegroups = []; if (groups_group_visible($params['groupid'], $course, $cm)) { $participants = $assign->list_participants_with_filter_status_and_group($params['groupid'], $params['tablesort']); + $coursegroups = groups_get_all_groups($course->id); } $userfields = user_get_default_fields(); @@ -2731,9 +2734,12 @@ class mod_assign_external extends \mod_assign\external\external_api { $userdetails['submissionstatus'] = $record->submissionstatus; if (!empty($record->groupid)) { $userdetails['groupid'] = $record->groupid; - } - if (!empty($record->groupname)) { - $userdetails['groupname'] = $record->groupname; + + if (!empty($coursegroups[$record->groupid])) { + // Format properly the group name. + $group = $coursegroups[$record->groupid]; + $userdetails['groupname'] = \core_external\util::format_string($group->name, $context); + } } // Unique id is required for blind marking. $userdetails['recordid'] = -1; @@ -2848,6 +2854,7 @@ class mod_assign_external extends \mod_assign\external\external_api { global $DB, $CFG; require_once($CFG->dirroot . "/mod/assign/locallib.php"); require_once($CFG->dirroot . "/user/lib.php"); + require_once($CFG->libdir . '/grouplib.php'); $params = self::validate_parameters(self::get_participant_parameters(), array( 'assignid' => $assignid, @@ -2890,9 +2897,11 @@ class mod_assign_external extends \mod_assign\external\external_api { if (!empty($participant->groupid)) { $return['groupid'] = $participant->groupid; - } - if (!empty($participant->groupname)) { - $return['groupname'] = $participant->groupname; + + if ($group = groups_get_group($participant->groupid)) { + // Format properly the group name. + $return['groupname'] = \core_external\util::format_string($group->name, $context); + } } // Skip the expensive lookup of user detail if we're blind marking or the caller diff --git a/mod/assign/tests/externallib_test.php b/mod/assign/tests/externallib_test.php index 7976256a1cc..294a6de583c 100644 --- a/mod/assign/tests/externallib_test.php +++ b/mod/assign/tests/externallib_test.php @@ -2869,6 +2869,55 @@ class externallib_test extends \mod_assign\externallib_advanced_testcase { } } + /** + * Test for WS returning group. + * @covers ::get_participant + * @covers ::list_participants + */ + public function test_participants_info_with_groups() { + global $CFG; + $this->resetAfterTest(true); + $CFG->showuseridentity = 'idnumber,email,phone1,phone2,department,institution'; + + // Set up filtering. + filter_set_global_state('multilang', TEXTFILTER_ON); + filter_set_applies_to_strings('multilang', true); + external_settings::get_instance()->set_filter(true); + + $result = $this->create_assign_with_student_and_teacher([ + 'assignsubmission_onlinetext_enabled' => 1, + 'teamsubmission' => 1 + ]); + $assignmodule = $result['assign']; + $student = $result['student']; + $teacher = $result['teacher']; + $course = $result['course']; + $context = \context_course::instance($course->id); + + $gname = 'G (en)G (es)'; + $group = $this->getDataGenerator()->create_group(['courseid' => $course->id, 'name' => $gname]); + groups_add_member($group, $student); + + $cm = get_coursemodule_from_instance('assign', $assignmodule->id); + new mod_assign_testable_assign($context, $cm, $course); + + // Prepare submission. + $this->setUser($student); + $this->setUser($teacher); + + // Test mod_assign_external::list_participants. + $participants = mod_assign_external::list_participants($assignmodule->id, $group->id, '', 0, 0, false, true, true); + $participants = external_api::clean_returnvalue(mod_assign_external::list_participants_returns(), $participants); + $this->assertEquals($group->id, $participants[0]['groupid']); + $this->assertEquals(format_string($gname, true), $participants[0]['groupname']); + + // Test mod_assign_external::get_participant. + $participant = mod_assign_external::get_participant($assignmodule->id, $student->id, true); + $participant = external_api::clean_returnvalue(mod_assign_external::get_participant_returns(), $participant); + $this->assertEquals($group->id, $participant['groupid']); + $this->assertEquals(format_string($gname, true), $participant['groupname']); + } + /** * Test test_view_assign */