From 6cb524c4630f3fb0f0ff2e87067b0d8e08b760a6 Mon Sep 17 00:00:00 2001 From: Nick Phillips Date: Mon, 29 Jul 2019 13:55:06 +1200 Subject: [PATCH] Fix #411 - Add event for viewing of per-student reports, and use in view.php. --- classes/event/session_report_viewed.php | 136 ++++++++++++++++++++++++ lang/en/attendance.php | 1 + version.php | 2 +- view.php | 18 ++++ 4 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 classes/event/session_report_viewed.php diff --git a/classes/event/session_report_viewed.php b/classes/event/session_report_viewed.php new file mode 100644 index 0000000..de625ba --- /dev/null +++ b/classes/event/session_report_viewed.php @@ -0,0 +1,136 @@ +. + +/** + * This file contains an event for when a student's attendance report is viewed. + * + * @package mod_attendance + * @copyright 2019 Nick Phillips + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace mod_attendance\event; +defined('MOODLE_INTERNAL') || die(); + +/** + * Event for when a student's attendance report is viewed. + * + * @property-read array $other { + * Extra information about event properties. + * + * string studentid Id of student whose attendances were viewed. + * string mode Mode of the report viewed. + * } + * @package mod_attendance + * @copyright 2019 Nick Phillips + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class session_report_viewed extends \core\event\base { + + /** + * Init method. + */ + protected function init() { + $this->data['crud'] = 'r'; + $this->data['edulevel'] = self::LEVEL_TEACHING; + // objecttable and objectid can't be meaningfully specified + } + + /** + * Returns non-localised description of what happened. + * + * @return string + */ + public function get_description() { + return 'User with id ' . $this->userid . ' viewed attendance sessions for student with id ' . + $this->relateduserid; + } + + /** + * Returns localised general event name. + * + * @return string + */ + public static function get_name() { + return get_string('eventstudentattendancesessionsviewed', 'mod_attendance'); + } + + /** + * Get URL related to the action + * + * @return \moodle_url + */ + public function get_url() { + // Mode is optional. + $mode = empty($this->other['mode']) ? "" : $this->other['mode']; + return new \moodle_url('/mod/attendance/view.php', array('id' => $this->contextinstanceid, + 'studentid' => $this->relateduserid, + 'mode' => $mode, + 'view' => $this->other['view'], + 'curdate' => $this->other['curdate'])); + } + + /** + * Replace add_to_log() statement. + * + * @return array of parameters to be passed to legacy add_to_log() function. + */ + protected function get_legacy_logdata() { + return array($this->courseid, 'attendance', 'student sessions viewed', $this->get_url(), + 'student id ' . $this->relateduserid, $this->contextinstanceid); + } + + /** + * Get objectid mapping + * + * @return array of parameters for object mapping. + */ + public static function get_objectid_mapping() { + return array(); + } + + /** + * Get other mapping + * + * @return array of parameters for object mapping for objects referenced in 'other' property. + */ + public static function get_other_mapping() { + return array(); + } + + /** + * Custom validation. + * + * @throws \coding_exception + * @return void + */ + protected function validate_data() { + if (!isset($this->relateduserid)) { + throw new \coding_exception('The event mod_attendance\\event\\student_attendance_sessions_viewed must specify relateduserid.'); + } + // view params can be left out as defaults will be the same when log event is viewed as when + // it was stored. + // filter params are important, but stored in session so default effectively unknown, + // hence required here. + if (!isset($this->other['view'])) { + throw new \coding_exception('The event mod_attendance\\event\\student_attendance_sessions_viewed must specify view.'); + } + if (!isset($this->other['curdate'])) { + throw new \coding_exception('The event mod_attendance\\event\\student_attendance_sessions_viewed must specify curdate.'); + } + parent::validate_data(); + } +} diff --git a/lang/en/attendance.php b/lang/en/attendance.php index 3c5cfd2..a1ef040 100644 --- a/lang/en/attendance.php +++ b/lang/en/attendance.php @@ -216,6 +216,7 @@ $string['eventsessionipshared'] = 'Attendance self-marking IP conflict'; $string['eventsessionupdated'] = 'Session updated'; $string['eventstatusadded'] = 'Status added'; $string['eventstatusupdated'] = 'Status updated'; +$string['eventstudentattendancesessionsviewed'] = 'Session report viewed'; $string['eventtaken'] = 'Attendance taken'; $string['eventtakenbystudent'] = 'Attendance taken by student'; $string['export'] = 'Export'; diff --git a/version.php b/version.php index dae3710..68fec32 100755 --- a/version.php +++ b/version.php @@ -23,7 +23,7 @@ */ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2019072400; +$plugin->version = 2019072401; $plugin->requires = 2019052000; // Requires 3.7. $plugin->release = '3.7.0'; $plugin->maturity = MATURITY_STABLE; diff --git a/view.php b/view.php index 97c05e7..4be6a1b 100644 --- a/view.php +++ b/view.php @@ -78,6 +78,24 @@ if (isset($pageparams->studentid) && $USER->id != $pageparams->studentid) { } $userdata = new attendance_user_data($att, $userid); + +// Trigger viewed event + +// Create url for link in log screen. +$filterparams = array( + 'view' => $userdata->pageparams->view, + 'curdate' => $userdata->pageparams->curdate, + 'startdate' => $userdata->pageparams->startdate, + 'enddate' => $userdata->pageparams->enddate +); +$params = array_merge($userdata->pageparams->get_significant_params(), $filterparams); +$event = \mod_attendance\event\session_report_viewed::create(array( + 'relateduserid' => $userdata->pageparams->studentid, + 'context' => $context, + 'other' => $params)); +$event->add_record_snapshot('course_modules', $cm); +$event->trigger(); + $header = new mod_attendance_header($att); echo $output->header();