Merge branch 'MDL-52073-master' of git://github.com/jleyva/moodle
authorDavid Monllao <davidm@moodle.com>
Tue, 22 Dec 2015 08:23:33 +0000 (16:23 +0800)
committerDavid Monllao <davidm@moodle.com>
Tue, 22 Dec 2015 08:23:33 +0000 (16:23 +0800)
Conflicts:
version.php

enrol/guest/classes/external.php [new file with mode: 0644]
enrol/guest/db/services.php [new file with mode: 0644]
enrol/guest/lib.php
enrol/guest/tests/external_test.php [new file with mode: 0644]
enrol/guest/version.php
lib/db/services.php
version.php

diff --git a/enrol/guest/classes/external.php b/enrol/guest/classes/external.php
new file mode 100644 (file)
index 0000000..a441ef8
--- /dev/null
@@ -0,0 +1,119 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Guest enrolment method external API
+ *
+ * @package    enrol_guest
+ * @category   external
+ * @copyright  2015 Juan Leyva <juan@moodle.com>
+ * @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 <juan@moodle.com>
+ * @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 (file)
index 0000000..9127483
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Guest enrolment external functions and service definitions.
+ *
+ * @package    enrol_guest
+ * @category   external
+ * @copyright  2015 Juan Leyva <juan@moodle.com>
+ * @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'
+    ),
+);
index 7c0bfd2..51e2edb 100644 (file)
@@ -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 (file)
index 0000000..91193af
--- /dev/null
@@ -0,0 +1,116 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Self enrol external PHPunit tests
+ *
+ * @package   enrol_guest
+ * @copyright 2015 Juan Leyva <juan@moodle.com>
+ * @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 <juan@moodle.com>
+ * @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']);
+    }
+}
index d916ed6..5076e7b 100644 (file)
@@ -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)
index 3cf83c7..1c9a30c 100644 (file)
@@ -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',
index acd1dd7..42cced8 100644 (file)
@@ -29,7 +29,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$version  = 2015122100.00;              // YYYYMMDD      = weekly release date of this DEV branch.
+$version  = 2015122100.01;              // YYYYMMDD      = weekly release date of this DEV branch.
                                         //         RR    = release increments - 00 in DEV branches.
                                         //           .XX = incremental changes.