From d76a0eec399c91fa81cff64ace3857aac0abd33e Mon Sep 17 00:00:00 2001 From: Adrian Greeve Date: Tue, 6 Aug 2013 14:23:03 +0800 Subject: [PATCH] MDL-39962 - Events: Replace the legacy event workshop_viewed This also includes the abstract class course_module_viewed. --- .../allocation/scheduled/classes/observer.php | 82 ++++++++++++++ .../allocation/scheduled/db/events.php | 15 +-- mod/workshop/allocation/scheduled/lib.php | 47 -------- .../classes/event/course_module_viewed.php | 106 ++++++++++++++++++ mod/workshop/lang/en/workshop.php | 1 + mod/workshop/view.php | 34 +++--- 6 files changed, 214 insertions(+), 71 deletions(-) create mode 100644 mod/workshop/allocation/scheduled/classes/observer.php create mode 100644 mod/workshop/classes/event/course_module_viewed.php diff --git a/mod/workshop/allocation/scheduled/classes/observer.php b/mod/workshop/allocation/scheduled/classes/observer.php new file mode 100644 index 00000000000..90ddfd6b819 --- /dev/null +++ b/mod/workshop/allocation/scheduled/classes/observer.php @@ -0,0 +1,82 @@ +. + +/** + * Event observers for workshopallocation_scheduled. + * + * @package workshopallocation_scheduled + * @copyright 2013 Adrian Greeve + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace workshopallocation_scheduled; +defined('MOODLE_INTERNAL') || die(); + +/** + * Class for workshopallocation_scheduled observers. + * + * @package workshopallocation_scheduled + * @copyright 2013 Adrian Greeve + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class observer { + + /** + * Triggered when the '\mod_workshop\event\course_module_viewed' event is triggered. + * + * This does the same job as {@link workshopallocation_scheduled_cron()} but for the + * single workshop. The idea is that we do not need to wait for cron to execute. + * Displaying the workshop main view.php can trigger the scheduled allocation, too. + * + * @param \mod_workshop\event\course_module_viewed $event + * @return bool + */ + public static function workshop_viewed($event) { + global $DB; + + $workshop = $event->get_record_snapshot('workshop', $event->objectid); + $course = $event->get_record_snapshot('course', $event->courseid); + $cm = $event->get_record_snapshot('course_modules', $event->contextinstanceid); + + $workshop = new \workshop($workshop, $cm, $course); + $now = time(); + + // Non-expensive check to see if the scheduled allocation can even happen. + if ($workshop->phase == \workshop::PHASE_SUBMISSION and $workshop->submissionend > 0 and $workshop->submissionend < $now) { + + // Make sure the scheduled allocation has been configured for this workshop, that it has not + // been executed yet and that the passed workshop record is still valid. + $sql = "SELECT a.id + FROM {workshopallocation_scheduled} a + JOIN {workshop} w ON a.workshopid = w.id + WHERE w.id = :workshopid + AND a.enabled = 1 + AND w.phase = :phase + AND w.submissionend > 0 + AND w.submissionend < :now + AND (a.timeallocated IS NULL OR a.timeallocated < w.submissionend)"; + $params = array('workshopid' => $workshop->id, 'phase' => \workshop::PHASE_SUBMISSION, 'now' => $now); + + if ($DB->record_exists_sql($sql, $params)) { + // Allocate submissions for assessments. + $allocator = $workshop->allocator_instance('scheduled'); + $result = $allocator->execute(); + // Todo inform the teachers about the results. + } + } + return true; + } +} diff --git a/mod/workshop/allocation/scheduled/db/events.php b/mod/workshop/allocation/scheduled/db/events.php index d9137fc881a..33c0c1713bd 100644 --- a/mod/workshop/allocation/scheduled/db/events.php +++ b/mod/workshop/allocation/scheduled/db/events.php @@ -27,14 +27,9 @@ defined('MOODLE_INTERNAL') || die(); -$handlers = array( - - // The workshop main page is displayed to the user - 'workshop_viewed' => array( - 'handlerfile' => '/mod/workshop/allocation/scheduled/lib.php', - 'handlerfunction' => 'workshopallocation_scheduled_workshop_viewed', - 'schedule' => 'instant', - 'internal' => 1, - ), - +$observers = array( + array( + 'eventname' => '\mod_workshop\event\course_module_viewed', + 'callback' => '\workshopallocation_scheduled\observer::workshop_viewed', + ) ); diff --git a/mod/workshop/allocation/scheduled/lib.php b/mod/workshop/allocation/scheduled/lib.php index 8809e93def2..11095a97b58 100644 --- a/mod/workshop/allocation/scheduled/lib.php +++ b/mod/workshop/allocation/scheduled/lib.php @@ -285,50 +285,3 @@ function workshopallocation_scheduled_cron() { // todo inform the teachers about the results } } - -//////////////////////////////////////////////////////////////////////////////// -// Events API -//////////////////////////////////////////////////////////////////////////////// - -/** - * Handler for the 'workshop_viewed' event - * - * This does the same job as {@link workshopallocation_scheduled_cron()} but for the - * single workshop. The idea is that we do not need to wait forcron to execute. - * Displaying the workshop main view.php can trigger the scheduled allocation, too. - * - * @param stdClass $event event data - * @return bool - */ -function workshopallocation_scheduled_workshop_viewed($event) { - global $DB; - - $workshop = $event->workshop; - $now = time(); - - // Non-expensive check to see if the scheduled allocation can even happen. - if ($workshop->phase == workshop::PHASE_SUBMISSION and $workshop->submissionend > 0 and $workshop->submissionend < $now) { - - // Make sure the scheduled allocation has been configured for this workshop, that it has not - // been executed yet and that the passed workshop record is still valid. - $sql = "SELECT a.id - FROM {workshopallocation_scheduled} a - JOIN {workshop} w ON a.workshopid = w.id - WHERE w.id = :workshopid - AND a.enabled = 1 - AND w.phase = :phase - AND w.submissionend > 0 - AND w.submissionend < :now - AND (a.timeallocated IS NULL OR a.timeallocated < w.submissionend)"; - $params = array('workshopid' => $workshop->id, 'phase' => workshop::PHASE_SUBMISSION, 'now' => $now); - - if ($DB->record_exists_sql($sql, $params)) { - // Allocate submissions for assessments. - $allocator = $workshop->allocator_instance('scheduled'); - $result = $allocator->execute(); - // todo inform the teachers about the results - } - } - - return true; -} diff --git a/mod/workshop/classes/event/course_module_viewed.php b/mod/workshop/classes/event/course_module_viewed.php new file mode 100644 index 00000000000..88226cdd6ff --- /dev/null +++ b/mod/workshop/classes/event/course_module_viewed.php @@ -0,0 +1,106 @@ +. + +/** + * This file contains an event for when a workshop activity is viewed. + * + * @package mod_workshop + * @copyright 2013 Adrian Greeve + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace mod_workshop\event; +defined('MOODLE_INTERNAL') || die(); + +/** + * Event for when a workshop activity is viewed. + * + * @package mod_workshop + * @copyright 2013 Adrian Greeve + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class course_module_viewed extends \core\event\content_viewed { + + /** + * Init method. + */ + protected function init() { + $this->data['crud'] = 'r'; + $this->data['level'] = self::LEVEL_PARTICIPATING; + $this->data['objecttable'] = 'workshop'; + } + + /** + * Does this event replace a legacy event? + * + * @return string legacy event name + */ + public static function get_legacy_eventname() { + return 'workshop_viewed'; + } + + /** + * Returns non-localised description of what happened. + * + * @return string + */ + public function get_description() { + return 'User with id ' . $this->userid . ' viewed content ' . $this->get_url() . ' In phase ' . $this->other['content']; + } + + /** + * Returns localised general event name. + * + * @return string + */ + public static function get_name() { + return get_string('workshopviewed', 'workshop'); + } + + /** + * Returns relevant URL. + * @return \moodle_url + */ + public function get_url() { + $url = '/mod/workshop/view.php'; + return new \moodle_url($url, array('id'=>$this->context->instanceid)); + } + + /** + * Legacy event data if get_legacy_eventname() is not empty. + * + * @return mixed + */ + protected function get_legacy_eventdata() { + global $USER; + + $workshop = $this->get_record_snapshot('workshop', $this->objectid); + $course = $this->get_record_snapshot('course', $this->courseid); + $cm = $this->get_record_snapshot('course_modules', $this->context->instanceid); + $workshop = new \workshop($workshop, $cm, $course); + return (object)array('workshop' => $workshop, 'user' => $USER); + } + + /** + * replace add_to_log() statement. + * + * @return array of parameters to be passed to legacy add_to_log() function. + */ + protected function get_legacy_logdata() { + $url = new \moodle_url('view.php', array('id' => $this->context->instanceid)); + return array($this->courseid, 'workshop', 'view', $url->out(), $this->objectid, $this->context->instanceid); + } +} diff --git a/mod/workshop/lang/en/workshop.php b/mod/workshop/lang/en/workshop.php index 9c99b1e9296..ef53bf0e3e9 100644 --- a/mod/workshop/lang/en/workshop.php +++ b/mod/workshop/lang/en/workshop.php @@ -311,6 +311,7 @@ $string['workshop:viewauthornames'] = 'View author names'; $string['workshop:viewauthorpublished'] = 'View authors of published submissions'; $string['workshop:viewpublishedsubmissions'] = 'View published submissions'; $string['workshop:viewreviewernames'] = 'View reviewer names'; +$string['workshopviewed'] = 'Workshop viewed'; $string['yourassessment'] = 'Your assessment'; $string['yourgrades'] = 'Your grades'; $string['yoursubmission'] = 'Your submission'; diff --git a/mod/workshop/view.php b/mod/workshop/view.php index 7272cfc964f..dfa245f2be1 100644 --- a/mod/workshop/view.php +++ b/mod/workshop/view.php @@ -41,30 +41,37 @@ $sorthow = optional_param('sorthow', 'ASC', PARAM_ALPHA); $eval = optional_param('eval', null, PARAM_PLUGIN); if ($id) { - $cm = get_coursemodule_from_id('workshop', $id, 0, false, MUST_EXIST); - $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST); - $workshop = $DB->get_record('workshop', array('id' => $cm->instance), '*', MUST_EXIST); + $cm = get_coursemodule_from_id('workshop', $id, 0, false, MUST_EXIST); + $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST); + $workshoprecord = $DB->get_record('workshop', array('id' => $cm->instance), '*', MUST_EXIST); } else { - $workshop = $DB->get_record('workshop', array('id' => $w), '*', MUST_EXIST); - $course = $DB->get_record('course', array('id' => $workshop->course), '*', MUST_EXIST); - $cm = get_coursemodule_from_instance('workshop', $workshop->id, $course->id, false, MUST_EXIST); + $workshoprecord = $DB->get_record('workshop', array('id' => $w), '*', MUST_EXIST); + $course = $DB->get_record('course', array('id' => $workshoprecord->course), '*', MUST_EXIST); + $cm = get_coursemodule_from_instance('workshop', $workshoprecord->id, $course->id, false, MUST_EXIST); } require_login($course, true, $cm); require_capability('mod/workshop:view', $PAGE->context); -$workshop = new workshop($workshop, $cm, $course); -$workshop->log('view'); +$workshop = new workshop($workshoprecord, $cm, $course); // Mark viewed $completion = new completion_info($course); $completion->set_module_viewed($cm); -// Fire the event -events_trigger('workshop_viewed', (object)array( - 'workshop' => $workshop, - 'user' => $USER, -)); +$eventdata = array(); +$eventdata['objectid'] = $workshop->id; +$eventdata['context'] = $workshop->context; +$eventdata['courseid'] = $course->id; +$eventdata['other']['content'] = $workshop->phase; + +$PAGE->set_url($workshop->view_url()); +$event = \mod_workshop\event\course_module_viewed::create($eventdata); +$event->add_record_snapshot('course', $course); +$event->add_record_snapshot('workshop', $workshoprecord); +$event->add_record_snapshot('course_modules', $cm); +$event->set_page_detail(); +$event->trigger(); // If the phase is to be switched, do it asap. This just has to happen after triggering // the event so that the scheduled allocator had a chance to allocate submissions. @@ -82,7 +89,6 @@ if (!is_null($editmode) && $PAGE->user_allowed_editing()) { $USER->editing = $editmode; } -$PAGE->set_url($workshop->view_url()); $PAGE->set_title($workshop->name); $PAGE->set_heading($course->fullname); -- 2.43.0