From 0f3c09979f219e3fa4fc9147affa7e9f7646e8a7 Mon Sep 17 00:00:00 2001 From: Juan Leyva Date: Thu, 2 Feb 2017 10:17:46 +0100 Subject: [PATCH] MDL-57811 mod_feedback: New Web Service mod_feedback_view_feedback --- mod/feedback/classes/completion.php | 31 +++++++++++++ mod/feedback/classes/external.php | 66 ++++++++++++++++++++++++++++ mod/feedback/complete.php | 4 +- mod/feedback/db/services.php | 8 ++++ mod/feedback/tests/external_test.php | 50 +++++++++++++++++++++ mod/feedback/version.php | 2 +- mod/feedback/view.php | 3 +- 7 files changed, 158 insertions(+), 6 deletions(-) diff --git a/mod/feedback/classes/completion.php b/mod/feedback/classes/completion.php index 75096dcf9ea..31947a9870b 100644 --- a/mod/feedback/classes/completion.php +++ b/mod/feedback/classes/completion.php @@ -579,4 +579,35 @@ class mod_feedback_completion extends mod_feedback_structure { } return true; } + + /** + * Trigger module viewed event. + * + * @param stdClass $course optional, course object from DB + * @since Moodle 3.3 + */ + public function trigger_module_viewed($course = null) { + if ($course == null) { + $course = get_course($this->courseid); + } + $event = \mod_feedback\event\course_module_viewed::create_from_record($this->feedback, $this->cm, $course); + $event->trigger(); + } + + /** + * Mark activity viewed for completion-tracking. + * + * @param stdClass $course optional, course object from DB + * @since Moodle 3.3 + */ + public function set_module_viewed($course = null) { + global $CFG; + require_once($CFG->libdir . '/completionlib.php'); + + if ($course == null) { + $course = get_course($this->courseid); + } + $completion = new completion_info($course); + $completion->set_module_viewed($this->cm); + } } \ No newline at end of file diff --git a/mod/feedback/classes/external.php b/mod/feedback/classes/external.php index 2e371c8ad15..07d4bde1eb2 100644 --- a/mod/feedback/classes/external.php +++ b/mod/feedback/classes/external.php @@ -234,4 +234,70 @@ class mod_feedback_external extends external_api { ) ); } + + /** + * Describes the parameters for view_feedback. + * + * @return external_function_parameters + * @since Moodle 3.3 + */ + public static function view_feedback_parameters() { + return new external_function_parameters ( + array( + 'feedbackid' => new external_value(PARAM_INT, 'Feedback instance id'), + 'moduleviewed' => new external_value(PARAM_BOOL, 'If we need to mark the module as viewed for completion', + VALUE_DEFAULT, false), + ) + ); + } + + /** + * Trigger the course module viewed event and update the module completion status. + * + * @param int $feedbackid feedback instance id + * @param bool $moduleviewed If we need to mark the module as viewed for completion + * @return array of warnings and status result + * @since Moodle 3.3 + * @throws moodle_exception + */ + public static function view_feedback($feedbackid, $moduleviewed = false) { + + $params = array('feedbackid' => $feedbackid, 'moduleviewed' => $moduleviewed); + $params = self::validate_parameters(self::view_feedback_parameters(), $params); + $warnings = array(); + + list($feedback, $course, $cm, $context) = self::validate_feedback($params['feedbackid']); + $feedbackcompletion = new mod_feedback_completion($feedback, $cm, $course->id); + + // Trigger module viewed event. + $feedbackcompletion->trigger_module_viewed($course); + if ($params['moduleviewed']) { + if (!$feedbackcompletion->is_open()) { + throw new moodle_exception('feedback_is_not_open', 'feedback'); + } + // Mark activity viewed for completion-tracking. + $feedbackcompletion->set_module_viewed($course); + } + + $result = array( + 'status' => true, + 'warnings' => $warnings, + ); + return $result; + } + + /** + * Describes the view_feedback return value. + * + * @return external_single_structure + * @since Moodle 3.3 + */ + public static function view_feedback_returns() { + return new external_single_structure( + array( + 'status' => new external_value(PARAM_BOOL, 'status: true if success'), + 'warnings' => new external_warnings(), + ) + ); + } } diff --git a/mod/feedback/complete.php b/mod/feedback/complete.php index dbe9cd4cbf6..f8daedc598a 100644 --- a/mod/feedback/complete.php +++ b/mod/feedback/complete.php @@ -24,7 +24,6 @@ require_once("../../config.php"); require_once("lib.php"); -require_once($CFG->libdir . '/completionlib.php'); feedback_init_feedback_session(); @@ -82,9 +81,8 @@ if (!$feedbackcompletion->is_open()) { } // Mark activity viewed for completion-tracking. -$completion = new completion_info($course); if (isloggedin() && !isguestuser()) { - $completion->set_module_viewed($cm); + $feedbackcompletion->set_module_viewed($course); } // Check if user is prevented from re-submission. diff --git a/mod/feedback/db/services.php b/mod/feedback/db/services.php index 4f38f18329a..0535a5143d9 100644 --- a/mod/feedback/db/services.php +++ b/mod/feedback/db/services.php @@ -45,4 +45,12 @@ $functions = array( 'capabilities' => 'mod/feedback:view', 'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE), ), + 'mod_feedback_view_feedback' => array( + 'classname' => 'mod_feedback_external', + 'methodname' => 'view_feedback', + 'description' => 'Trigger the course module viewed event and update the module completion status.', + 'type' => 'write', + 'capabilities' => 'mod/feedback:view', + 'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE) + ), ); diff --git a/mod/feedback/tests/external_test.php b/mod/feedback/tests/external_test.php index 552fae21425..96138165f05 100644 --- a/mod/feedback/tests/external_test.php +++ b/mod/feedback/tests/external_test.php @@ -223,4 +223,54 @@ class mod_feedback_external_testcase extends externallib_advanced_testcase { $this->assertTrue($result['isanonymous']); $this->assertFalse($result['isalreadysubmitted']); } + + /** + * Test view_feedback invalid id. + */ + public function test_view_feedback_invalid_id() { + // Test invalid instance id. + $this->setExpectedException('moodle_exception'); + mod_feedback_external::view_feedback(0); + } + /** + * Test view_feedback not enrolled user. + */ + public function test_view_feedback_not_enrolled_user() { + $usernotenrolled = self::getDataGenerator()->create_user(); + $this->setUser($usernotenrolled); + $this->setExpectedException('moodle_exception'); + mod_feedback_external::view_feedback(0); + } + /** + * Test view_feedback no capabilities. + */ + public function test_view_feedback_no_capabilities() { + // Test user with no capabilities. + // We need a explicit prohibit since this capability is allowed for students by default. + assign_capability('mod/feedback:view', CAP_PROHIBIT, $this->studentrole->id, $this->context->id); + accesslib_clear_all_caches_for_unit_testing(); + $this->setExpectedException('moodle_exception'); + mod_feedback_external::view_feedback(0); + } + /** + * Test view_feedback. + */ + public function test_view_feedback() { + // Test user with full capabilities. + $this->setUser($this->student); + // Trigger and capture the event. + $sink = $this->redirectEvents(); + $result = mod_feedback_external::view_feedback($this->feedback->id); + $result = external_api::clean_returnvalue(mod_feedback_external::view_feedback_returns(), $result); + $events = $sink->get_events(); + $this->assertCount(1, $events); + $event = array_shift($events); + // Checking that the event contains the expected values. + $this->assertInstanceOf('\mod_feedback\event\course_module_viewed', $event); + $this->assertEquals($this->context, $event->get_context()); + $moodledata = new \moodle_url('/mod/feedback/view.php', array('id' => $this->cm->id)); + $this->assertEquals($moodledata, $event->get_url()); + $this->assertEventContextNotUsed($event); + $this->assertNotEmpty($event->get_name()); + } } diff --git a/mod/feedback/version.php b/mod/feedback/version.php index bf2c5a312cf..b69579057e5 100644 --- a/mod/feedback/version.php +++ b/mod/feedback/version.php @@ -24,7 +24,7 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2016120502; // The current module version (Date: YYYYMMDDXX) +$plugin->version = 2016120503; // The current module version (Date: YYYYMMDDXX) $plugin->requires = 2016112900; // Requires this Moodle version $plugin->component = 'mod_feedback'; // Full name of the plugin (used for diagnostics) $plugin->cron = 0; diff --git a/mod/feedback/view.php b/mod/feedback/view.php index 0361ed49a86..955a457a546 100644 --- a/mod/feedback/view.php +++ b/mod/feedback/view.php @@ -59,8 +59,7 @@ if (!has_capability('mod/feedback:edititems', $context) && } // Trigger module viewed event. -$event = \mod_feedback\event\course_module_viewed::create_from_record($feedback, $cm, $course); -$event->trigger(); +$feedbackcompletion->trigger_module_viewed($course); /// Print the page header echo $OUTPUT->header();