diff --git a/.upgradenotes/MDL-82742-2024080913015227.yml b/.upgradenotes/MDL-82742-2024080913015227.yml new file mode 100644 index 00000000000..61ee3c47652 --- /dev/null +++ b/.upgradenotes/MDL-82742-2024080913015227.yml @@ -0,0 +1,9 @@ +issueNumber: MDL-82742 +notes: + core_badges: + - message: >- + Added fields `recipientid` and `recipientfullname` to + `user_badge_exporter`, which is used in the return structure of + external functions `core_badges_get_user_badge_by_hash` and + `core_badges_get_user_badges`. + type: changed diff --git a/badges/classes/external/user_badge_exporter.php b/badges/classes/external/user_badge_exporter.php index 4d8b44241e6..1c7ad234a5f 100644 --- a/badges/classes/external/user_badge_exporter.php +++ b/badges/classes/external/user_badge_exporter.php @@ -181,6 +181,14 @@ class user_badge_exporter extends exporter { 'optional' => true, 'default' => 0, ], + 'recipientid' => [ + 'type' => PARAM_INT, + 'description' => 'Id of the awarded user', + ], + 'recipientfullname' => [ + 'type' => PARAM_NOTAGS, + 'description' => 'Full name of the awarded user', + ], 'email' => [ 'type' => PARAM_TEXT, 'description' => 'User email', diff --git a/badges/tests/external/external_test.php b/badges/tests/external/external_test.php index e8e08654582..9e5f7598387 100644 --- a/badges/tests/external/external_test.php +++ b/badges/tests/external/external_test.php @@ -209,6 +209,10 @@ class external_test extends externallib_advanced_testcase { } } + // Add recipient. + $badge->recipientid = $this->student->id; + $badge->recipientfullname = fullname($this->student); + $expectedbadges[] = (array) $badge; if (isset($badge->courseid)) { // Save the course badge to be able to compare it in our tests. diff --git a/badges/tests/external/get_user_badge_by_hash_test.php b/badges/tests/external/get_user_badge_by_hash_test.php index 0d1eea0b1c2..2348f70bb96 100644 --- a/badges/tests/external/get_user_badge_by_hash_test.php +++ b/badges/tests/external/get_user_badge_by_hash_test.php @@ -102,6 +102,10 @@ class get_user_badge_by_hash_test extends externallib_advanced_testcase { 'f3')->out(false); $badge->status = BADGE_STATUS_ACTIVE_LOCKED; + // Add recipient. + $badge->recipientid = $student1->id; + $badge->recipientfullname = fullname($student1); + // Add an endorsement for the badge. $endorsement = new \stdClass(); $endorsement->badgeid = $badgeid; @@ -184,13 +188,13 @@ class get_user_badge_by_hash_test extends externallib_advanced_testcase { // Site badge. $result = get_user_badge_by_hash::execute($data['sitebadge'][0]['uniquehash']); $result = \core_external\external_api::clean_returnvalue(get_user_badge_by_hash::execute_returns(), $result); - $this->assertEquals($data['sitebadge'][0]['uniquehash'], $result['badge'][0]['uniquehash']); + $this->assertEquals($data['sitebadge'][0], $result['badge'][0]); $this->assertEmpty($result['warnings']); // Course badge. $result = get_user_badge_by_hash::execute($data['coursebadge'][0]['uniquehash']); $result = \core_external\external_api::clean_returnvalue(get_user_badge_by_hash::execute_returns(), $result); - $this->assertEquals($data['coursebadge'][0]['uniquehash'], $result['badge'][0]['uniquehash']); + $this->assertEquals($data['coursebadge'][0], $result['badge'][0]); $this->assertEmpty($result['warnings']); // Wrong hash. diff --git a/lib/badgeslib.php b/lib/badgeslib.php index 9067254faa7..1802ed78b18 100644 --- a/lib/badgeslib.php +++ b/lib/badgeslib.php @@ -421,7 +421,7 @@ function badges_get_badge_by_hash(string $hash): object|bool { * @return object */ function badges_prepare_badge_for_external(stdClass $badge, stdClass $user): object { - global $PAGE, $USER; + global $PAGE, $SITE, $USER; if ($badge->type == BADGE_TYPE_SITE) { $context = context_system::instance(); } else { @@ -450,6 +450,17 @@ function badges_prepare_badge_for_external(stdClass $badge, stdClass $user): obj ]; } + // Recipient (the badge was awarded to this person). + $badge->recipientid = $user->id; + if ($user->deleted) { + $strdata = new stdClass(); + $strdata->user = fullname($user); + $strdata->site = format_string($SITE->fullname, true, ['context' => context_system::instance()]); + $badge->recipientfullname = get_string('error:userdeleted', 'badges', $strdata); + } else { + $badge->recipientfullname = fullname($user); + } + // Create a badge instance to be able to get the endorsement and other info. $badgeinstance = new badge($badge->id); $endorsement = $badgeinstance->get_endorsement();