From 3290c01dc5e0c1c7d281777f98967b94a065e13e Mon Sep 17 00:00:00 2001 From: Mark Nelson Date: Sun, 23 Mar 2014 22:10:34 -0700 Subject: [PATCH] MDL-41101 mod_assign: replaced 'view feedback' add_to_log call with an event --- mod/assign/classes/event/feedback_viewed.php | 82 ++++++++++++++++++++ mod/assign/lang/en/assign.php | 1 + mod/assign/locallib.php | 15 +++- mod/assign/tests/events_test.php | 49 ++++++++++++ 4 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 mod/assign/classes/event/feedback_viewed.php diff --git a/mod/assign/classes/event/feedback_viewed.php b/mod/assign/classes/event/feedback_viewed.php new file mode 100644 index 00000000000..494d63011b2 --- /dev/null +++ b/mod/assign/classes/event/feedback_viewed.php @@ -0,0 +1,82 @@ +. + +/** + * The mod_assign feedback viewed event. + * + * @property-read array $other { + * Extra information about event. + * + * - int assignid: the id of the assignment. + * } + * + * @package mod_assign + * @since Moodle 2.7 + * @copyright 2014 Mark Nelson + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace mod_assign\event; + +defined('MOODLE_INTERNAL') || die(); + +class feedback_viewed extends base { + + /** + * Init method. + */ + protected function init() { + $this->data['objecttable'] = 'assign_grades'; + $this->data['crud'] = 'r'; + $this->data['edulevel'] = self::LEVEL_PARTICIPATING; + } + + /** + * Returns localised general event name. + * + * @return string + */ + public static function get_name() { + return get_string('eventfeedbackviewed', 'mod_assign'); + } + + /** + * Returns description of what happened. + * + * @return string + */ + public function get_description() { + return "The user with the id {$this->userid} viewed the feedback for the user with the id {$this->relateduserid} + for the assignment with the id {$this->other['assignid']}."; + } + + /** + * Custom validation. + * + * @throws \coding_exception + */ + protected function validate_data() { + parent::validate_data(); + + if (!isset($this->relateduserid)) { + throw new \coding_exception('The \'relateduserid\' must be set.'); + } + + if (!isset($this->other['assignid'])) { + throw new \coding_exception('The \'assignid\' must be set in other.'); + } + } +} diff --git a/mod/assign/lang/en/assign.php b/mod/assign/lang/en/assign.php index 6a171540f25..1dae7a4ba9b 100644 --- a/mod/assign/lang/en/assign.php +++ b/mod/assign/lang/en/assign.php @@ -143,6 +143,7 @@ $string['editaction'] = 'Actions...'; $string['eventallsubmissionsdownloaded'] = 'All the submissions are being downloaded.'; $string['eventassessablesubmitted'] = 'A submission has been submitted.'; $string['eventextensiongranted'] = 'An extension has been granted.'; +$string['eventfeedbackviewed'] = 'Feedback viewed'; $string['eventidentitiesrevealed'] = 'The identities have been revealed.'; $string['eventmarkerupdated'] = 'The allocated marker has been updated.'; $string['eventstatementaccepted'] = 'The user has accepted the statement of the submission.'; diff --git a/mod/assign/locallib.php b/mod/assign/locallib.php index 2c9af02571b..0e96772ebac 100644 --- a/mod/assign/locallib.php +++ b/mod/assign/locallib.php @@ -2208,8 +2208,19 @@ class assign { $this->get_course_module()->id, $this->get_return_action(), $this->get_return_params())); - $logmessage = get_string('viewfeedbackforuser', 'assign', $item->userid); - $this->add_to_log('view feedback', $logmessage); + + // Trigger event for viewing feedback. + $logmessage = new lang_string('viewfeedbackforuser', 'assign', $item->userid); + $event = \mod_assign\event\feedback_viewed::create(array( + 'objectid' => $item->id, + 'relateduserid' => $item->userid, + 'context' => $this->get_context(), + 'other' => array( + 'assignid' => $this->get_instance()->id + ) + )); + $event->set_legacy_logdata('view feedback', $logmessage); + $event->trigger(); } $o .= $this->view_return_links(); diff --git a/mod/assign/tests/events_test.php b/mod/assign/tests/events_test.php index 4ef653fdba2..6e3078b2f05 100644 --- a/mod/assign/tests/events_test.php +++ b/mod/assign/tests/events_test.php @@ -513,4 +513,53 @@ class assign_events_testcase extends mod_assign_base_testcase { $this->assertEventLegacyLogData($expected, $event); $this->assertEventContextNotUsed($event); } + + /** + * Test the feedback_viewed event. + */ + public function test_feedback_viewed() { + global $DB, $PAGE; + + $this->setUser($this->editingteachers[0]); + + $assign = $this->create_instance(); + $submission = $assign->get_user_submission($this->students[0]->id, true); + + // Insert a grade for this submission. + $grade = new stdClass(); + $grade->assignment = 1; + $grade->userid = $this->students[0]->id; + $gradeid = $DB->insert_record('assign_grades', $grade); + + // We need to set the URL in order to view the feedback. + $PAGE->set_url('/a_url'); + // A hack - these variables are used by the view_plugin_content function to + // determine what we actually want to view - would usually be set in URL. + global $_POST; + $_POST['plugin'] = 'comments'; + $_POST['gid'] = $gradeid; + $_POST['sid'] = $submission->id; + + // Trigger and capture the event. + $sink = $this->redirectEvents(); + $assign->view('viewpluginassignfeedback'); + $events = $sink->get_events(); + $this->assertCount(1, $events); + $event = reset($events); + + // Check that the event contains the expected values. + $this->assertInstanceOf('\mod_assign\event\feedback_viewed', $event); + $this->assertEquals($assign->get_context(), $event->get_context()); + $this->assertEquals($gradeid, $event->objectid); + $expected = array( + $assign->get_course()->id, + 'assign', + 'view feedback', + 'view.php?id=' . $assign->get_course_module()->id, + get_string('viewfeedbackforuser', 'assign', $this->students[0]->id), + $assign->get_course_module()->id + ); + $this->assertEventLegacyLogData($expected, $event); + $this->assertEventContextNotUsed($event); + } } -- 2.43.0