From 7336b66f05933d5ad21554562268ded00aa791a6 Mon Sep 17 00:00:00 2001 From: Juan Leyva Date: Fri, 8 Jul 2016 12:51:41 +0100 Subject: [PATCH] MDL-55162 mod_assign: New WS mod_assign_view_assign --- mod/assign/db/services.php | 10 ++++ mod/assign/externallib.php | 75 +++++++++++++++++++++++++++ mod/assign/locallib.php | 9 ++++ mod/assign/tests/externallib_test.php | 28 ++++++++++ mod/assign/version.php | 2 +- mod/assign/view.php | 4 +- 6 files changed, 125 insertions(+), 3 deletions(-) diff --git a/mod/assign/db/services.php b/mod/assign/db/services.php index 068e80d1dd9..0a336657236 100644 --- a/mod/assign/db/services.php +++ b/mod/assign/db/services.php @@ -220,4 +220,14 @@ $functions = array( 'ajax' => true, 'capabilities' => 'mod/assign:view, mod/assign:viewgrades' ), + 'mod_assign_view_assign' => array( + 'classname' => 'mod_assign_external', + 'methodname' => 'view_assign', + 'classpath' => 'mod/assign/externallib.php', + 'description' => 'Update the module completion status.', + 'type' => 'write', + 'capabilities' => 'mod/assign:view', + 'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE) + ), + ); diff --git a/mod/assign/externallib.php b/mod/assign/externallib.php index 9bdc7cc63d9..5065760ef2a 100644 --- a/mod/assign/externallib.php +++ b/mod/assign/externallib.php @@ -2856,4 +2856,79 @@ class mod_assign_external extends external_api { 'user' => $userdescription, )); } + + /** + * Utility function for validating an assign. + * + * @param int $assignid assign instance id + * @return array array containing the assign, course, context and course module objects + * @since Moodle 3.2 + */ + protected static function validate_assign($assignid) { + global $DB; + + // Request and permission validation. + $assign = $DB->get_record('assign', array('id' => $assignid), 'id', MUST_EXIST); + list($course, $cm) = get_course_and_cm_from_instance($assign, 'assign'); + + $context = context_module::instance($cm->id); + // Please, note that is not required to check mod/assign:view because is done by validate_context->require_login. + self::validate_context($context); + $assign = new assign($context, $cm, $course); + + return array($assign, $course, $cm, $context); + } + + /** + * Describes the parameters for view_assign. + * + * @return external_external_function_parameters + * @since Moodle 3.2 + */ + public static function view_assign_parameters() { + return new external_function_parameters ( + array( + 'assignid' => new external_value(PARAM_INT, 'assign instance id'), + ) + ); + } + + /** + * Update the module completion status. + * + * @param int $assignid assign instance id + * @return array of warnings and status result + * @since Moodle 3.2 + */ + public static function view_assign($assignid) { + $warnings = array(); + $params = array( + 'assignid' => $assignid, + ); + $params = self::validate_parameters(self::view_assign_parameters(), $params); + + list($assign, $course, $cm, $context) = self::validate_assign($params['assignid']); + + $assign->set_module_viewed(); + + $result = array(); + $result['status'] = true; + $result['warnings'] = $warnings; + return $result; + } + + /** + * Describes the view_assign return value. + * + * @return external_single_structure + * @since Moodle 3.2 + */ + public static function view_assign_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/assign/locallib.php b/mod/assign/locallib.php index 2aa605de10b..a97f2034095 100644 --- a/mod/assign/locallib.php +++ b/mod/assign/locallib.php @@ -8068,6 +8068,15 @@ class assign { return; } + /** + * Update the module completion status (set it viewed). + * + * @since Moodle 3.2 + */ + public function set_module_viewed() { + $completion = new completion_info($this->get_course()); + $completion->set_module_viewed($this->get_course_module()); + } } /** diff --git a/mod/assign/tests/externallib_test.php b/mod/assign/tests/externallib_test.php index 22cd5616fac..4f8e7ea8c39 100644 --- a/mod/assign/tests/externallib_test.php +++ b/mod/assign/tests/externallib_test.php @@ -2391,4 +2391,32 @@ class mod_assign_external_testcase extends externallib_advanced_testcase { 'teacher' => $teacher ); } + + /** + * Test test_view_assign + */ + public function test_view_assign() { + global $CFG; + + $CFG->enablecompletion = 1; + $this->resetAfterTest(); + + $this->setAdminUser(); + // Setup test data. + $course = $this->getDataGenerator()->create_course(array('enablecompletion' => 1)); + $assign = $this->getDataGenerator()->create_module('assign', array('course' => $course->id), + array('completion' => 2, 'completionview' => 1)); + $context = context_module::instance($assign->cmid); + $cm = get_coursemodule_from_instance('assign', $assign->id); + + $result = mod_assign_external::view_assign($assign->id); + $result = external_api::clean_returnvalue(mod_assign_external::view_assign_returns(), $result); + $this->assertTrue($result['status']); + $this->assertEmpty($result['warnings']); + + // Check completion status. + $completion = new completion_info($course); + $completiondata = $completion->get_data($cm); + $this->assertEquals(1, $completiondata->completionstate); + } } diff --git a/mod/assign/version.php b/mod/assign/version.php index 23e28b25f71..c43996a1c0b 100644 --- a/mod/assign/version.php +++ b/mod/assign/version.php @@ -25,6 +25,6 @@ defined('MOODLE_INTERNAL') || die(); $plugin->component = 'mod_assign'; // Full name of the plugin (used for diagnostics). -$plugin->version = 2016070400; // The current module version (Date: YYYYMMDDXX). +$plugin->version = 2016070401; // The current module version (Date: YYYYMMDDXX). $plugin->requires = 2016051900; // Requires this Moodle version. $plugin->cron = 60; diff --git a/mod/assign/view.php b/mod/assign/view.php index 01d0edd2d46..8c3ddfe64de 100644 --- a/mod/assign/view.php +++ b/mod/assign/view.php @@ -44,8 +44,8 @@ $urlparams = array('id' => $id, $url = new moodle_url('/mod/assign/view.php', $urlparams); $PAGE->set_url($url); -$completion=new completion_info($course); -$completion->set_module_viewed($cm); +// Update module completion status. +$assign->set_module_viewed(); // Get the assign class to // render the page.