diff --git a/course/user.php b/course/user.php index cd37afc1101..0cc1a80f85d 100644 --- a/course/user.php +++ b/course/user.php @@ -105,7 +105,14 @@ if (!in_array($mode, $modes)) { $mode = reset($modes); } -add_to_log($course->id, "course", "user report", "user.php?id=$course->id&user=$user->id&mode=$mode", "$user->id"); +$eventdata = array(); +$eventdata['courseid'] = $id; +$eventdata['context'] = $coursecontext; +$eventdata['userid'] = $user->id; +$eventdata['other'] = array(); +$eventdata['other']['mode'] = $mode; +$event = \core\event\course_user_report_viewed::create($eventdata); +$event->trigger(); $stractivityreport = get_string("activityreport"); diff --git a/course/view.php b/course/view.php index c5ec9d0216f..66cd91b09ab 100644 --- a/course/view.php +++ b/course/view.php @@ -94,11 +94,7 @@ require_once($CFG->dirroot.'/calendar/lib.php'); /// This is after login because it needs $USER - $logparam = 'id='. $course->id; - $loglabel = 'view'; - $infoid = $course->id; if ($section and $section > 0) { - $loglabel = 'view section'; // Get section details and check it exists. $modinfo = get_fast_modinfo($course); @@ -111,10 +107,7 @@ // correct error message shown. require_capability('moodle/course:viewhiddensections', $context); } - $infoid = $coursesections->id; - $logparam .= '§ionid='. $infoid; } - add_to_log($course->id, 'course', $loglabel, "view.php?". $logparam, $infoid); // Fix course format if it is no longer installed $course->format = course_get_format($course)->get_format(); @@ -288,6 +281,18 @@ echo html_writer::end_tag('div'); + // Trigger course viewed event. + $eventparams = array(); + $eventparams['context'] = $context; + $eventparams['courseid'] = $course->id; + $eventparams['userid'] = $USER->id; + if (!empty($section)) { + $eventparams['other'] = array(); + $eventparams['other']['coursesectionid'] = $section; + } + $event = \core\event\course_viewed::create($eventparams); + $event->trigger(); + // Include course AJAX include_course_ajax($course, $modnamesused); diff --git a/index.php b/index.php index 5c5f659e856..83e24198a05 100644 --- a/index.php +++ b/index.php @@ -76,7 +76,9 @@ } if (isloggedin()) { - add_to_log(SITEID, 'course', 'view', 'view.php?id='.SITEID, SITEID); + $eventparams = array('courseid' => SITEID, 'context' => context_course::instance(SITEID)); + $event = \core\event\course_viewed::create($eventparams); + $event->trigger(); } /// If the hub plugin is installed then we let it take over the homepage here diff --git a/lang/en/moodle.php b/lang/en/moodle.php index d09245d653f..f508a19b37b 100644 --- a/lang/en/moodle.php +++ b/lang/en/moodle.php @@ -737,6 +737,8 @@ $string['eventcourserestored'] = 'Course restored'; $string['eventcourseupdated'] = 'Course updated'; $string['eventcoursesectionupdated'] = ' Course section updated'; $string['eventcoursemoduleinstancelistviewed'] = 'Course module instance list viewed'; +$string['eventcourseuserreportviewed'] = 'Course user report viewed'; +$string['eventcourseviewed'] = 'Course viewed'; $string['eventemailfailed'] = 'Email failed to send'; $string['eventname'] = 'Event name'; $string['eventunknownlogged'] = 'Unknown event'; diff --git a/lib/classes/event/course_user_report_viewed.php b/lib/classes/event/course_user_report_viewed.php new file mode 100644 index 00000000000..ec5cfb06344 --- /dev/null +++ b/lib/classes/event/course_user_report_viewed.php @@ -0,0 +1,104 @@ +. + +/** + * Course user report viewed event. + * + * @package core + * @copyright 2014 Adrian Greeve + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core\event; +defined('MOODLE_INTERNAL') || die(); + +/** + * Course user report viewed event class. + * + * Class for event to be triggered when a course user report is viewed. + * @property-read array $other Extra information about the event. + * -string mode: Mode is used to show the user different data. + * + * @package core + * @since Moodle 2.7 + * @copyright 2014 Adrian Greeve + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class course_user_report_viewed extends \core\event\base { + + /** + * Init method. + * + * Please override this in extending class and specify objecttable. + * + * @return void + */ + protected function init() { + $this->data['crud'] = 'r'; + $this->data['edulevel'] = self::LEVEL_PARTICIPATING; + } + + /** + * Returns description of what happened. + * + * @return string + */ + public function get_description() { + return "A user with the id '$this->userid' viewed the user report in the course '$this->courseid'"; + } + + /** + * Return localised event name. + * + * @return string + */ + public static function get_name() { + return get_string('eventcourseuserreportviewed', 'core'); + } + + /** + * Get URL related to the action. + * + * @return \moodle_url + */ + public function get_url() { + return new \moodle_url("/course/user.php", array('id' => $this->courseid, 'user' => $this->userid, + 'mode' => $this->other['mode'])); + } + + /** + * Return the legacy event log data. + * + * @return array|null + */ + protected function get_legacy_logdata() { + return array($this->courseid, 'course', 'user report', 'user.php?id=' . $this->courseid . '&user=' + . $this->userid . '&mode=' . $this->other['mode'], $this->userid); + } + + /** + * Custom validation. + * + * @throws \coding_exception + * @return void + */ + protected function validate_data() { + // Make sure this class is never used without proper object details. + if (!isset($this->other['mode'])) { + throw new \coding_exception('mode needs to be set in $other.'); + } + } +} diff --git a/lib/classes/event/course_viewed.php b/lib/classes/event/course_viewed.php new file mode 100644 index 00000000000..61dc771d7b1 --- /dev/null +++ b/lib/classes/event/course_viewed.php @@ -0,0 +1,106 @@ +. + +/** + * Course viewed event. + * + * @package core + * @copyright 2014 Adrian Greeve + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core\event; +defined('MOODLE_INTERNAL') || die(); + +/** + * Course viewed event class. + * + * Class for event to be triggered when a course is viewed. + * @property-read array $other Extra information about the event. + * -int coursesectionid: The course section ID (Optional!). + * + * @package core + * @since Moodle 2.7 + * @copyright 2014 Adrian Greeve + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class course_viewed extends \core\event\base { + + /** + * Init method. + * + * Please override this in extending class and specify objecttable. + * + * @return void + */ + protected function init() { + $this->data['crud'] = 'r'; + $this->data['edulevel'] = self::LEVEL_PARTICIPATING; + } + + /** + * Returns description of what happened. + * + * @return string + */ + public function get_description() { + return "A user with the id '$this->userid' viewed the course '$this->courseid'"; + } + + /** + * Return localised event name. + * + * @return string + */ + public static function get_name() { + return get_string('eventcourseviewed', 'core'); + } + + /** + * Get URL related to the action. + * + * @return \moodle_url + */ + public function get_url() { + return \course_get_url($this->courseid, $this->other['coursesectionid']); + } + + /** + * Return the legacy event log data. + * + * @return array|null + */ + protected function get_legacy_logdata() { + if (!empty($this->other['coursesectionid'])) { + return array($this->courseid, 'course', 'view section', 'view.php?id=' . $this->courseid . '&sectionid=' + . $this->other['coursesectionid'], $this->other['coursesectionid']); + } else { + return array($this->courseid, 'course', 'view', 'view.php?id=' . $this->courseid, $this->courseid); + } + } + + /** + * Custom validation. + * + * @throws \coding_exception + * @return void + */ + protected function validate_data() { + if ($this->contextlevel != CONTEXT_COURSE) { + throw new \coding_exception('Context passed must be course context.'); + } + } +} diff --git a/lib/tests/events_test.php b/lib/tests/events_test.php index 130404d50b4..a98b82991bd 100644 --- a/lib/tests/events_test.php +++ b/lib/tests/events_test.php @@ -178,4 +178,87 @@ class core_events_testcase extends advanced_testcase { $this->assertEventLegacyLogData($expected, $event); $this->assertEventContextNotUsed($event); } + + /** + * There is no api involved so the best we can do is test legacy data by triggering event manually. + */ + public function test_course_user_report_viewed() { + + $user = $this->getDataGenerator()->create_user(); + $course = $this->getDataGenerator()->create_course(); + $context = context_course::instance($course->id); + + $eventparams = array(); + $eventparams['courseid'] = $course->id; + $eventparams['context'] = $context; + $eventparams['userid'] = $user->id; + $eventparams['other'] = array(); + $eventparams['other']['mode'] = 'grade'; + $event = \core\event\course_user_report_viewed::create($eventparams); + + // Trigger and capture the event. + $sink = $this->redirectEvents(); + $event->trigger(); + $events = $sink->get_events(); + $event = reset($events); + + $this->assertInstanceOf('\core\event\course_user_report_viewed', $event); + $this->assertEquals(context_course::instance($course->id), $event->get_context()); + $expected = array($course->id, 'course', 'user report', 'user.php?id=' . $course->id . '&user=' + . $user->id . '&mode=grade', $user->id); + $this->assertEventLegacyLogData($expected, $event); + $this->assertEventContextNotUsed($event); + } + + /** + * There is no api involved so the best we can do is test legacy data by triggering event manually. + */ + public function test_course_viewed() { + + $user = $this->getDataGenerator()->create_user(); + $course = $this->getDataGenerator()->create_course(); + $context = context_course::instance($course->id); + + // First try with no optional parameters. + $eventparams = array(); + $eventparams['courseid'] = $course->id; + $eventparams['context'] = $context; + $eventparams['userid'] = $user->id; + $event = \core\event\course_viewed::create($eventparams); + + // Trigger and capture the event. + $sink = $this->redirectEvents(); + $event->trigger(); + $events = $sink->get_events(); + $event = reset($events); + + $this->assertInstanceOf('\core\event\course_viewed', $event); + $this->assertEquals(context_course::instance($course->id), $event->get_context()); + $expected = array($course->id, 'course', 'view', 'view.php?id=' . $course->id, $course->id); + $this->assertEventLegacyLogData($expected, $event); + $this->assertEventContextNotUsed($event); + + // Now try with optional parameters. + $eventparams = array(); + $eventparams['courseid'] = $course->id; + $eventparams['context'] = $context; + $eventparams['userid'] = $user->id; + $eventparams['other'] = array(); + $sectionid = 34; + $eventparams['other']['coursesectionid'] = $sectionid; + $event = \core\event\course_viewed::create($eventparams); + + // Trigger and capture the event. + $sink = $this->redirectEvents(); + $event->trigger(); + $events = $sink->get_events(); + $event = reset($events); + + $this->assertInstanceOf('\core\event\course_viewed', $event); + $this->assertEquals(context_course::instance($course->id), $event->get_context()); + $expected = array($course->id, 'course', 'view section', 'view.php?id=' . $course->id . '&sectionid=' + . $sectionid, $sectionid); + $this->assertEventLegacyLogData($expected, $event); + $this->assertEventContextNotUsed($event); + } }