diff --git a/badges/classes/observer.php b/badges/classes/observer.php index 18896465839..6d7b05468ee 100644 --- a/badges/classes/observer.php +++ b/badges/classes/observer.php @@ -69,4 +69,40 @@ class core_badges_observer { } } + /** + * Triggered when 'course_completed' event is triggered. + * + * @param \core\event\course_completed $event + */ + public static function course_criteria_review(\core\event\course_completed $event) { + global $DB, $CFG; + + if (!empty($CFG->enablebadges)) { + require_once($CFG->dirroot.'/lib/badgeslib.php'); + + $eventdata = $event->get_record_snapshot('course_completions', $event->objectid); + $userid = $event->other['relateduserid']; + $courseid = $event->courseid; + + // Need to take into account that course can be a part of course_completion and courseset_completion criteria. + if ($rs = $DB->get_records('badge_criteria_param', array('name' => 'course_' . $courseid, 'value' => $courseid))) { + foreach ($rs as $r) { + $crit = $DB->get_record('badge_criteria', array('id' => $r->critid), 'badgeid, criteriatype', MUST_EXIST); + $badge = new badge($crit->badgeid); + if (!$badge->is_active() || $badge->is_issued($userid)) { + continue; + } + + if ($badge->criteria[$crit->criteriatype]->review($userid)) { + $badge->criteria[$crit->criteriatype]->mark_complete($userid); + + if ($badge->criteria[BADGE_CRITERIA_TYPE_OVERALL]->review($userid)) { + $badge->criteria[BADGE_CRITERIA_TYPE_OVERALL]->mark_complete($userid); + $badge->issue($userid); + } + } + } + } + } + } } diff --git a/completion/completion_completion.php b/completion/completion_completion.php index dab34d8b453..52619b2faaf 100644 --- a/completion/completion_completion.php +++ b/completion/completion_completion.php @@ -143,23 +143,35 @@ class completion_completion extends data_object { * @return void */ public function mark_complete($timecomplete = null) { + global $USER; - // Never change a completion time + // Never change a completion time. if ($this->timecompleted) { return; } - // Use current time if nothing supplied + // Use current time if nothing supplied. if (!$timecomplete) { $timecomplete = time(); } - // Set time complete + // Set time complete. $this->timecompleted = $timecomplete; - // Save record + // Save record. if ($result = $this->_save()) { - events_trigger('course_completed', $this->get_record_data()); + $data = $this->get_record_data(); + $event = \core\event\course_completed::create( + array( + 'objectid' => $data->id, + 'userid' => $USER->id, + 'context' => context_course::instance($data->course), + 'courseid' => $data->course, + 'other' => array('relateduserid' => $data->userid) + ) + ); + $event->add_record_snapshot('course_completions', $data); + $event->trigger(); } return $result; diff --git a/lang/en/completion.php b/lang/en/completion.php index 9494c451c78..5fdeed1b3b0 100644 --- a/lang/en/completion.php +++ b/lang/en/completion.php @@ -123,6 +123,7 @@ $string['err_noroles'] = 'There are no roles with the capability moodle/course:m $string['err_nousers'] = 'There are no students on this course or group for whom completion information is displayed. (By default, completion information is displayed only for students, so if there are no students, you will see this error. Administrators can alter this option via the admin screens.)'; $string['err_settingslocked'] = 'One or more students have already completed a criteria so the settings have been locked. Unlocking the completion criteria settings will delete any existing user data and may cause confusion.'; $string['err_system'] = 'An internal error occurred in the completion system. (System administrators can enable debugging information to see more detail.)'; +$string['eventcoursecompleted'] = 'Course completed'; $string['eventcoursemodulecompletionupdated'] = 'Course module completion updated'; $string['excelcsvdownload'] = 'Download in Excel-compatible format (.csv)'; $string['fraction'] = 'Fraction'; diff --git a/lib/badgeslib.php b/lib/badgeslib.php index 94f158ba5e0..c8e18af2700 100644 --- a/lib/badgeslib.php +++ b/lib/badgeslib.php @@ -931,43 +931,6 @@ function badges_add_course_navigation(navigation_node $coursenode, stdClass $cou } } -/** - * Triggered when 'course_completed' event happens. - * - * @param object $eventdata - * @return boolean - */ -function badges_award_handle_course_criteria_review(stdClass $eventdata) { - global $DB, $CFG; - - if (!empty($CFG->enablebadges)) { - $userid = $eventdata->userid; - $courseid = $eventdata->course; - - // Need to take into account that course can be a part of course_completion and courseset_completion criteria. - if ($rs = $DB->get_records('badge_criteria_param', array('name' => 'course_' . $courseid, 'value' => $courseid))) { - foreach ($rs as $r) { - $crit = $DB->get_record('badge_criteria', array('id' => $r->critid), 'badgeid, criteriatype', MUST_EXIST); - $badge = new badge($crit->badgeid); - if (!$badge->is_active() || $badge->is_issued($userid)) { - continue; - } - - if ($badge->criteria[$crit->criteriatype]->review($userid)) { - $badge->criteria[$crit->criteriatype]->mark_complete($userid); - - if ($badge->criteria[BADGE_CRITERIA_TYPE_OVERALL]->review($userid)) { - $badge->criteria[BADGE_CRITERIA_TYPE_OVERALL]->mark_complete($userid); - $badge->issue($userid); - } - } - } - } - } - - return true; -} - /** * Triggered when 'user_updated' event happens. * diff --git a/lib/classes/event/course_completed.php b/lib/classes/event/course_completed.php new file mode 100644 index 00000000000..e57ddae9245 --- /dev/null +++ b/lib/classes/event/course_completed.php @@ -0,0 +1,83 @@ +. + +namespace core\event; + +/** + * Event when course completed. + * + * @package core_event + * @copyright 2013 Rajesh Taneja + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class course_completed extends base { + + /** + * Initialise required event data properties. + */ + protected function init() { + $this->data['objecttable'] = 'course_completions'; + $this->data['crud'] = 'u'; + // TODO: MDL-37658 set level. + $this->data['level'] = 50; + } + + /** + * Returns localised event name. + * + * @return string + */ + public static function get_name() { + return new get_string('eventcoursecompleted', 'core_completion'); + } + + /** + * Returns non-localised event description with id's for admin use only. + * + * @return string + */ + public function get_description() { + return 'Course completed by user '.$this->userid; + } + + /** + * Returns relevant URL. + * + * @return \moodle_url + */ + public function get_url() { + return new moodle_url('/report/completion/index.php', array('course' => $this->courseid)); + } + + /** + * Return name of the legacy event, which is replaced by this event. + * + * @return string legacy event name + */ + public static function get_legacy_eventname() { + return 'course_completed'; + } + + /** + * Return course_completed legacy event data. + * + * @return \stdClass completion data. + */ + protected function get_legacy_eventdata() { + return $this->get_record_snapshot('course_completions', $this->objectid); + } + +} diff --git a/lib/db/events.php b/lib/db/events.php index 053db6c382f..b3ba54ac8ed 100644 --- a/lib/db/events.php +++ b/lib/db/events.php @@ -37,12 +37,6 @@ defined('MOODLE_INTERNAL') || die(); $handlers = array( - 'course_completed' => array ( - 'handlerfile' => '/lib/badgeslib.php', - 'handlerfunction' => 'badges_award_handle_course_criteria_review', - 'schedule' => 'instant', - 'internal' => 1, - ), 'user_updated' => array ( 'handlerfile' => '/lib/badgeslib.php', 'handlerfunction' => 'badges_award_handle_profile_criteria_review', @@ -72,7 +66,12 @@ $observers = array( array( 'eventname' => '\core\event\course_module_completion_updated', 'callback' => 'core_badges_observer::course_module_criteria_review', + ), + array( + 'eventname' => '\core\event\course_completed', + 'callback' => 'core_badges_observer::course_criteria_review', ) + );