From 483cfd763d4fd569d153f0ec7399dcbe7b7c7ca9 Mon Sep 17 00:00:00 2001 From: James Ballard Date: Fri, 7 Nov 2014 13:58:58 +1100 Subject: [PATCH 1/3] MDL-48142 core_badge: add badge awarded event --- lang/en/badges.php | 1 + lib/badgeslib.php | 6 +++ lib/classes/event/badge_awarded.php | 72 +++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 lib/classes/event/badge_awarded.php diff --git a/lang/en/badges.php b/lang/en/badges.php index 21cf94e6a6a..ce03b75dbd9 100644 --- a/lang/en/badges.php +++ b/lang/en/badges.php @@ -246,6 +246,7 @@ $string['error:requesttimeout'] = 'The connection request timed out before it co $string['error:requesterror'] = 'The connection request failed (error code {$a}).'; $string['error:save'] = 'Cannot save the badge.'; $string['error:userdeleted'] = '{$a->user} (This user no longer exists in {$a->site})'; +$string['eventbadgeawarded'] = 'Badge awarded'; $string['evidence'] = 'Evidence'; $string['existingrecipients'] = 'Existing badge recipients'; $string['expired'] = 'Expired'; diff --git a/lib/badgeslib.php b/lib/badgeslib.php index 80b57cee9a7..9e348be14e4 100644 --- a/lib/badgeslib.php +++ b/lib/badgeslib.php @@ -398,6 +398,12 @@ class badge { $result = $DB->insert_record('badge_issued', $issued, true); if ($result) { + // Trigger badge awarded event. + $context = context_system::instance(); + $event = \core\event\badge_awarded::create(array('context' => $context, 'objectid' => $result, + 'courseid' => $this->courseid ? $this->courseid : 0, 'relateduserid' => $userid)); + $event->trigger(); + // Lock the badge, so that its criteria could not be changed any more. if ($this->status == BADGE_STATUS_ACTIVE) { $this->set_status(BADGE_STATUS_ACTIVE_LOCKED); diff --git a/lib/classes/event/badge_awarded.php b/lib/classes/event/badge_awarded.php new file mode 100644 index 00000000000..271d6f10bc6 --- /dev/null +++ b/lib/classes/event/badge_awarded.php @@ -0,0 +1,72 @@ +. + +/** + * Badge awarded event. + * + * @package core + * @copyright 2014 James Ballard + * @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 awarded to a user. + * + * @package core + * @since Moodle 2.7 + * @copyright 2014 James Ballard + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class badge_awarded extends base { + + /** + * Set basic properties for the event. + */ + protected function init() { + $this->data['objecttable'] = 'badge_issued'; + $this->data['crud'] = 'c'; + $this->data['edulevel'] = self::LEVEL_PARTICIPATING; + } + + /** + * Returns localised general event name. + * + * @return string + */ + public static function get_name() { + return get_string('eventbadgeawarded', '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' was awarded the badge with id '$this->objectid'."; + } + + /** + * Returns relevant URL. + * @return \moodle_url + */ + public function get_url() { + return null; + } +} From 4ae5ecbeef3ffe04e5ed4abae086adc376380c3b Mon Sep 17 00:00:00 2001 From: Simey Lameze Date: Thu, 19 Feb 2015 12:32:36 +0800 Subject: [PATCH 2/3] MDL-48142 core_badge: bug fixes on badge awarded event class --- lib/badgeslib.php | 11 +++++--- lib/classes/event/badge_awarded.php | 39 +++++++++++++++++++++++------ 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/lib/badgeslib.php b/lib/badgeslib.php index 9e348be14e4..39f48d71531 100644 --- a/lib/badgeslib.php +++ b/lib/badgeslib.php @@ -399,10 +399,13 @@ class badge { if ($result) { // Trigger badge awarded event. - $context = context_system::instance(); - $event = \core\event\badge_awarded::create(array('context' => $context, 'objectid' => $result, - 'courseid' => $this->courseid ? $this->courseid : 0, 'relateduserid' => $userid)); - $event->trigger(); + $eventdata = array ( + 'context' => $this->get_context(), + 'objectid' => $this->id, + 'relateduserid' => $userid, + 'other' => array('expiredate' => $issued->dateexpire, 'badgeissuedid' => $result) + ); + \core\event\badge_awarded::create($eventdata)->trigger(); // Lock the badge, so that its criteria could not be changed any more. if ($this->status == BADGE_STATUS_ACTIVE) { diff --git a/lib/classes/event/badge_awarded.php b/lib/classes/event/badge_awarded.php index 271d6f10bc6..b1a3f0c7867 100644 --- a/lib/classes/event/badge_awarded.php +++ b/lib/classes/event/badge_awarded.php @@ -17,8 +17,15 @@ /** * Badge awarded event. * + * @property-read array $other { + * Extra information about event. + * + * - int expiredate: Badge expire timestamp. + * - int badgeissuedid: Badge issued ID. + * } + * * @package core - * @copyright 2014 James Ballard + * @copyright 2015 James Ballard * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ @@ -29,8 +36,8 @@ defined('MOODLE_INTERNAL') || die(); * Event triggered after a badge is awarded to a user. * * @package core - * @since Moodle 2.7 - * @copyright 2014 James Ballard + * @since Moodle 2.9 + * @copyright 2015 James Ballard * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class badge_awarded extends base { @@ -39,9 +46,9 @@ class badge_awarded extends base { * Set basic properties for the event. */ protected function init() { - $this->data['objecttable'] = 'badge_issued'; + $this->data['objecttable'] = 'badge'; $this->data['crud'] = 'c'; - $this->data['edulevel'] = self::LEVEL_PARTICIPATING; + $this->data['edulevel'] = self::LEVEL_TEACHING; } /** @@ -59,7 +66,7 @@ class badge_awarded extends base { * @return string */ public function get_description() { - return "The user with id '$this->userid' was awarded the badge with id '$this->objectid'."; + return "The user with the id '$this->relateduserid' has been awarded the badge with id '".$this->objectid."'."; } /** @@ -67,6 +74,24 @@ class badge_awarded extends base { * @return \moodle_url */ public function get_url() { - return null; + return new \moodle_url('/badges/overview.php', array('id' => $this->objectid)); + } + + /** + * Custom validations. + * + * @throws \coding_exception + * @return void + */ + protected function validate_data() { + parent::validate_data(); + + if (!isset($this->relateduserid)) { + throw new \coding_exception('The \'relateduserid\' must be set.'); + } + + if (!isset($this->objectid)) { + throw new \coding_exception('The \'objectid\' must be set.'); + } } } From cf34b25d59e32df8f85da8e3a347fe89f1429a1c Mon Sep 17 00:00:00 2001 From: Simey Lameze Date: Thu, 19 Feb 2015 12:34:13 +0800 Subject: [PATCH 3/3] MDL-48142 core_badge: unit tests for badge awarded event --- badges/tests/events_test.php | 58 ++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 badges/tests/events_test.php diff --git a/badges/tests/events_test.php b/badges/tests/events_test.php new file mode 100644 index 00000000000..833cf097488 --- /dev/null +++ b/badges/tests/events_test.php @@ -0,0 +1,58 @@ +. +/** + * Badge events tests. + * + * @package core_badges + * @copyright 2015 onwards Simey Lameze + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +defined('MOODLE_INTERNAL') || die(); +global $CFG; +require_once($CFG->dirroot . '/badges/tests/badgeslib_test.php'); + +/** + * Badge events tests class. + * + * @package core_badges + * @copyright 2015 onwards Simey Lameze + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class core_badges_events_testcase extends core_badges_badgeslib_testcase { + + /** + * Test badge awarded event. + */ + public function test_badge_awarded() { + + $systemcontext = context_system::instance(); + + $sink = $this->redirectEvents(); + + $badge = new badge($this->badgeid); + $badge->issue($this->user->id, true); + $badge->is_issued($this->user->id); + $events = $sink->get_events(); + $this->assertCount(1, $events); + $event = reset($events); + $this->assertInstanceOf('\core\event\badge_awarded', $event); + $this->assertEquals($this->badgeid, $event->objectid); + $this->assertEquals($this->user->id, $event->relateduserid); + $this->assertEquals($systemcontext, $event->get_context()); + + $sink->close(); + } +} \ No newline at end of file