mirror of
https://github.com/moodle/moodle.git
synced 2025-04-21 08:22:07 +02:00
MDL-32941 Implement core_course_update_categories, add webform and unittests
Conflicts: admin/webservice/testclient_forms.php course/externallib.php lib/db/services.php
This commit is contained in:
parent
6c6ec1d6b7
commit
f2229c6895
@ -878,3 +878,92 @@ class core_course_delete_categories_form extends moodleform {
|
||||
return $params;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Form class for create_categories() web service function test.
|
||||
*/
|
||||
class core_course_update_categories_form extends moodleform {
|
||||
/**
|
||||
* The form definition.
|
||||
*/
|
||||
public function definition() {
|
||||
global $CFG;
|
||||
|
||||
$mform = $this->_form;
|
||||
|
||||
$mform->addElement('header', 'wstestclienthdr', get_string('testclient', 'webservice'));
|
||||
|
||||
// Note: these values are intentionally PARAM_RAW - we want users to test any rubbish as parameters.
|
||||
$data = $this->_customdata;
|
||||
if ($data['authmethod'] == 'simple') {
|
||||
$mform->addElement('text', 'wsusername', 'wsusername');
|
||||
$mform->addElement('text', 'wspassword', 'wspassword');
|
||||
} else if ($data['authmethod'] == 'token') {
|
||||
$mform->addElement('text', 'token', 'token');
|
||||
}
|
||||
|
||||
$mform->addElement('hidden', 'authmethod', $data['authmethod']);
|
||||
$mform->setType('authmethod', PARAM_SAFEDIR);
|
||||
$mform->addElement('text', 'id[0]', 'id[0]');
|
||||
$mform->addElement('text', 'name[0]', 'name[0]');
|
||||
$mform->addElement('text', 'parent[0]', 'parent[0]');
|
||||
$mform->addElement('text', 'idnumber[0]', 'idnumber[0]');
|
||||
$mform->addElement('text', 'description[0]', 'description[0]');
|
||||
$mform->addElement('text', 'id[1]', 'id[1]');
|
||||
$mform->addElement('text', 'name[1]', 'name[1]');
|
||||
$mform->addElement('text', 'parent[1]', 'parent[1]');
|
||||
$mform->addElement('text', 'idnumber[1]', 'idnumber[1]');
|
||||
$mform->addElement('text', 'description[1]', 'description[1]');
|
||||
|
||||
$mform->addElement('hidden', 'function');
|
||||
$mform->setType('function', PARAM_SAFEDIR);
|
||||
|
||||
$mform->addElement('hidden', 'protocol');
|
||||
$mform->setType('protocol', PARAM_SAFEDIR);
|
||||
|
||||
$this->add_action_buttons(true, get_string('execute', 'webservice'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the parameters that the user submitted using the form.
|
||||
* @return array|null
|
||||
*/
|
||||
public function get_params() {
|
||||
if (!$data = $this->get_data()) {
|
||||
return null;
|
||||
}
|
||||
// Remove unused from form data.
|
||||
unset($data->submitbutton);
|
||||
unset($data->protocol);
|
||||
unset($data->function);
|
||||
unset($data->wsusername);
|
||||
unset($data->wspassword);
|
||||
unset($data->token);
|
||||
unset($data->authmethod);
|
||||
|
||||
$params = array();
|
||||
$params['categories'] = array();
|
||||
for ($i=0; $i<10; $i++) {
|
||||
|
||||
if (empty($data->id[$i])) {
|
||||
continue;
|
||||
}
|
||||
$attrs = array();
|
||||
$attrs['id'] = $data->id[$i];
|
||||
if (!empty($data->name[$i])) {
|
||||
$attrs['name'] = $data->name[$i];
|
||||
}
|
||||
if (!empty($data->parent[$i])) {
|
||||
$attrs['parent'] = $data->parent[$i];
|
||||
}
|
||||
if (!empty($data->idnumber[$i])) {
|
||||
$attrs['idnumber'] = $data->idnumber[$i];
|
||||
}
|
||||
if (!empty($data->description[$i])) {
|
||||
$attrs['description'] = $data->description[$i];
|
||||
}
|
||||
$params['categories'][] = $attrs;
|
||||
}
|
||||
return $params;
|
||||
}
|
||||
}
|
@ -1140,6 +1140,100 @@ class core_course_external extends external_api {
|
||||
public static function delete_categories_returns() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of method parameters
|
||||
* @return external_function_parameters
|
||||
* @since Moodle 2.3
|
||||
*/
|
||||
public static function update_categories_parameters() {
|
||||
return new external_function_parameters(
|
||||
array(
|
||||
'categories' => new external_multiple_structure(
|
||||
new external_single_structure(
|
||||
array(
|
||||
'id' => new external_value(PARAM_INT, 'course id'),
|
||||
'name' => new external_value(PARAM_TEXT, 'category name', VALUE_OPTIONAL),
|
||||
'idnumber' => new external_value(PARAM_RAW, 'category id number', VALUE_OPTIONAL),
|
||||
'parent' => new external_value(PARAM_INT, 'parent category id', VALUE_OPTIONAL),
|
||||
'description' => new external_value(PARAM_RAW, 'category description', VALUE_OPTIONAL),
|
||||
'theme' => new external_value(PARAM_THEME,
|
||||
'the category theme. This option must be enabled on moodle', VALUE_OPTIONAL),
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update categories
|
||||
* @param array $categories The list of categories to update
|
||||
* @return null
|
||||
* @since Moodle 2.3
|
||||
*/
|
||||
public static function update_categories($categories) {
|
||||
global $CFG, $DB;
|
||||
require_once($CFG->dirroot . "/course/lib.php");
|
||||
|
||||
// Validate parameters.
|
||||
$params = self::validate_parameters(self::update_categories_parameters(), array('categories' => $categories));
|
||||
|
||||
$transaction = $DB->start_delegated_transaction();
|
||||
|
||||
foreach ($params['categories'] as $cat) {
|
||||
if (!$category = $DB->get_record('course_categories', array('id' => $cat['id']))) {
|
||||
throw new moodle_exception('unknowcategory');
|
||||
}
|
||||
|
||||
$categorycontext = context_coursecat::instance($cat['id']);
|
||||
self::validate_context($categorycontext);
|
||||
require_capability('moodle/category:manage', $categorycontext);
|
||||
|
||||
if (!empty($cat['name'])) {
|
||||
if (textlib::strlen($cat['name'])>30) {
|
||||
throw new moodle_exception('categorytoolong');
|
||||
}
|
||||
$category->name = $cat['name'];
|
||||
}
|
||||
if (!empty($cat['idnumber'])) {
|
||||
if (textlib::strlen($cat['idnumber'])>100) {
|
||||
throw new moodle_exception('idnumbertoolong');
|
||||
}
|
||||
$category->idnumber = $cat['idnumber'];
|
||||
}
|
||||
if (!empty($cat['description'])) {
|
||||
$category->description = $cat['description'];
|
||||
$category->descriptionformat = FORMAT_HTML;
|
||||
}
|
||||
if (!empty($cat['theme'])) {
|
||||
$category->theme = $cat['theme'];
|
||||
}
|
||||
if (!empty($cat['parent']) && ($category->parent != $cat['parent'])) {
|
||||
// First check if parent exists.
|
||||
if (!$parent_cat = $DB->get_record('course_categories', array('id' => $cat['parent']))) {
|
||||
throw new moodle_exception('unknowcategory');
|
||||
}
|
||||
// Then check if we have capability.
|
||||
self::validate_context(get_category_or_system_context((int)$cat['parent']));
|
||||
require_capability('moodle/category:manage', get_category_or_system_context((int)$cat['parent']));
|
||||
// Finally move the category.
|
||||
move_category($category, $parent_cat);
|
||||
$category->parent = $cat['parent'];
|
||||
}
|
||||
$DB->update_record('course_categories', $category);
|
||||
}
|
||||
|
||||
$transaction->allow_commit();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of method result value
|
||||
* @return external_description
|
||||
*/
|
||||
public static function update_categories_returns() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -386,6 +386,15 @@ $functions = array(
|
||||
'capabilities'=> 'moodle/category:viewhiddencategories',
|
||||
),
|
||||
|
||||
'core_course_update_categories' => array(
|
||||
'classname' => 'core_course_external',
|
||||
'methodname' => 'update_categories',
|
||||
'classpath' => 'course/externallib.php',
|
||||
'description' => 'Update categories',
|
||||
'type' => 'write',
|
||||
'capabilities'=> 'moodle:category/manage',
|
||||
),
|
||||
|
||||
'moodle_course_get_courses' => array(
|
||||
'classname' => 'core_course_external',
|
||||
'methodname' => 'get_courses',
|
||||
|
Loading…
x
Reference in New Issue
Block a user