From c776e1dd402b9e5a58efa359aef0b8c491cbe21d Mon Sep 17 00:00:00 2001 From: dpalou Date: Wed, 7 Nov 2018 16:45:28 +0100 Subject: [PATCH] MDL-63729 badges: Create an exporter for badge info --- badges/classes/external.php | 50 +--- .../classes/external/user_badge_exporter.php | 230 ++++++++++++++++++ 2 files changed, 242 insertions(+), 38 deletions(-) create mode 100644 badges/classes/external/user_badge_exporter.php diff --git a/badges/classes/external.php b/badges/classes/external.php index e5b2de0a2b9..c7a02934125 100644 --- a/badges/classes/external.php +++ b/badges/classes/external.php @@ -29,6 +29,8 @@ defined('MOODLE_INTERNAL') || die; require_once($CFG->libdir . '/externallib.php'); require_once($CFG->libdir . '/badgeslib.php'); +use core_badges\external\user_badge_exporter; + /** * Badges external functions * @@ -73,7 +75,7 @@ class core_badges_external extends external_api { * @throws moodle_exception */ public static function get_user_badges($userid = 0, $courseid = 0, $page = 0, $perpage = 0, $search = '', $onlypublic = false) { - global $CFG, $USER; + global $CFG, $USER, $PAGE; $warnings = array(); @@ -122,17 +124,13 @@ class core_badges_external extends external_api { foreach ($userbadges as $badge) { $context = ($badge->type == BADGE_TYPE_SITE) ? context_system::instance() : context_course::instance($badge->courseid); - $badge->badgeurl = moodle_url::make_webservice_pluginfile_url($context->id, 'badges', 'badgeimage', $badge->id, '/', - 'f1')->out(false); - // Return all the information if we are requesting our own badges. - // Or, if we have permissions for configuring badges in the badge context. - if ($USER->id == $user->id or has_capability('moodle/badges:configuredetails', $context)) { - $result['badges'][] = (array) $badge; - } else { - $result['badges'][] = array( + + // If the user is viewing another user's badge and doesn't have the right capability return only part of the data. + if ($USER->id != $user->id and !has_capability('moodle/badges:configuredetails', $context)) { + $badge = (object) array( + 'id' => $badge->id, 'name' => $badge->name, 'description' => $badge->description, - 'badgeurl' => $badge->badgeurl, 'issuername' => $badge->issuername, 'issuerurl' => $badge->issuerurl, 'issuercontact' => $badge->issuercontact, @@ -141,6 +139,9 @@ class core_badges_external extends external_api { 'dateexpire' => $badge->dateexpire, ); } + + $exporter = new user_badge_exporter($badge, array('context' => $context)); + $result['badges'][] = $exporter->export($PAGE->get_renderer('core')); } return $result; @@ -156,34 +157,7 @@ class core_badges_external extends external_api { return new external_single_structure( array( 'badges' => new external_multiple_structure( - new external_single_structure( - array( - 'id' => new external_value(PARAM_INT, 'Badge id.', VALUE_OPTIONAL), - 'name' => new external_value(PARAM_TEXT, 'Badge name.'), - 'description' => new external_value(PARAM_NOTAGS, 'Badge description.'), - 'badgeurl' => new external_value(PARAM_URL, 'Badge URL.'), - 'timecreated' => new external_value(PARAM_INT, 'Time created.', VALUE_OPTIONAL), - 'timemodified' => new external_value(PARAM_INT, 'Time modified.', VALUE_OPTIONAL), - 'usercreated' => new external_value(PARAM_INT, 'User created.', VALUE_OPTIONAL), - 'usermodified' => new external_value(PARAM_INT, 'User modified.', VALUE_OPTIONAL), - 'issuername' => new external_value(PARAM_NOTAGS, 'Issuer name.'), - 'issuerurl' => new external_value(PARAM_URL, 'Issuer URL.'), - 'issuercontact' => new external_value(PARAM_RAW, 'Issuer contact.'), - 'expiredate' => new external_value(PARAM_INT, 'Expire date.', VALUE_OPTIONAL), - 'expireperiod' => new external_value(PARAM_INT, 'Expire period.', VALUE_OPTIONAL), - 'type' => new external_value(PARAM_INT, 'Type.', VALUE_OPTIONAL), - 'courseid' => new external_value(PARAM_INT, 'Course id.', VALUE_OPTIONAL), - 'message' => new external_value(PARAM_RAW, 'Message.', VALUE_OPTIONAL), - 'messagesubject' => new external_value(PARAM_TEXT, 'Message subject.', VALUE_OPTIONAL), - 'attachment' => new external_value(PARAM_INT, 'Attachment.', VALUE_OPTIONAL), - 'status' => new external_value(PARAM_INT, 'Status.', VALUE_OPTIONAL), - 'issuedid' => new external_value(PARAM_INT, 'Issued id.', VALUE_OPTIONAL), - 'uniquehash' => new external_value(PARAM_ALPHANUM, 'Unique hash.'), - 'dateissued' => new external_value(PARAM_INT, 'Date issued.'), - 'dateexpire' => new external_value(PARAM_INT, 'Date expire.'), - 'visible' => new external_value(PARAM_INT, 'Visible.', VALUE_OPTIONAL), - ) - ) + user_badge_exporter::get_read_structure() ), 'warnings' => new external_warnings(), ) diff --git a/badges/classes/external/user_badge_exporter.php b/badges/classes/external/user_badge_exporter.php new file mode 100644 index 00000000000..f9832c1b121 --- /dev/null +++ b/badges/classes/external/user_badge_exporter.php @@ -0,0 +1,230 @@ +. + +/** + * Contains user badge class for displaying a badge issued to a user. + * + * @package core_badges + * @copyright 2018 Dani Palou + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core_badges\external; + +defined('MOODLE_INTERNAL') || die(); + +use core\external\exporter; +use renderer_base; +use moodle_url; + +/** + * Class for displaying a badge issued to a user. + * + * @package core_badges + * @copyright 2018 Dani Palou + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class user_badge_exporter extends exporter { + + /** + * Return the list of properties. + * + * @return array + */ + protected static function define_properties() { + return [ + 'id' => [ + 'type' => PARAM_INT, + 'description' => 'Badge id', + 'optional' => true, + ], + 'name' => [ + 'type' => PARAM_TEXT, + 'description' => 'Badge name', + ], + 'description' => [ + 'type' => PARAM_NOTAGS, + 'description' => 'Badge description', + 'null' => NULL_ALLOWED, + ], + 'timecreated' => [ + 'type' => PARAM_INT, + 'description' => 'Time created', + 'optional' => true, + 'default' => 0, + ], + 'timemodified' => [ + 'type' => PARAM_INT, + 'description' => 'Time modified', + 'optional' => true, + 'default' => 0, + ], + 'usercreated' => [ + 'type' => PARAM_INT, + 'description' => 'User created', + 'optional' => true, + ], + 'usermodified' => [ + 'type' => PARAM_INT, + 'description' => 'User modified', + 'optional' => true, + ], + 'issuername' => [ + 'type' => PARAM_NOTAGS, + 'description' => 'Issuer name', + ], + 'issuerurl' => [ + 'type' => PARAM_URL, + 'description' => 'Issuer URL', + ], + 'issuercontact' => [ + 'type' => PARAM_RAW, + 'description' => 'Issuer contact', + 'null' => NULL_ALLOWED, + ], + 'expiredate' => [ + 'type' => PARAM_INT, + 'description' => 'Expire date', + 'optional' => true, + 'null' => NULL_ALLOWED, + ], + 'expireperiod' => [ + 'type' => PARAM_INT, + 'description' => 'Expire period', + 'optional' => true, + 'null' => NULL_ALLOWED, + ], + 'type' => [ + 'type' => PARAM_INT, + 'description' => 'Type', + 'optional' => true, + 'default' => 1, + ], + 'courseid' => [ + 'type' => PARAM_INT, + 'description' => 'Course id', + 'optional' => true, + 'null' => NULL_ALLOWED, + ], + 'message' => [ + 'type' => PARAM_RAW, + 'description' => 'Message', + 'optional' => true, + ], + 'messagesubject' => [ + 'type' => PARAM_TEXT, + 'description' => 'Message subject', + 'optional' => true, + ], + 'attachment' => [ + 'type' => PARAM_INT, + 'description' => 'Attachment', + 'optional' => true, + 'default' => 1, + ], + 'notification' => [ + 'type' => PARAM_INT, + 'description' => 'Whether to notify when badge is awarded', + 'optional' => true, + 'default' => 1, + ], + 'nextcron' => [ + 'type' => PARAM_INT, + 'description' => 'Next cron', + 'optional' => true, + 'null' => NULL_ALLOWED, + ], + 'status' => [ + 'type' => PARAM_INT, + 'description' => 'Status', + 'optional' => true, + 'default' => 0, + ], + 'issuedid' => [ + 'type' => PARAM_INT, + 'description' => 'Issued id', + 'optional' => true, + ], + 'uniquehash' => [ + 'type' => PARAM_ALPHANUM, + 'description' => 'Unique hash', + ], + 'dateissued' => [ + 'type' => PARAM_INT, + 'description' => 'Date issued', + 'default' => 0, + ], + 'dateexpire' => [ + 'type' => PARAM_INT, + 'description' => 'Date expire', + 'null' => NULL_ALLOWED, + ], + 'visible' => [ + 'type' => PARAM_INT, + 'description' => 'Visible', + 'optional' => true, + 'default' => 0, + ], + 'email' => [ + 'type' => PARAM_TEXT, + 'description' => 'User email', + 'optional' => true, + ], + ]; + } + + /** + * Returns a list of objects that are related. + * + * @return array + */ + protected static function define_related() { + return array( + 'context' => 'context' + ); + } + + /** + * Return the list of additional properties. + * + * @return array + */ + protected static function define_other_properties() { + return [ + 'badgeurl' => [ + 'type' => PARAM_URL, + 'description' => 'Badge URL', + ], + ]; + } + + /** + * Get the additional values to inject while exporting. + * + * @param renderer_base $output The renderer. + * @return array Keys are the property names, values are their values. + */ + protected function get_other_values(renderer_base $output) { + $context = $this->related['context']; + + $values = array( + 'badgeurl' => moodle_url::make_webservice_pluginfile_url($context->id, 'badges', 'badgeimage', $this->data->id, '/', + 'f1')->out(false), + ); + + return $values; + } +}