Merge branch 'MDL-66489-master' of git://github.com/rezaies/moodle
authorAndrew Nicols <andrew@nicols.co.uk>
Wed, 11 Sep 2019 23:05:50 +0000 (07:05 +0800)
committerAndrew Nicols <andrew@nicols.co.uk>
Wed, 11 Sep 2019 23:05:50 +0000 (07:05 +0800)
enrol/editenrolment.php
enrol/externallib.php
enrol/tests/externallib_test.php
lib/db/services.php
lib/upgrade.txt
user/amd/build/status_field.min.js
user/amd/build/status_field.min.js.map
user/amd/src/status_field.js
version.php

index 8c358b2..fb8b740 100644 (file)
@@ -87,7 +87,7 @@ if ($mform->is_cancelled()) {
     redirect($returnurl);
 
 } else if ($data = $mform->get_data()) {
-    if ($data->duration && $data->timeend == 0) {
+    if (!empty($data->duration) && $data->timeend == 0) {
         $data->timeend = $data->timestart + $data->duration;
     }
     if ($manager->edit_enrolment($ue, $data)) {
index 593541e..9bf1e5d 100644 (file)
@@ -919,6 +919,7 @@ class core_enrol_external extends external_api {
     /**
      * Returns description of edit_user_enrolment() parameters
      *
+     * @deprecated since 3.8
      * @return external_function_parameters
      */
     public static function edit_user_enrolment_parameters() {
@@ -936,6 +937,7 @@ class core_enrol_external extends external_api {
     /**
      * External function that updates a given user enrolment.
      *
+     * @deprecated since 3.8
      * @param int $courseid The course ID.
      * @param int $ueid The user enrolment ID.
      * @param int $status The enrolment status.
@@ -1002,6 +1004,7 @@ class core_enrol_external extends external_api {
     /**
      * Returns description of edit_user_enrolment() result value
      *
+     * @deprecated since 3.8
      * @return external_description
      */
     public static function edit_user_enrolment_returns() {
@@ -1020,6 +1023,82 @@ class core_enrol_external extends external_api {
         );
     }
 
+    /**
+     * Mark the edit_user_enrolment web service as deprecated.
+     *
+     * @return  bool
+     */
+    public static function edit_user_enrolment_is_deprecated() {
+        return true;
+    }
+
+    /**
+     * Returns description of submit_user_enrolment_form parameters.
+     *
+     * @return external_function_parameters.
+     */
+    public static function submit_user_enrolment_form_parameters() {
+        return new external_function_parameters([
+            'formdata' => new external_value(PARAM_RAW, 'The data from the event form'),
+        ]);
+    }
+
+    /**
+     * External function that handles the user enrolment form submission.
+     *
+     * @param string $formdata The user enrolment form data in s URI encoded param string
+     * @return array An array consisting of the processing result and error flag, if available
+     */
+    public static function submit_user_enrolment_form($formdata) {
+        global $CFG, $DB, $PAGE;
+
+        // Parameter validation.
+        $params = self::validate_parameters(self::submit_user_enrolment_form_parameters(), ['formdata' => $formdata]);
+
+        $data = [];
+        parse_str($params['formdata'], $data);
+
+        $userenrolment = $DB->get_record('user_enrolments', ['id' => $data['ue']], '*', MUST_EXIST);
+        $instance = $DB->get_record('enrol', ['id' => $userenrolment->enrolid], '*', MUST_EXIST);
+        $plugin = enrol_get_plugin($instance->enrol);
+        $course = get_course($instance->courseid);
+        $context = context_course::instance($course->id);
+        self::validate_context($context);
+
+        require_once("$CFG->dirroot/enrol/editenrolment_form.php");
+        $customformdata = [
+            'ue' => $userenrolment,
+            'modal' => true,
+            'enrolinstancename' => $plugin->get_instance_name($instance)
+        ];
+        $mform = new enrol_user_enrolment_form(null, $customformdata, 'post', '', null, true, $data);
+
+        if ($validateddata = $mform->get_data()) {
+            if (!empty($validateddata->duration) && $validateddata->timeend == 0) {
+                $validateddata->timeend = $validateddata->timestart + $validateddata->duration;
+            }
+            require_once($CFG->dirroot . '/enrol/locallib.php');
+            $manager = new course_enrolment_manager($PAGE, $course);
+            $result = $manager->edit_enrolment($userenrolment, $validateddata);
+
+            return ['result' => $result];
+        } else {
+            return ['result' => false, 'validationerror' => true];
+        }
+    }
+
+    /**
+     * Returns description of submit_user_enrolment_form() result value
+     *
+     * @return external_description
+     */
+    public static function submit_user_enrolment_form_returns() {
+        return new external_single_structure([
+            'result' => new external_value(PARAM_BOOL, 'True if the user\'s enrolment was successfully updated'),
+            'validationerror' => new external_value(PARAM_BOOL, 'Indicates invalid form data', VALUE_DEFAULT, false),
+        ]);
+    }
+
     /**
      * Returns description of unenrol_user_enrolment() parameters
      *
index da07c87..8ae3b1b 100644 (file)
@@ -958,6 +958,155 @@ class core_enrol_externallib_testcase extends externallib_advanced_testcase {
         $this->assertEquals(ENROL_USER_SUSPENDED, $ue->status);
     }
 
+    /**
+     * dataProvider for test_submit_user_enrolment_form().
+     */
+    public function submit_user_enrolment_form_provider() {
+        $now = new DateTime();
+
+        $nextmonth = clone($now);
+        $nextmonth->add(new DateInterval('P1M'));
+
+        return [
+            'Invalid data' => [
+                'customdata' => [
+                    'status' => ENROL_USER_ACTIVE,
+                    'timestart' => [
+                        'day' => $now->format('j'),
+                        'month' => $now->format('n'),
+                        'year' => $now->format('Y'),
+                        'hour' => $now->format('G'),
+                        'minute' => 0,
+                        'enabled' => 1,
+                    ],
+                    'timeend' => [
+                        'day' => $now->format('j'),
+                        'month' => $now->format('n'),
+                        'year' => $now->format('Y'),
+                        'hour' => $now->format('G'),
+                        'minute' => 0,
+                        'enabled' => 1,
+                    ],
+                ],
+                'expectedresult' => false,
+                'validationerror' => true,
+            ],
+            'Valid data' => [
+                'customdata' => [
+                    'status' => ENROL_USER_ACTIVE,
+                    'timestart' => [
+                        'day' => $now->format('j'),
+                        'month' => $now->format('n'),
+                        'year' => $now->format('Y'),
+                        'hour' => $now->format('G'),
+                        'minute' => 0,
+                        'enabled' => 1,
+                    ],
+                    'timeend' => [
+                        'day' => $nextmonth->format('j'),
+                        'month' => $nextmonth->format('n'),
+                        'year' => $nextmonth->format('Y'),
+                        'hour' => $nextmonth->format('G'),
+                        'minute' => 0,
+                        'enabled' => 1,
+                    ],
+                ],
+                'expectedresult' => true,
+                'validationerror' => false
+            ],
+            'Suspend user' => [
+                'customdata' => [
+                    'status' => ENROL_USER_SUSPENDED,
+                ],
+                'expectedresult' => true,
+                'validationerror' => false
+            ],
+        ];
+    }
+
+    /**
+     * @param array $customdata The data we are providing to the webservice.
+     * @param bool $expectedresult The result we are expecting to receive from the webservice.
+     * @param bool $validationerror The validationerror we are expecting to receive from the webservice.
+     * @dataProvider submit_user_enrolment_form_provider
+     */
+    public function test_submit_user_enrolment_form($customdata, $expectedresult, $validationerror) {
+        global $CFG, $DB;
+
+        $this->resetAfterTest(true);
+        $datagen = $this->getDataGenerator();
+
+        /** @var enrol_manual_plugin $manualplugin */
+        $manualplugin = enrol_get_plugin('manual');
+
+        $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.
+        $teacher->ignoresesskey = true;
+        $this->setUser($teacher);
+
+        $formdata = [
+            'ue'        => $ueid,
+            'ifilter'   => 0,
+            'status'    => null,
+            'timestart' => null,
+            'duration'  => null,
+            'timeend'   => null,
+        ];
+
+        $formdata = array_merge($formdata, $customdata);
+
+        require_once("$CFG->dirroot/enrol/editenrolment_form.php");
+        $formdata = enrol_user_enrolment_form::mock_generate_submit_keys($formdata);
+
+        $querystring = http_build_query($formdata, '', '&');
+
+        $result = external_api::clean_returnvalue(
+                core_enrol_external::submit_user_enrolment_form_returns(),
+                core_enrol_external::submit_user_enrolment_form($querystring)
+        );
+
+        $this->assertEquals(
+                ['result' => $expectedresult, 'validationerror' => $validationerror],
+                $result,
+                '', 0.0, 10, true);
+
+        if ($result['result']) {
+            $ue = $DB->get_record('user_enrolments', ['id' => $ueid], '*', MUST_EXIST);
+            $this->assertEquals($formdata['status'], $ue->status);
+        }
+    }
+
     /**
      * Test for core_enrol_external::unenrol_user_enrolment().
      */
index d1dec99..62b74b1 100644 (file)
@@ -647,7 +647,16 @@ $functions = array(
         'classname' => 'core_enrol_external',
         'methodname' => 'edit_user_enrolment',
         'classpath' => 'enrol/externallib.php',
-        'description' => 'External function that updates a given user enrolment',
+        'description' => '** DEPRECATED ** Please do not call this function any more.
+                          External function that updates a given user enrolment',
+        'type' => 'write',
+        'ajax' => true,
+    ),
+    'core_enrol_submit_user_enrolment_form' => array(
+        'classname' => 'core_enrol_external',
+        'methodname' => 'submit_user_enrolment_form',
+        'classpath' => 'enrol/externallib.php',
+        'description' => 'Submit form data for enrolment form',
         'type' => 'write',
         'ajax' => true,
     ),
index 7a9f03a..b9360ca 100644 (file)
@@ -64,6 +64,7 @@ validation against and defaults to null (so, no user needed) if not provided.
 * A new setting 'Cache templates' was added (see MDL-66367). This setting determines if templates are cached or not.
   This setting can be set via the UI or by defining $CFG->cachetemplates in your config.php file. It is a boolean
   and should be set to either false or true. Developers will probably want to set this to false.
+* The core_enrol_edit_user_enrolment webservice has been deprecated. Please use core_enrol_submit_user_enrolment_form instead.
 
 === 3.7 ===
 
index faeb294..7a8a14c 100644 (file)
Binary files a/user/amd/build/status_field.min.js and b/user/amd/build/status_field.min.js differ
index e0fe66a..5dd1fb9 100644 (file)
Binary files a/user/amd/build/status_field.min.js.map and b/user/amd/build/status_field.min.js.map differ
index 438941b..c03d9de 100644 (file)
@@ -261,48 +261,12 @@ define(['core/templates',
 
             // User enrolment ID.
             var ueid = $(form).find('[name="ue"]').val();
-            // Status.
-            var status = $(form).find('[name="status"]').val();
-
-            var params = {
-                'courseid': this.courseid,
-                'ueid': ueid,
-                'status': status
-            };
-
-            // Enrol time start.
-            var timeStartEnabled = $(form).find('[name="timestart[enabled]"]');
-            if (timeStartEnabled.is(':checked')) {
-                var timeStartYear = $(form).find('[name="timestart[year]"]').val();
-                var timeStartMonth = $(form).find('[name="timestart[month]"]').val() - 1;
-                var timeStartDay = $(form).find('[name="timestart[day]"]').val();
-                var timeStartHour = $(form).find('[name="timestart[hour]"]').val();
-                var timeStartMinute = $(form).find('[name="timestart[minute]"]').val();
-                var timeStart = new Date(timeStartYear, timeStartMonth, timeStartDay, timeStartHour, timeStartMinute);
-                params.timestart = timeStart.getTime() / 1000;
-            }
-
-            // Enrol time end.
-            var timeEndEnabled = $(form).find('[name="timeend[enabled]"]');
-            if (timeEndEnabled.is(':checked')) {
-                var timeEndYear = $(form).find('[name="timeend[year]"]').val();
-                var timeEndMonth = $(form).find('[name="timeend[month]"]').val() - 1;
-                var timeEndDay = $(form).find('[name="timeend[day]"]').val();
-                var timeEndHour = $(form).find('[name="timeend[hour]"]').val();
-                var timeEndMinute = $(form).find('[name="timeend[minute]"]').val();
-                var timeEnd = new Date(timeEndYear, timeEndMonth, timeEndDay, timeEndHour, timeEndMinute);
-                params.timeend = timeEnd.getTime() / 1000;
-            }
-
-            // Enrol duration.
-            var enrolDuration = $(form).find('[name="duration"]');
-            if (enrolDuration.is(':enabled')) {
-                params.timeend = params.timestart + parseInt(enrolDuration.val());
-            }
 
             var request = {
-                methodname: 'core_enrol_edit_user_enrolment',
-                args: params
+                methodname: 'core_enrol_submit_user_enrolment_form',
+                args: {
+                    formdata: form.serialize()
+                }
             };
 
             Ajax.call([request])[0].done(function(data) {
@@ -323,7 +287,7 @@ define(['core/templates',
             }).fail(Notification.exception);
         };
 
-         /**
+        /**
          * Private method
          *
          * @method submitUnenrolFormAjax
index 0768951..55e99ca 100644 (file)
@@ -29,7 +29,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$version  = 2019090500.01;              // YYYYMMDD      = weekly release date of this DEV branch.
+$version  = 2019090500.02;              // YYYYMMDD      = weekly release date of this DEV branch.
                                         //         RR    = release increments - 00 in DEV branches.
                                         //           .XX = incremental changes.