MDL-59369 enrol: New ws core_enrol_external::edit_user_enrolment

This commit is contained in:
Jun Pataleta
2017-07-26 09:43:16 +08:00
parent fb7929677a
commit 58c20c8108
4 changed files with 192 additions and 1 deletions
+101
View 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'
),
)
);
}
}
/**
+82
View 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);
}
}
+8
View 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',
+1 -1
View 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.