diff --git a/badges/tests/events_test.php b/badges/tests/events_test.php new file mode 100644 index 0000000000000..833cf0974886a --- /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 diff --git a/lang/en/badges.php b/lang/en/badges.php index 21cf94e6a6a81..ce03b75dbd9bd 100644 --- a/lang/en/badges.php +++ b/lang/en/badges.php @@ -246,6 +246,7 @@ $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 80b57cee9a7d0..39f48d7153128 100644 --- a/lib/badgeslib.php +++ b/lib/badgeslib.php @@ -398,6 +398,15 @@ public function issue($userid, $nobake = false) { $result = $DB->insert_record('badge_issued', $issued, true); if ($result) { + // Trigger badge awarded event. + $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) { $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 0000000000000..b1a3f0c78674e --- /dev/null +++ b/lib/classes/event/badge_awarded.php @@ -0,0 +1,97 @@ +. + +/** + * Badge awarded event. + * + * @property-read array $other { + * Extra information about event. + * + * - int expiredate: Badge expire timestamp. + * - int badgeissuedid: Badge issued ID. + * } + * + * @package core + * @copyright 2015 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.9 + * @copyright 2015 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'; + $this->data['crud'] = 'c'; + $this->data['edulevel'] = self::LEVEL_TEACHING; + } + + /** + * 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 the id '$this->relateduserid' has been awarded the badge with id '".$this->objectid."'."; + } + + /** + * Returns relevant URL. + * @return \moodle_url + */ + public function get_url() { + 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.'); + } + } +}