From 1e5241a12b1800d9dc1592f63dde4c20fdc86f5d Mon Sep 17 00:00:00 2001 From: Juan Leyva Date: Tue, 17 Nov 2015 10:59:58 +0100 Subject: [PATCH] MDL-52073 enrol_guest: New Web Service enrol_guest_get_instance_info --- enrol/guest/classes/external.php | 119 ++++++++++++++++++++++++++++ enrol/guest/db/services.php | 35 ++++++++ enrol/guest/lib.php | 28 +++++++ enrol/guest/tests/external_test.php | 116 +++++++++++++++++++++++++++ enrol/guest/version.php | 2 +- lib/db/services.php | 1 + version.php | 2 +- 7 files changed, 301 insertions(+), 2 deletions(-) create mode 100644 enrol/guest/classes/external.php create mode 100644 enrol/guest/db/services.php create mode 100644 enrol/guest/tests/external_test.php diff --git a/enrol/guest/classes/external.php b/enrol/guest/classes/external.php new file mode 100644 index 00000000000..a441ef861c6 --- /dev/null +++ b/enrol/guest/classes/external.php @@ -0,0 +1,119 @@ +. + +/** + * Guest enrolment method external API + * + * @package enrol_guest + * @category external + * @copyright 2015 Juan Leyva + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @since Moodle 3.1 + */ + +defined('MOODLE_INTERNAL') || die; + +require_once($CFG->libdir . '/externallib.php'); +require_once($CFG->libdir . '/enrollib.php'); + +/** + * Guest enrolment method external API + * + * @package enrol_guest + * @category external + * @copyright 2015 Juan Leyva + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @since Moodle 3.1 + */ +class enrol_guest_external extends external_api { + + /** + * Returns description of get_instance_info() parameters. + * + * @return external_function_parameters + * @since Moodle 3.1 + */ + public static function get_instance_info_parameters() { + return new external_function_parameters( + array('instanceid' => new external_value(PARAM_INT, 'Instance id of guest enrolment plugin.')) + ); + } + + /** + * Return guest enrolment instance information. + * + * @param int $instanceid instance id of guest enrolment plugin. + * @return array warnings and instance information. + * @since Moodle 3.1 + */ + public static function get_instance_info($instanceid) { + global $DB; + + $params = self::validate_parameters(self::get_instance_info_parameters(), array('instanceid' => $instanceid)); + $warnings = array(); + + // Retrieve guest enrolment plugin. + $enrolplugin = enrol_get_plugin('guest'); + if (empty($enrolplugin)) { + throw new moodle_exception('invaliddata', 'error'); + } + + require_login(null, false, null, false, true); + $enrolinstance = $DB->get_record('enrol', array('id' => $params['instanceid']), '*', MUST_EXIST); + + $course = $DB->get_record('course', array('id' => $enrolinstance->courseid), '*', MUST_EXIST); + $context = context_course::instance($course->id); + if (!$course->visible and !has_capability('moodle/course:viewhiddencourses', $context)) { + throw new moodle_exception('coursehidden'); + } + + $instanceinfo = $enrolplugin->get_enrol_info($enrolinstance); + // Specific instance information. + $instanceinfo->passwordrequired = $instanceinfo->requiredparam->passwordrequired; + + unset($instanceinfo->requiredparam); + + $result = array(); + $result['instanceinfo'] = $instanceinfo; + $result['warnings'] = $warnings; + return $result; + } + + /** + * Returns description of get_instance_info() result value. + * + * @return external_description + * @since Moodle 3.1 + */ + public static function get_instance_info_returns() { + return new external_single_structure( + array( + 'instanceinfo' => new external_single_structure( + array( + 'id' => new external_value(PARAM_INT, 'Id of course enrolment instance'), + 'courseid' => new external_value(PARAM_INT, 'Id of course'), + 'type' => new external_value(PARAM_PLUGIN, 'Type of enrolment plugin'), + 'name' => new external_value(PARAM_RAW, 'Name of enrolment plugin'), + 'status' => new external_value(PARAM_BOOL, 'Is the enrolment enabled?'), + 'passwordrequired' => new external_value(PARAM_BOOL, 'Is a password required?'), + ) + ), + 'warnings' => new external_warnings() + ) + ); + } + +} diff --git a/enrol/guest/db/services.php b/enrol/guest/db/services.php new file mode 100644 index 00000000000..9127483a08f --- /dev/null +++ b/enrol/guest/db/services.php @@ -0,0 +1,35 @@ +. + +/** + * Guest enrolment external functions and service definitions. + * + * @package enrol_guest + * @category external + * @copyright 2015 Juan Leyva + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @since Moodle 3.1 + */ + +$functions = array( + + 'enrol_guest_get_instance_info' => array( + 'classname' => 'enrol_guest_external', + 'methodname' => 'get_instance_info', + 'description' => 'Return guest enrolment instance information.', + 'type' => 'read' + ), +); diff --git a/enrol/guest/lib.php b/enrol/guest/lib.php index 7c0bfd26ab6..51e2edb105c 100644 --- a/enrol/guest/lib.php +++ b/enrol/guest/lib.php @@ -391,4 +391,32 @@ class enrol_guest_plugin extends enrol_plugin { $fields['status'] = $this->get_config('status'); return $fields; } + + /** + * Return information for enrolment instance containing list of parameters required + * for enrolment, name of enrolment plugin etc. + * + * @param stdClass $instance enrolment instance + * @return stdClass instance info. + * @since Moodle 3.1 + */ + public function get_enrol_info(stdClass $instance) { + + $instanceinfo = new stdClass(); + $instanceinfo->id = $instance->id; + $instanceinfo->courseid = $instance->courseid; + $instanceinfo->type = $this->get_name(); + $instanceinfo->name = $this->get_instance_name($instance); + $instanceinfo->status = $instance->status == ENROL_INSTANCE_ENABLED; + + // Specifics enrolment method parameters. + $instanceinfo->requiredparam = new stdClass(); + $instanceinfo->requiredparam->passwordrequired = !empty($instance->password); + + // If the plugin is enabled, return the URL for obtaining more information. + if ($instanceinfo->status) { + $instanceinfo->wsfunction = 'enrol_guest_get_instance_info'; + } + return $instanceinfo; + } } diff --git a/enrol/guest/tests/external_test.php b/enrol/guest/tests/external_test.php new file mode 100644 index 00000000000..91193af45cf --- /dev/null +++ b/enrol/guest/tests/external_test.php @@ -0,0 +1,116 @@ +. + +/** + * Self enrol external PHPunit tests + * + * @package enrol_guest + * @copyright 2015 Juan Leyva + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @since Moodle 3.1 + */ + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; + +require_once($CFG->dirroot . '/webservice/tests/helpers.php'); + +/** + * Guest enrolment external functions tests + * + * @package enrol_guest + * @category external + * @copyright 2015 Juan Leyva + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @since Moodle 3.1 + */ +class enrol_guest_external_testcase extends externallib_advanced_testcase { + + /** + * Test get_instance_info + */ + public function test_get_instance_info() { + global $DB; + + $this->resetAfterTest(true); + + // Check if guest enrolment plugin is enabled. + $guestplugin = enrol_get_plugin('guest'); + $this->assertNotEmpty($guestplugin); + + $studentrole = $DB->get_record('role', array('shortname' => 'student')); + + $coursedata = new stdClass(); + $coursedata->visible = 0; + $course = self::getDataGenerator()->create_course($coursedata); + + $student = self::getDataGenerator()->create_user(); + $this->getDataGenerator()->enrol_user($student->id, $course->id, $studentrole->id, 'manual'); + + // Add enrolment methods for course. + $instance = $guestplugin->add_instance($course, array('status' => ENROL_INSTANCE_ENABLED, + 'name' => 'Test instance', + 'customint6' => 1, + 'roleid' => $studentrole->id)); + + $this->setAdminUser(); + $result = enrol_guest_external::get_instance_info($instance); + $result = external_api::clean_returnvalue(enrol_guest_external::get_instance_info_returns(), $result); + + $this->assertEquals($instance, $result['instanceinfo']['id']); + $this->assertEquals($course->id, $result['instanceinfo']['courseid']); + $this->assertEquals('guest', $result['instanceinfo']['type']); + $this->assertEquals('Test instance', $result['instanceinfo']['name']); + $this->assertTrue($result['instanceinfo']['status']); + $this->assertFalse($result['instanceinfo']['passwordrequired']); + + $DB->set_field('enrol', 'status', ENROL_INSTANCE_DISABLED, array('id' => $instance)); + + $result = enrol_guest_external::get_instance_info($instance); + $result = external_api::clean_returnvalue(enrol_guest_external::get_instance_info_returns(), $result); + $this->assertEquals($instance, $result['instanceinfo']['id']); + $this->assertEquals($course->id, $result['instanceinfo']['courseid']); + $this->assertEquals('guest', $result['instanceinfo']['type']); + $this->assertEquals('Test instance', $result['instanceinfo']['name']); + $this->assertFalse($result['instanceinfo']['status']); + $this->assertFalse($result['instanceinfo']['passwordrequired']); + + $DB->set_field('enrol', 'status', ENROL_INSTANCE_ENABLED, array('id' => $instance)); + + // Try to retrieve information using a normal user for a hidden course. + $user = self::getDataGenerator()->create_user(); + $this->setUser($user); + try { + enrol_guest_external::get_instance_info($instance); + } catch (moodle_exception $e) { + $this->assertEquals('coursehidden', $e->errorcode); + } + + // Student user. + $DB->set_field('course', 'visible', 1, array('id' => $course->id)); + $this->setUser($student); + $result = enrol_guest_external::get_instance_info($instance); + $result = external_api::clean_returnvalue(enrol_guest_external::get_instance_info_returns(), $result); + + $this->assertEquals($instance, $result['instanceinfo']['id']); + $this->assertEquals($course->id, $result['instanceinfo']['courseid']); + $this->assertEquals('guest', $result['instanceinfo']['type']); + $this->assertEquals('Test instance', $result['instanceinfo']['name']); + $this->assertTrue($result['instanceinfo']['status']); + $this->assertFalse($result['instanceinfo']['passwordrequired']); + } +} diff --git a/enrol/guest/version.php b/enrol/guest/version.php index d916ed6ae30..5076e7b2860 100644 --- a/enrol/guest/version.php +++ b/enrol/guest/version.php @@ -24,6 +24,6 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2015111600; // The current plugin version (Date: YYYYMMDDXX) +$plugin->version = 2015111601; // The current plugin version (Date: YYYYMMDDXX) $plugin->requires = 2015111000; // Requires this Moodle version $plugin->component = 'enrol_guest'; // Full name of the plugin (used for diagnostics) diff --git a/lib/db/services.php b/lib/db/services.php index 54902d9a8a0..d1a74c44bd3 100644 --- a/lib/db/services.php +++ b/lib/db/services.php @@ -1168,6 +1168,7 @@ $services = array( 'core_enrol_get_users_courses', 'core_enrol_get_enrolled_users', 'core_enrol_get_course_enrolment_methods', + 'enrol_guest_get_instance_info', 'enrol_self_enrol_user', 'enrol_self_get_instance_info', 'core_user_get_users_by_id', diff --git a/version.php b/version.php index f57768ecd78..4c394d54cc8 100644 --- a/version.php +++ b/version.php @@ -29,7 +29,7 @@ defined('MOODLE_INTERNAL') || die(); -$version = 2015120900.00; // YYYYMMDD = weekly release date of this DEV branch. +$version = 2015120900.01; // YYYYMMDD = weekly release date of this DEV branch. // RR = release increments - 00 in DEV branches. // .XX = incremental changes. -- 2.43.0