diff --git a/badges/badge.php b/badges/badge.php index 4d38580526a7e..662dc25744ed2 100644 --- a/badges/badge.php +++ b/badges/badge.php @@ -71,4 +71,16 @@ echo $output->render($badge); +// Trigger event, badge viewed. +$other = array('badgeid' => $badge->badgeid, 'badgehash' => $id); +$eventparams = array('context' => $PAGE->context, 'other' => $other); + +// If the badge does not belong to this user, log it appropriately. +if (($badge->recipient->id != $USER->id)) { + $eventparams['relateduserid'] = $badge->recipient->id; +} + +$event = \core\event\badge_viewed::create($eventparams); +$event->trigger(); + echo $OUTPUT->footer(); diff --git a/badges/tests/events_test.php b/badges/tests/events_test.php index cfe5215b98da1..e6c464fb67b05 100644 --- a/badges/tests/events_test.php +++ b/badges/tests/events_test.php @@ -310,4 +310,66 @@ public function test_badge_criteria_deleted() { $sink->close(); } + + /** + * Test the badge viewed event. + * + * There is no external API for viewing a badge, so the unit test will simply + * create and trigger the event and ensure data is returned as expected. + */ + public function test_badge_viewed() { + + $badge = new badge($this->badgeid); + // Trigger an event: badge viewed. + $other = array('badgeid' => $badge->id, 'badgehash' => '12345678'); + $eventparams = array( + 'context' => $badge->get_context(), + 'other' => $other, + ); + + $event = \core\event\badge_viewed::create($eventparams); + // Trigger and capture the event. + $sink = $this->redirectEvents(); + $event->trigger(); + $events = $sink->get_events(); + $event = reset($events); + + // Check that the event data is valid. + $this->assertInstanceOf('\core\event\badge_viewed', $event); + $this->assertEquals('12345678', $event->other['badgehash']); + $this->assertEquals($badge->id, $event->other['badgeid']); + $this->assertDebuggingNotCalled(); + $sink->close(); + + } + + /** + * Test the badge listing viewed event. + * + * There is no external API for viewing a badge, so the unit test will simply + * create and trigger the event and ensure data is returned as expected. + */ + public function test_badge_listing_viewed() { + + // Trigger an event: badge listing viewed. + $context = context_system::instance(); + $eventparams = array( + 'context' => $context, + 'other' => array('badgetype' => BADGE_TYPE_SITE) + ); + + $event = \core\event\badge_listing_viewed::create($eventparams); + // Trigger and capture the event. + $sink = $this->redirectEvents(); + $event->trigger(); + $events = $sink->get_events(); + $event = reset($events); + + // Check that the event data is valid. + $this->assertInstanceOf('\core\event\badge_listing_viewed', $event); + $this->assertEquals(BADGE_TYPE_SITE, $event->other['badgetype']); + $this->assertDebuggingNotCalled(); + $sink->close(); + + } } diff --git a/badges/view.php b/badges/view.php index efa53c8155464..5516bfdc575ce 100644 --- a/badges/view.php +++ b/badges/view.php @@ -66,6 +66,7 @@ $PAGE->set_pagelayout('admin'); $PAGE->set_heading($SITE->fullname); $title = get_string('sitebadges', 'badges'); + $eventotherparams = array('badgetype' => BADGE_TYPE_SITE); } else { require_login($course); $coursename = format_string($course->fullname, true, array('context' => context_course::instance($course->id))); @@ -73,6 +74,7 @@ $PAGE->set_context(context_course::instance($course->id)); $PAGE->set_pagelayout('incourse'); $PAGE->set_heading($coursename); + $eventotherparams = array('badgetype' => BADGE_TYPE_COURSE, 'courseid' => $course->id); } require_capability('moodle/badges:viewbadges', $PAGE->context); @@ -104,5 +106,9 @@ } else { echo $output->notification(get_string('nobadges', 'badges')); } +// Trigger event, badge listing viewed. +$eventparams = array('context' => $PAGE->context, 'other' => $eventotherparams); +$event = \core\event\badge_listing_viewed::create($eventparams); +$event->trigger(); echo $output->footer(); diff --git a/lang/en/badges.php b/lang/en/badges.php index aaf102ba5e8ff..5d47fe9c822dd 100644 --- a/lang/en/badges.php +++ b/lang/en/badges.php @@ -258,7 +258,9 @@ $string['eventbadgedisabled'] = 'Badge disabled'; $string['eventbadgeduplicated'] = 'Badge duplicated'; $string['eventbadgeenabled'] = 'Badge enabled'; +$string['eventbadgelistingviewed'] = 'Badge listing viewed'; $string['eventbadgeupdated'] = 'Badge updated'; +$string['eventbadgeviewed'] = 'Badge viewed'; $string['evidence'] = 'Evidence'; $string['existingrecipients'] = 'Existing badge recipients'; $string['expired'] = 'Expired'; diff --git a/lib/classes/event/badge_listing_viewed.php b/lib/classes/event/badge_listing_viewed.php new file mode 100644 index 0000000000000..7ae6ae2f9a29d --- /dev/null +++ b/lib/classes/event/badge_listing_viewed.php @@ -0,0 +1,119 @@ +. + +/** + * Badge listing viewed event. + * + * @package core + * @copyright 2016 Stephen Bourget + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core\event; +defined('MOODLE_INTERNAL') || die(); + +/** + * Event triggered after a badge is viewed. + * + * @property-read array $other { + * Extra information about the event. + * + * - int badgetype: the type of badge (BADGE_TYPE_SITE or BADGE_TYPE_COURSE). + * - int courseid: The ID of the course (Not required for BADGE_TYPE_SITE). + * } + * + * @package core + * @since Moodle 3.2 + * @copyright 2016 Stephen Bourget + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class badge_listing_viewed extends base { + + /** + * Set basic properties for the event. + */ + protected function init() { + $this->data['crud'] = 'r'; + $this->data['edulevel'] = self::LEVEL_PARTICIPATING; + } + + /** + * Returns localised general event name. + * + * @return string + */ + public static function get_name() { + return get_string('eventbadgelistingviewed', 'badges'); + } + + /** + * Returns non-localised event description with id's for admin use only. + * + * @return string + */ + public function get_description() { + if ($this->other['badgetype'] == BADGE_TYPE_SITE) { + $return = "The user with id '$this->userid' has viewed the list of available badges for this site."; + } else { + $return = "The user with id '$this->userid' has viewed the list of available badges". + " for the course with the id '".$this->other['courseid']."'."; + } + return $return; + } + + /** + * Returns relevant URL. + * @return \moodle_url + */ + public function get_url() { + if ($this->other['badgetype'] == BADGE_TYPE_SITE) { + $params = array('type' => $this->other['badgetype']); + } else { + $params = array('id' => $this->other['courseid'], 'type' => $this->other['badgetype']); + } + return new \moodle_url('/badges/view.php', $params ); + } + + /** + * Custom validations. + * + * @throws \coding_exception + * @return void + */ + protected function validate_data() { + parent::validate_data(); + + if (!isset($this->other['badgetype'])) { + throw new \coding_exception('The \'badgetype\' must be set in other.'); + } + if ($this->other['badgetype'] == BADGE_TYPE_COURSE) { + if (!isset($this->other['courseid'])) { + throw new \coding_exception('The \'courseid\' must be set in other.'); + } + } + } + + /** + * Used for maping events on restore + * + * @return bool + */ + public static function get_other_mapping() { + $othermapped = array(); + $othermapped['courseid'] = array('db' => 'course', 'restore' => 'course'); + return $othermapped; + } +} diff --git a/lib/classes/event/badge_viewed.php b/lib/classes/event/badge_viewed.php new file mode 100644 index 0000000000000..1f1e15a3bdf59 --- /dev/null +++ b/lib/classes/event/badge_viewed.php @@ -0,0 +1,106 @@ +. + +/** + * Badge viewed event. + * + * @package core + * @copyright 2016 Stephen Bourget + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core\event; +defined('MOODLE_INTERNAL') || die(); + +/** + * Event triggered after a badge is viewed. + * + * @property-read array $other { + * Extra information about the event. + * + * - int badgeid: the ID of the badge. + * - int badgehash: The UID of the awarded badge. + * } + * + * @package core + * @since Moodle 3.2 + * @copyright 2016 Stephen Bourget + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class badge_viewed extends base { + + /** + * Set basic properties for the event. + */ + protected function init() { + $this->data['crud'] = 'r'; + $this->data['edulevel'] = self::LEVEL_PARTICIPATING; + } + + /** + * Returns localised general event name. + * + * @return string + */ + public static function get_name() { + return get_string('eventbadgeviewed', 'badges'); + } + + /** + * Returns non-localised event description with id's for admin use only. + * + * @return string + */ + public function get_description() { + return "The user with id '$this->userid' has viewed the badge with the id '".$this->other['badgeid']."'."; + } + + /** + * Returns relevant URL. + * @return \moodle_url + */ + public function get_url() { + return new \moodle_url('/badges/badge.php', array('hash' => $this->other['badgehash'])); + } + + /** + * Custom validations. + * + * @throws \coding_exception + * @return void + */ + protected function validate_data() { + parent::validate_data(); + + if (!isset($this->other['badgeid'])) { + throw new \coding_exception('The \'badgeid\' must be set in other.'); + } + if (!isset($this->other['badgehash'])) { + throw new \coding_exception('The \'badgehash\' must be set in other.'); + } + } + + /** + * Used for maping events on restore + * + * @return bool + */ + public static function get_other_mapping() { + $othermapped = array(); + $othermapped['badgeid'] = array('db' => 'badge', 'restore' => 'badge'); + return $othermapped; + } +} diff --git a/version.php b/version.php index 90b40022f71dd..19655fbe6e0d7 100644 --- a/version.php +++ b/version.php @@ -29,7 +29,7 @@ defined('MOODLE_INTERNAL') || die(); -$version = 2016081100.00; // YYYYMMDD = weekly release date of this DEV branch. +$version = 2016081100.01; // YYYYMMDD = weekly release date of this DEV branch. // RR = release increments - 00 in DEV branches. // .XX = incremental changes.