From 1be7aef2b1dc093c1133538ba2c69e568cb8825f Mon Sep 17 00:00:00 2001 From: Mark Nelson Date: Sat, 22 Mar 2014 17:27:52 -0700 Subject: [PATCH] MDL-41101 mod_assign: replaced 'view submission' add_to_log call with an event --- .../classes/event/submission_viewed.php | 82 +++++++++++++++++++ mod/assign/lang/en/assign.php | 1 + mod/assign/locallib.php | 24 ++++-- mod/assign/tests/events_test.php | 42 ++++++++++ 4 files changed, 144 insertions(+), 5 deletions(-) create mode 100644 mod/assign/classes/event/submission_viewed.php diff --git a/mod/assign/classes/event/submission_viewed.php b/mod/assign/classes/event/submission_viewed.php new file mode 100644 index 0000000000000..da0a1c5456119 --- /dev/null +++ b/mod/assign/classes/event/submission_viewed.php @@ -0,0 +1,82 @@ +. + +/** + * The mod_assign submission viewed event. + * + * @property-read array $other { + * Extra information about the 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 submission_viewed extends base { + + /** + * Init method. + */ + protected function init() { + $this->data['objecttable'] = 'assign_submission'; + $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('eventsubmissionviewed', 'mod_assign'); + } + + /** + * Returns description of what happened. + * + * @return string + */ + public function get_description() { + return "The user with the id {$this->userid} viewed the submission 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 8af1651aab9df..6a171540f2540 100644 --- a/mod/assign/lang/en/assign.php +++ b/mod/assign/lang/en/assign.php @@ -153,6 +153,7 @@ $string['eventsubmissionstatusupdated'] = 'The status of the submission has been updated.'; $string['eventsubmissionunlocked'] = 'The submissions have been unlocked for a user.'; $string['eventsubmissionupdated'] = 'Submission updated.'; +$string['eventsubmissionviewed'] = 'Submission viewed.'; $string['eventworkflowstateupdated'] = 'The state of the workflow has been updated.'; $string['extensionduedate'] = 'Extension due date'; $string['extensionnotafterduedate'] = 'Extension date must be after the due date'; diff --git a/mod/assign/locallib.php b/mod/assign/locallib.php index 46fce4fd62abd..2c9af02571bea 100644 --- a/mod/assign/locallib.php +++ b/mod/assign/locallib.php @@ -2150,8 +2150,6 @@ public function get_submission_group($userid) { * @return string */ protected function view_plugin_content($pluginsubtype) { - global $USER; - $o = ''; $submissionid = optional_param('sid', 0, PARAM_INT); @@ -2179,8 +2177,18 @@ protected function view_plugin_content($pluginsubtype) { $this->get_return_action(), $this->get_return_params())); - $logmessage = get_string('viewsubmissionforuser', 'assign', $item->userid); - $this->add_to_log('view submission', $logmessage); + // Trigger event for viewing a submission. + $logmessage = new lang_string('viewsubmissionforuser', 'assign', $item->userid); + $event = \mod_assign\event\submission_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 submission', $logmessage); + $event->trigger(); } else { $plugin = $this->get_feedback_plugin_by_type($plugintype); if ($gradeid <= 0) { @@ -2207,6 +2215,7 @@ protected function view_plugin_content($pluginsubtype) { $o .= $this->view_return_links(); $o .= $this->view_footer(); + return $o; } @@ -2347,7 +2356,12 @@ protected function view_quickgrading_result($message) { * @return string */ protected function view_footer() { - return $this->get_renderer()->render_footer(); + // When viewing the footer during PHPUNIT tests a set_state error is thrown. + if (!PHPUNIT_TEST) { + return $this->get_renderer()->render_footer(); + } + + return ''; } /** diff --git a/mod/assign/tests/events_test.php b/mod/assign/tests/events_test.php index d565927961ace..4ef653fdba289 100644 --- a/mod/assign/tests/events_test.php +++ b/mod/assign/tests/events_test.php @@ -471,4 +471,46 @@ public function test_submission_graded() { $this->assertEventLegacyLogData($expected, $event); $sink->close(); } + + /** + * Test the submission_viewed event. + */ + public function test_submission_viewed() { + global $PAGE; + + $this->setUser($this->editingteachers[0]); + + $assign = $this->create_instance(); + $submission = $assign->get_user_submission($this->students[0]->id, true); + + // We need to set the URL in order to view the submission. + $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['sid'] = $submission->id; + + // Trigger and capture the event. + $sink = $this->redirectEvents(); + $assign->view('viewpluginassignsubmission'); + $events = $sink->get_events(); + $this->assertCount(1, $events); + $event = reset($events); + + // Check that the event contains the expected values. + $this->assertInstanceOf('\mod_assign\event\submission_viewed', $event); + $this->assertEquals($assign->get_context(), $event->get_context()); + $this->assertEquals($submission->id, $event->objectid); + $expected = array( + $assign->get_course()->id, + 'assign', + 'view submission', + 'view.php?id=' . $assign->get_course_module()->id, + get_string('viewsubmissionforuser', 'assign', $this->students[0]->id), + $assign->get_course_module()->id + ); + $this->assertEventLegacyLogData($expected, $event); + $this->assertEventContextNotUsed($event); + } }