MDL-59369 enrol: New ws core_enrol_external::edit_user_enrolment
authorJun Pataleta <jun@moodle.com>
Thu, 13 Jul 2017 02:28:02 +0000 (10:28 +0800)
committerJun Pataleta <jun@moodle.com>
Wed, 26 Jul 2017 01:43:16 +0000 (09:43 +0800)
enrol/externallib.php
enrol/tests/externallib_test.php
lib/db/services.php
version.php

index f824422..370141a 100644 (file)
@@ -805,6 +805,107 @@ class core_enrol_external extends external_api {
             )
         );
     }
+
+    /**
+     * Returns description of edit_user_enrolment() parameters
+     *
+     * @return external_function_parameters
+     */
+    public static function edit_user_enrolment_parameters() {
+        return new external_function_parameters(
+            array(
+                'courseid' => new external_value(PARAM_INT, 'User enrolment ID'),
+                'ueid' => new external_value(PARAM_INT, 'User enrolment ID'),
+                'status' => new external_value(PARAM_INT, 'Enrolment status'),
+                'timestart' => new external_value(PARAM_INT, 'Enrolment start timestamp', VALUE_DEFAULT, 0),
+                'timeend' => new external_value(PARAM_INT, 'Enrolment end timestamp', VALUE_DEFAULT, 0),
+            )
+        );
+    }
+
+    /**
+     * External function that updates a given user enrolment.
+     *
+     * @param int $courseid The course ID.
+     * @param int $ueid The user enrolment ID.
+     * @param int $status The enrolment status.
+     * @param int $timestart Enrolment start timestamp.
+     * @param int $timeend Enrolment end timestamp.
+     * @return array An array consisting of the processing result, errors and form output, if available.
+     */
+    public static function edit_user_enrolment($courseid, $ueid, $status, $timestart = 0, $timeend = 0) {
+        global $CFG, $DB, $PAGE;
+
+        $params = self::validate_parameters(self::edit_user_enrolment_parameters(), [
+            'courseid' => $courseid,
+            'ueid' => $ueid,
+            'status' => $status,
+            'timestart' => $timestart,
+            'timeend' => $timeend,
+        ]);
+
+        $course = get_course($courseid);
+        $context = context_course::instance($course->id);
+        self::validate_context($context);
+
+        $userenrolment = $DB->get_record('user_enrolments', ['id' => $params['ueid']], '*', MUST_EXIST);
+        $userenroldata = [
+            'status' => $params['status'],
+            'timestart' => $params['timestart'],
+            'timeend' => $params['timeend'],
+        ];
+
+        $result = false;
+        $errors = [];
+
+        // Validate data against the edit user enrolment form.
+        require_once("$CFG->dirroot/enrol/editenrolment_form.php");
+        $customformdata = [
+            'ue' => $userenrolment,
+            'modal' => true,
+        ];
+        $mform = new \enrol_user_enrolment_form(null, $customformdata, 'post', '', null, true, $userenroldata);
+        $mform->set_data($userenroldata);
+        $validationerrors = $mform->validation($userenroldata, null);
+        if (empty($validationerrors)) {
+            require_once($CFG->dirroot . '/enrol/locallib.php');
+            $manager = new course_enrolment_manager($PAGE, $course);
+            $result = $manager->edit_enrolment($userenrolment, (object)$userenroldata);
+        } else {
+            foreach ($validationerrors as $key => $errormessage) {
+                $errors[] = (object)[
+                    'key' => $key,
+                    'message' => $errormessage
+                ];
+            }
+        }
+
+        return [
+            'result' => $result,
+            'errors' => $errors,
+        ];
+    }
+
+    /**
+     * Returns description of edit_user_enrolment() result value
+     *
+     * @return external_description
+     */
+    public static function edit_user_enrolment_returns() {
+        return new external_single_structure(
+            array(
+                'result' => new external_value(PARAM_BOOL, 'True if the user\'s enrolment was successfully updated'),
+                'errors' => new external_multiple_structure(
+                    new external_single_structure(
+                        array(
+                            'key' => new external_value(PARAM_TEXT, 'The data that failed the validation'),
+                            'message' => new external_value(PARAM_TEXT, 'The error message'),
+                        )
+                    ), 'List of validation errors'
+                ),
+            )
+        );
+    }
 }
 
 /**
index b3e061d..8b787a1 100644 (file)
@@ -682,4 +682,86 @@ class core_enrol_externallib_testcase extends externallib_advanced_testcase {
         $this->assertEquals($data->student1->id, $expecteduser['id']);
     }
 
+    /**
+     * Test for core_enrol_external::edit_user_enrolment().
+     */
+    public function test_edit_user_enrolment() {
+        global $DB;
+
+        $this->resetAfterTest(true);
+        $datagen = $this->getDataGenerator();
+
+        /** @var enrol_manual_plugin $manualplugin */
+        $manualplugin = enrol_get_plugin('manual');
+        $this->assertNotNull($manualplugin);
+
+        $studentroleid = $DB->get_field('role', 'id', ['shortname' => 'student'], MUST_EXIST);
+        $teacherroleid = $DB->get_field('role', 'id', ['shortname' => 'editingteacher'], MUST_EXIST);
+        $course = $datagen->create_course();
+        $user = $datagen->create_user();
+        $teacher = $datagen->create_user();
+
+        $instanceid = null;
+        $instances = enrol_get_instances($course->id, true);
+        foreach ($instances as $inst) {
+            if ($inst->enrol == 'manual') {
+                $instanceid = (int)$inst->id;
+                break;
+            }
+        }
+        if (empty($instanceid)) {
+            $instanceid = $manualplugin->add_default_instance($course);
+            if (empty($instanceid)) {
+                $instanceid = $manualplugin->add_instance($course);
+            }
+        }
+        $this->assertNotNull($instanceid);
+
+        $instance = $DB->get_record('enrol', ['id' => $instanceid], '*', MUST_EXIST);
+        $manualplugin->enrol_user($instance, $user->id, $studentroleid, 0, 0, ENROL_USER_ACTIVE);
+        $manualplugin->enrol_user($instance, $teacher->id, $teacherroleid, 0, 0, ENROL_USER_ACTIVE);
+        $ueid = (int)$DB->get_field(
+            'user_enrolments',
+            'id',
+            ['enrolid' => $instance->id, 'userid' => $user->id],
+            MUST_EXIST
+        );
+
+        // Login as teacher.
+        $this->setUser($teacher);
+
+        $now = new DateTime();
+        $nowtime = $now->getTimestamp();
+
+        // Invalid data.
+        $data = core_enrol_external::edit_user_enrolment($course->id, $ueid, ENROL_USER_ACTIVE, $nowtime, $nowtime);
+        $data = external_api::clean_returnvalue(core_enrol_external::edit_user_enrolment_returns(), $data);
+        $this->assertFalse($data['result']);
+        $this->assertNotEmpty($data['errors']);
+
+        // Valid data.
+        $nextmonth = clone($now);
+        $nextmonth->add(new DateInterval('P1M'));
+        $nextmonthtime = $nextmonth->getTimestamp();
+        $data = core_enrol_external::edit_user_enrolment($course->id, $ueid, ENROL_USER_ACTIVE, $nowtime, $nextmonthtime);
+        $data = external_api::clean_returnvalue(core_enrol_external::edit_user_enrolment_returns(), $data);
+        $this->assertTrue($data['result']);
+        $this->assertEmpty($data['errors']);
+
+        // Check updated user enrolment.
+        $ue = $DB->get_record('user_enrolments', ['id' => $ueid], '*', MUST_EXIST);
+        $this->assertEquals(ENROL_USER_ACTIVE, $ue->status);
+        $this->assertEquals($nowtime, $ue->timestart);
+        $this->assertEquals($nextmonthtime, $ue->timeend);
+
+        // Suspend user.
+        $data = core_enrol_external::edit_user_enrolment($course->id, $ueid, ENROL_USER_SUSPENDED);
+        $data = external_api::clean_returnvalue(core_enrol_external::edit_user_enrolment_returns(), $data);
+        $this->assertTrue($data['result']);
+        $this->assertEmpty($data['errors']);
+
+        // Check updated user enrolment.
+        $ue = $DB->get_record('user_enrolments', ['id' => $ueid], '*', MUST_EXIST);
+        $this->assertEquals(ENROL_USER_SUSPENDED, $ue->status);
+    }
 }
index d483578..14385ae 100644 (file)
@@ -482,6 +482,14 @@ $functions = array(
         'capabilities' => 'moodle/course:viewparticipants',
         'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
     ),
+    'core_enrol_edit_user_enrolment' => array(
+        'classname' => 'core_enrol_external',
+        'methodname' => 'edit_user_enrolment',
+        'classpath' => 'enrol/externallib.php',
+        'description' => 'External function that updates a given user enrolment',
+        'type' => 'write',
+        'ajax' => true,
+    ),
     'core_fetch_notifications' => array(
         'classname' => 'core_external',
         'methodname' => 'fetch_notifications',
index 7e84112..75a5d7f 100644 (file)
@@ -29,7 +29,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$version  = 2017072500.00;              // YYYYMMDD      = weekly release date of this DEV branch.
+$version  = 2017072600.00;              // YYYYMMDD      = weekly release date of this DEV branch.
                                         //         RR    = release increments - 00 in DEV branches.
                                         //           .XX = incremental changes.