Merge branch 'MDL-29472_m' of git://github.com/andreabix/moodle
This commit is contained in:
Executable
+613
@@ -0,0 +1,613 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* External cohort API
|
||||
*
|
||||
* @package core_cohort
|
||||
* @category external
|
||||
* @copyright MediaTouch 2000 srl
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
require_once("$CFG->libdir/externallib.php");
|
||||
|
||||
class core_cohort_external extends external_api {
|
||||
|
||||
/**
|
||||
* Returns description of method parameters
|
||||
*
|
||||
* @return external_function_parameters
|
||||
* @since Moodle 2.4
|
||||
*/
|
||||
public static function create_cohorts_parameters() {
|
||||
return new external_function_parameters(
|
||||
array(
|
||||
'cohorts' => new external_multiple_structure(
|
||||
new external_single_structure(
|
||||
array(
|
||||
'categorytype' => new external_single_structure(
|
||||
array(
|
||||
'type' => new external_value(PARAM_TEXT, 'the name of the field: id (numeric value
|
||||
of course category id) or idnumber (alphanumeric value of idnumber course category)'),
|
||||
'value' => new external_value(PARAM_RAW, 'the value of the categorytype')
|
||||
)
|
||||
),
|
||||
'name' => new external_value(PARAM_RAW, 'cohort name'),
|
||||
'idnumber' => new external_value(PARAM_RAW, 'cohort idnumber'),
|
||||
'description' => new external_value(PARAM_RAW, 'cohort description', VALUE_OPTIONAL),
|
||||
'descriptionformat' => new external_format_value('description', VALUE_DEFAULT),
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create one or more cohorts
|
||||
*
|
||||
* @param array $cohorts An array of cohorts to create.
|
||||
* @return array An array of arrays
|
||||
* @since Moodle 2.4
|
||||
*/
|
||||
public static function create_cohorts($cohorts) {
|
||||
global $CFG, $DB;
|
||||
require_once("$CFG->dirroot/cohort/lib.php");
|
||||
|
||||
$params = self::validate_parameters(self::create_cohorts_parameters(), array('cohorts' => $cohorts));
|
||||
|
||||
$transaction = $DB->start_delegated_transaction();
|
||||
|
||||
$cohortids = array();
|
||||
|
||||
foreach ($params['cohorts'] as $cohort) {
|
||||
$cohort = (object)$cohort;
|
||||
|
||||
// Category type (context id).
|
||||
$categorytype = $cohort->categorytype;
|
||||
if ($catid = $DB->get_field('course_categories', 'id', array($categorytype['type'] => $categorytype['value']))) {
|
||||
$cohort->contextid = $DB->get_field('context', 'id', array('instanceid' => $catid,
|
||||
'contextlevel' => CONTEXT_COURSECAT));
|
||||
} else {
|
||||
throw new invalid_parameter_exception('category not exists: category '
|
||||
.$categorytype['type'].' = '.$categorytype['value']);
|
||||
}
|
||||
// Make sure that the idnumber doesn't already exist.
|
||||
if ($DB->record_exists('cohort', array('idnumber' => $cohort->idnumber))) {
|
||||
throw new invalid_parameter_exception('record already exists: idnumber='.$cohort->idnumber);
|
||||
}
|
||||
$context = context::instance_by_id($cohort->contextid, MUST_EXIST);
|
||||
if ($context->contextlevel != CONTEXT_COURSECAT and $context->contextlevel != CONTEXT_SYSTEM) {
|
||||
throw new invalid_parameter_exception('Invalid context');
|
||||
}
|
||||
self::validate_context($context);
|
||||
require_capability('moodle/cohort:manage', $context);
|
||||
|
||||
// Validate format.
|
||||
$cohort->descriptionformat = external_validate_format($cohort->descriptionformat);
|
||||
$cohort->id = cohort_add_cohort($cohort);
|
||||
|
||||
list($cohort->description, $cohort->descriptionformat) =
|
||||
external_format_text($cohort->description, $cohort->descriptionformat,
|
||||
$context->id, 'cohort', 'description', $cohort->id);
|
||||
$cohortids[] = (array)$cohort;;
|
||||
}
|
||||
$transaction->allow_commit();
|
||||
|
||||
return $cohortids;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of method result value
|
||||
*
|
||||
* @return external_description
|
||||
* @since Moodle 2.4
|
||||
*/
|
||||
public static function create_cohorts_returns() {
|
||||
return new external_multiple_structure(
|
||||
new external_single_structure(
|
||||
array(
|
||||
'id' => new external_value(PARAM_INT, 'cohort id'),
|
||||
'name' => new external_value(PARAM_RAW, 'cohort name'),
|
||||
'idnumber' => new external_value(PARAM_RAW, 'cohort idnumber'),
|
||||
'description' => new external_value(PARAM_RAW, 'cohort description'),
|
||||
'descriptionformat' => new external_format_value('description'),
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of method parameters
|
||||
*
|
||||
* @return external_function_parameters
|
||||
* @since Moodle 2.4
|
||||
*/
|
||||
public static function delete_cohorts_parameters() {
|
||||
return new external_function_parameters(
|
||||
array(
|
||||
'cohortids' => new external_multiple_structure(new external_value(PARAM_INT, 'cohort ID')),
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete cohorts
|
||||
*
|
||||
* @param array $cohortids
|
||||
* @return null
|
||||
* @since Moodle 2.4
|
||||
*/
|
||||
public static function delete_cohorts($cohortids) {
|
||||
global $CFG, $DB;
|
||||
require_once("$CFG->dirroot/cohort/lib.php");
|
||||
|
||||
$params = self::validate_parameters(self::delete_cohorts_parameters(), array('cohortids' => $cohortids));
|
||||
|
||||
$transaction = $DB->start_delegated_transaction();
|
||||
|
||||
foreach ($params['cohortids'] as $cohortid) {
|
||||
// Validate params.
|
||||
$cohortid = validate_param($cohortid, PARAM_INT);
|
||||
$cohort = $DB->get_record('cohort', array('id' => $cohortid), '*', MUST_EXIST);
|
||||
|
||||
// Now security checks.
|
||||
$context = context::instance_by_id($cohort->contextid, MUST_EXIST);
|
||||
if ($context->contextlevel != CONTEXT_COURSECAT and $context->contextlevel != CONTEXT_SYSTEM) {
|
||||
throw new invalid_parameter_exception('Invalid context');
|
||||
}
|
||||
self::validate_context($context);
|
||||
require_capability('moodle/cohort:manage', $context);
|
||||
cohort_delete_cohort($cohort);
|
||||
}
|
||||
$transaction->allow_commit();
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of method result value
|
||||
*
|
||||
* @return null
|
||||
* @since Moodle 2.4
|
||||
*/
|
||||
public static function delete_cohorts_returns() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of method parameters
|
||||
*
|
||||
* @return external_function_parameters
|
||||
* @since Moodle 2.4
|
||||
*/
|
||||
public static function get_cohorts_parameters() {
|
||||
return new external_function_parameters(
|
||||
array(
|
||||
'cohortids' => new external_multiple_structure(new external_value(PARAM_INT, 'Cohort ID')
|
||||
, 'List of cohort id. A cohort id is an integer.'),
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get cohorts definition specified by ids
|
||||
*
|
||||
* @param array $cohortids array of cohort ids
|
||||
* @return array of cohort objects (id, courseid, name)
|
||||
* @since Moodle 2.4
|
||||
*/
|
||||
public static function get_cohorts($cohortids) {
|
||||
global $DB;
|
||||
|
||||
$params = self::validate_parameters(self::get_cohorts_parameters(), array('cohortids' => $cohortids));
|
||||
|
||||
$cohorts = array();
|
||||
foreach ($params['cohortids'] as $cohortid) {
|
||||
// Validate params.
|
||||
$cohort = $DB->get_record('cohort', array('id' => $cohortid), '*', MUST_EXIST);
|
||||
|
||||
// Now security checks.
|
||||
$context = context::instance_by_id($cohort->contextid, MUST_EXIST);
|
||||
if ($context->contextlevel != CONTEXT_COURSECAT and $context->contextlevel != CONTEXT_SYSTEM) {
|
||||
throw new invalid_parameter_exception('Invalid context');
|
||||
}
|
||||
self::validate_context($context);
|
||||
require_capability('moodle/cohort:view', $context);
|
||||
|
||||
list($cohort->description, $cohort->descriptionformat) =
|
||||
external_format_text($cohort->description, $cohort->descriptionformat,
|
||||
$context->id, 'cohort', 'description', $cohort->id);
|
||||
|
||||
$cohorts[] = (array) $cohort;
|
||||
}
|
||||
|
||||
return $cohorts;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of method result value
|
||||
*
|
||||
* @return external_description
|
||||
* @since Moodle 2.4
|
||||
*/
|
||||
public static function get_cohorts_returns() {
|
||||
return new external_multiple_structure(
|
||||
new external_single_structure(
|
||||
array(
|
||||
'id' => new external_value(PARAM_NUMBER, 'ID of the cohort'),
|
||||
'name' => new external_value(PARAM_RAW, 'cohort name'),
|
||||
'idnumber' => new external_value(PARAM_RAW, 'cohort idnumber'),
|
||||
'description' => new external_value(PARAM_RAW, 'cohort description'),
|
||||
'descriptionformat' => new external_format_value('description'),
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of method parameters
|
||||
*
|
||||
* @return external_function_parameters
|
||||
* @since Moodle 2.4
|
||||
*/
|
||||
public static function update_cohorts_parameters() {
|
||||
return new external_function_parameters(
|
||||
array(
|
||||
'cohorts' => new external_multiple_structure(
|
||||
new external_single_structure(
|
||||
array(
|
||||
'id' => new external_value(PARAM_NUMBER, 'ID of the cohort'),
|
||||
'categorytype' => new external_single_structure(
|
||||
array(
|
||||
'type' => new external_value(PARAM_TEXT, 'the name of the field: id (numeric value
|
||||
of course category id) or idnumber (alphanumeric value of idnumber course category)'),
|
||||
'value' => new external_value(PARAM_RAW, 'the value of the categorytype')
|
||||
)
|
||||
),
|
||||
'name' => new external_value(PARAM_RAW, 'cohort name'),
|
||||
'idnumber' => new external_value(PARAM_RAW, 'cohort idnumber'),
|
||||
'description' => new external_value(PARAM_RAW, 'cohort description', VALUE_OPTIONAL),
|
||||
'descriptionformat' => new external_format_value('description', VALUE_DEFAULT),
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update cohorts
|
||||
*
|
||||
* @param array $cohorts
|
||||
* @return null
|
||||
* @since Moodle 2.4
|
||||
*/
|
||||
public static function update_cohorts($cohorts) {
|
||||
global $CFG, $DB;
|
||||
require_once("$CFG->dirroot/cohort/lib.php");
|
||||
|
||||
$params = self::validate_parameters(self::update_cohorts_parameters(), array('cohorts' => $cohorts));
|
||||
|
||||
$transaction = $DB->start_delegated_transaction();
|
||||
|
||||
foreach ($params['cohorts'] as $cohort) {
|
||||
$cohort = (object) $cohort;
|
||||
|
||||
if (trim($cohort->name) == '') {
|
||||
throw new invalid_parameter_exception('Invalid cohort name');
|
||||
}
|
||||
|
||||
// Category type (context id).
|
||||
$categorytype = $cohort->categorytype;
|
||||
if ($catid = $DB->get_field('course_categories', 'id', array($categorytype['type'] => $categorytype['value']))) {
|
||||
$cohort->contextid = $DB->get_field('context', 'id', array('instanceid' => $catid,
|
||||
'contextlevel' => CONTEXT_COURSECAT));
|
||||
} else {
|
||||
throw new invalid_parameter_exception('category not exists: category='.$categorytype['value']);
|
||||
}
|
||||
|
||||
$context = context::instance_by_id($cohort->contextid, MUST_EXIST);
|
||||
if ($context->contextlevel != CONTEXT_COURSECAT and $context->contextlevel != CONTEXT_SYSTEM) {
|
||||
throw new invalid_parameter_exception('Invalid context');
|
||||
}
|
||||
self::validate_context($context);
|
||||
require_capability('moodle/cohort:manage', $context);
|
||||
|
||||
if (!empty($cohort->description)) {
|
||||
$cohort->descriptionformat = external_validate_format($cohort->descriptionformat);
|
||||
}
|
||||
|
||||
cohort_update_cohort($cohort);
|
||||
}
|
||||
|
||||
$transaction->allow_commit();
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of method result value
|
||||
*
|
||||
* @return null
|
||||
* @since Moodle 2.4
|
||||
*/
|
||||
public static function update_cohorts_returns() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of method parameters
|
||||
*
|
||||
* @return external_function_parameters
|
||||
* @since Moodle 2.4
|
||||
*/
|
||||
public static function add_cohort_members_parameters() {
|
||||
return new external_function_parameters (
|
||||
array(
|
||||
'members' => new external_multiple_structure (
|
||||
new external_single_structure (
|
||||
array (
|
||||
'cohorttype' => new external_single_structure (
|
||||
array(
|
||||
'type' => new external_value(PARAM_ALPHANUMEXT, 'The name of the field: id
|
||||
(numeric value of cohortid) or idnumber (alphanumeric value of idnumber) '),
|
||||
'value' => new external_value(PARAM_RAW, 'The value of the cohort')
|
||||
)
|
||||
),
|
||||
'usertype' => new external_single_structure (
|
||||
array(
|
||||
'type' => new external_value(PARAM_ALPHANUMEXT, 'The name of the field: id
|
||||
(numeric value of id) or username (alphanumeric value of username) '),
|
||||
'value' => new external_value(PARAM_RAW, 'The value of the cohort')
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add cohort members
|
||||
*
|
||||
* @param array $members of arrays with keys userid, cohortid
|
||||
* @since Moodle 2.4
|
||||
*/
|
||||
public static function add_cohort_members($members) {
|
||||
global $CFG, $DB;
|
||||
require_once($CFG->dirroot."/cohort/lib.php");
|
||||
|
||||
$params = self::validate_parameters(self::add_cohort_members_parameters(), array('members' => $members));
|
||||
|
||||
$transaction = $DB->start_delegated_transaction();
|
||||
$warnings = array();
|
||||
foreach ($params['members'] as $member) {
|
||||
// Cohort parameters.
|
||||
$cohorttype = $member['cohorttype'];
|
||||
$cohortparam = array($cohorttype['type'] => $cohorttype['value']);
|
||||
// User parameters.
|
||||
$usertype = $member['usertype'];
|
||||
$userparam = array($usertype['type'] => $usertype['value']);
|
||||
try {
|
||||
// Check parameters.
|
||||
if ($cohorttype['type'] != 'id' && $cohorttype['type'] != 'idnumber') {
|
||||
$warning = array();
|
||||
$warning['warningcode'] = '1';
|
||||
$warning['message'] = 'invalid parameter: cohortype='.$cohorttype['type'];
|
||||
$warnings[] = $warning;
|
||||
continue;
|
||||
}
|
||||
if ($usertype['type'] != 'id' && $usertype['type'] != 'username') {
|
||||
$warning = array();
|
||||
$warning['warningcode'] = '1';
|
||||
$warning['message'] = 'invalid parameter: usertype='.$usertype['type'];
|
||||
$warnings[] = $warning;
|
||||
continue;
|
||||
}
|
||||
// Extract parameters.
|
||||
if (!$cohortid = $DB->get_field('cohort', 'id', $cohortparam)) {
|
||||
$warning = array();
|
||||
$warning['warningcode'] = '2';
|
||||
$warning['message'] = 'cohort '.$cohorttype['type'].'='.$cohorttype['value'].' not exists';
|
||||
$warnings[] = $warning;
|
||||
continue;
|
||||
}
|
||||
if (!$userid = $DB->get_field('user', 'id', array_merge($userparam, array('deleted' => 0,
|
||||
'mnethostid' => $CFG->mnet_localhost_id)))) {
|
||||
$warning = array();
|
||||
$warning['warningcode'] = '2';
|
||||
$warning['message'] = 'user '.$usertype['type'].'='.$usertype['value'].' not exists';
|
||||
$warnings[] = $warning;
|
||||
continue;
|
||||
}
|
||||
if ($DB->record_exists('cohort_members', array('cohortid' => $cohortid, 'userid' => $userid))) {
|
||||
$warning = array();
|
||||
$warning['warningcode'] = '3';
|
||||
$warning['message'] = 'record already exists: cohort('.$cohorttype['type'].'='.$cohorttype['value'].' '.
|
||||
$usertype['type'].'='.$usertype['value'].')';
|
||||
$warnings[] = $warning;
|
||||
continue;
|
||||
}
|
||||
$cohort = $DB->get_record('cohort', array('id'=>$cohortid), '*', MUST_EXIST);
|
||||
$context = context::instance_by_id($cohort->contextid, MUST_EXIST);
|
||||
if ($context->contextlevel != CONTEXT_COURSECAT and $context->contextlevel != CONTEXT_SYSTEM) {
|
||||
$warning = array();
|
||||
$warning['warningcode'] = '1';
|
||||
$warning['message'] = 'Invalid context: '.$context->contextlevel;
|
||||
$warnings[] = $warning;
|
||||
continue;
|
||||
}
|
||||
self::validate_context($context);
|
||||
} catch (Exception $e) {
|
||||
throw new moodle_exception('Error', 'cohort', '', $e->getMessage());
|
||||
}
|
||||
require_capability('moodle/cohort:assign', $context);
|
||||
cohort_add_member($cohortid, $userid);
|
||||
}
|
||||
$transaction->allow_commit();
|
||||
// Return.
|
||||
$result = array();
|
||||
$result['warnings'] = $warnings;
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of method result value
|
||||
*
|
||||
* @return null
|
||||
* @since Moodle 2.4
|
||||
*/
|
||||
public static function add_cohort_members_returns() {
|
||||
return new external_single_structure(
|
||||
array(
|
||||
'warnings' => new external_warnings()
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of method parameters
|
||||
*
|
||||
* @return external_function_parameters
|
||||
* @since Moodle 2.4
|
||||
*/
|
||||
public static function delete_cohort_members_parameters() {
|
||||
return new external_function_parameters(
|
||||
array(
|
||||
'members' => new external_multiple_structure(
|
||||
new external_single_structure(
|
||||
array(
|
||||
'cohortid' => new external_value(PARAM_INT, 'cohort record id'),
|
||||
'userid' => new external_value(PARAM_INT, 'user id'),
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete cohort members
|
||||
*
|
||||
* @param array $members of arrays with keys userid, cohortid
|
||||
* @since Moodle 2.4
|
||||
*/
|
||||
public static function delete_cohort_members($members) {
|
||||
global $CFG, $DB;
|
||||
require_once("$CFG->dirroot/cohort/lib.php");
|
||||
|
||||
// Validate parameters.
|
||||
$params = self::validate_parameters(self::delete_cohort_members_parameters(), array('members' => $members));
|
||||
|
||||
$transaction = $DB->start_delegated_transaction();
|
||||
|
||||
foreach ($params['members'] as $member) {
|
||||
$cohortid = $member['cohortid'];
|
||||
$userid = $member['userid'];
|
||||
|
||||
$cohort = $DB->get_record('cohort', array('id' => $cohortid), '*', MUST_EXIST);
|
||||
$user = $DB->get_record('user', array('id' => $userid, 'deleted' => 0, 'mnethostid' => $CFG->mnet_localhost_id),
|
||||
'*', MUST_EXIST);
|
||||
|
||||
// Now security checks.
|
||||
$context = context::instance_by_id($cohort->contextid, MUST_EXIST);
|
||||
if ($context->contextlevel != CONTEXT_COURSECAT and $context->contextlevel != CONTEXT_SYSTEM) {
|
||||
throw new invalid_parameter_exception('Invalid context');
|
||||
}
|
||||
self::validate_context($context);
|
||||
require_capability('moodle/cohort:assign', $context);
|
||||
|
||||
cohort_remove_member($cohort->id, $user->id);
|
||||
}
|
||||
$transaction->allow_commit();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of method result value
|
||||
*
|
||||
* @return null
|
||||
* @since Moodle 2.4
|
||||
*/
|
||||
public static function delete_cohort_members_returns() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of method parameters
|
||||
*
|
||||
* @return external_function_parameters
|
||||
* @since Moodle 2.4
|
||||
*/
|
||||
public static function get_cohort_members_parameters() {
|
||||
return new external_function_parameters(
|
||||
array(
|
||||
'cohortids' => new external_multiple_structure(new external_value(PARAM_INT, 'Cohort ID')),
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return all members for a cohort
|
||||
*
|
||||
* @param array $cohortids array of cohort ids
|
||||
* @return array with cohort id keys containing arrays of user ids
|
||||
* @since Moodle 2.4
|
||||
*/
|
||||
public static function get_cohort_members($cohortids) {
|
||||
global $DB;
|
||||
$params = self::validate_parameters(self::get_cohort_members_parameters(), array('cohortids' => $cohortids));
|
||||
|
||||
$members = array();
|
||||
|
||||
foreach ($params['cohortids'] as $cohortid) {
|
||||
// Validate params.
|
||||
$cohort = $DB->get_record('cohort', array('id' => $cohortid), '*', MUST_EXIST);
|
||||
// Now security checks.
|
||||
$context = context::instance_by_id($cohort->contextid, MUST_EXIST);
|
||||
if ($context->contextlevel != CONTEXT_COURSECAT and $context->contextlevel != CONTEXT_SYSTEM) {
|
||||
throw new invalid_parameter_exception('Invalid context');
|
||||
}
|
||||
self::validate_context($context);
|
||||
require_capability('moodle/cohort:view', $context);
|
||||
|
||||
$cohortmembers = $DB->get_records_sql("SELECT u.id FROM {user} u, {cohort_members} cm
|
||||
WHERE u.id = cm.userid AND cm.cohortid = ?
|
||||
ORDER BY lastname ASC, firstname ASC", array($cohort->id));
|
||||
$members[] = array('cohortid' => $cohortid, 'userids' => array_keys($cohortmembers));
|
||||
}
|
||||
return $members;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of method result value
|
||||
*
|
||||
* @return external_description
|
||||
* @since Moodle 2.4
|
||||
*/
|
||||
public static function get_cohort_members_returns() {
|
||||
return new external_multiple_structure(
|
||||
new external_single_structure(
|
||||
array(
|
||||
'cohortid' => new external_value(PARAM_INT, 'cohort record id'),
|
||||
'userids' => new external_multiple_structure(new external_value(PARAM_INT, 'user id')),
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
Executable
+294
@@ -0,0 +1,294 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* External cohort API
|
||||
*
|
||||
* @package core_cohort
|
||||
* @category external
|
||||
* @copyright MediaTouch 2000 srl
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
global $CFG;
|
||||
|
||||
require_once($CFG->dirroot . '/webservice/tests/helpers.php');
|
||||
require_once($CFG->dirroot . '/cohort/externallib.php');
|
||||
|
||||
class core_cohort_external_testcase extends externallib_advanced_testcase {
|
||||
|
||||
/**
|
||||
* Test create_cohorts
|
||||
*/
|
||||
public function test_create_cohorts() {
|
||||
global $USER, $CFG, $DB;
|
||||
|
||||
$this->resetAfterTest(true);
|
||||
|
||||
$contextid = context_system::instance()->id;
|
||||
|
||||
$cohort1 = array(
|
||||
'categorytype' => array('type' => 'id', 'value' => '1'),
|
||||
'name' => 'cohort test 1',
|
||||
'idnumber' => 'cohorttest1',
|
||||
'description' => 'This is a description for cohorttest1'
|
||||
);
|
||||
|
||||
$cohort2 = array(
|
||||
'categorytype' => array('type' => 'id', 'value' => '1'),
|
||||
'name' => 'cohort test 2',
|
||||
'idnumber' => 'cohorttest2',
|
||||
'description' => 'This is a description for cohorttest2'
|
||||
);
|
||||
$roleid = $this->assignUserCapability('moodle/cohort:manage', $contextid);
|
||||
|
||||
// Call the external function.
|
||||
$createdcohorts = core_cohort_external::create_cohorts(array($cohort1));
|
||||
|
||||
// Check we retrieve the good total number of created cohorts + no error on capability.
|
||||
$this->assertEquals(1, count($createdcohorts));
|
||||
|
||||
foreach ($createdcohorts as $createdcohort) {
|
||||
$dbcohort = $DB->get_record('cohort', array('id' => $createdcohort['id']));
|
||||
$conid = $DB->get_field('context', 'id', array('instanceid' => $cohort1['categorytype']['value'],
|
||||
'contextlevel' => CONTEXT_COURSECAT));
|
||||
$this->assertEquals($dbcohort->contextid, $conid);
|
||||
$this->assertEquals($dbcohort->name, $cohort1['name']);
|
||||
$this->assertEquals($dbcohort->idnumber, $cohort1['idnumber']);
|
||||
$this->assertEquals($dbcohort->description, $cohort1['description']);
|
||||
}
|
||||
|
||||
// Call without required capability.
|
||||
$this->unassignUserCapability('moodle/cohort:manage', $contextid, $roleid);
|
||||
$this->setExpectedException('required_capability_exception');
|
||||
$createdcohorts = core_cohort_external::create_cohorts(array($cohort2));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test delete_cohorts
|
||||
*/
|
||||
public function test_delete_cohorts() {
|
||||
global $USER, $CFG, $DB;
|
||||
|
||||
$this->resetAfterTest(true);
|
||||
|
||||
$cohort1 = self::getDataGenerator()->create_cohort();
|
||||
$cohort2 = self::getDataGenerator()->create_cohort();
|
||||
// Check the cohorts were correctly created.
|
||||
$this->assertEquals(2, $DB->count_records_select('cohort', ' (id = :cohortid1 OR id = :cohortid2)',
|
||||
array('cohortid1' => $cohort1->id, 'cohortid2' => $cohort2->id)));
|
||||
|
||||
$contextid = $cohort1->contextid;
|
||||
$roleid = $this->assignUserCapability('moodle/cohort:manage', $contextid);
|
||||
|
||||
// Call the external function.
|
||||
core_cohort_external::delete_cohorts(array($cohort1->id, $cohort2->id));
|
||||
|
||||
// Check we retrieve no cohorts + no error on capability.
|
||||
$this->assertEquals(0, $DB->count_records_select('cohort', ' (id = :cohortid1 OR id = :cohortid2)',
|
||||
array('cohortid1' => $cohort1->id, 'cohortid2' => $cohort2->id)));
|
||||
|
||||
// Call without required capability.
|
||||
$cohort1 = self::getDataGenerator()->create_cohort();
|
||||
$cohort2 = self::getDataGenerator()->create_cohort();
|
||||
$this->unassignUserCapability('moodle/cohort:manage', $contextid, $roleid);
|
||||
$this->setExpectedException('required_capability_exception');
|
||||
core_cohort_external::delete_cohorts(array($cohort1->id, $cohort2->id));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test get_cohorts
|
||||
*/
|
||||
public function test_get_cohorts() {
|
||||
global $USER, $CFG;
|
||||
|
||||
$this->resetAfterTest(true);
|
||||
|
||||
$cohort1 = array(
|
||||
'contextid' => 1,
|
||||
'name' => 'cohortnametest1',
|
||||
'idnumber' => 'idnumbertest1',
|
||||
'description' => 'This is a description for cohort 1'
|
||||
);
|
||||
$cohort1 = self::getDataGenerator()->create_cohort($cohort1);
|
||||
$cohort2 = self::getDataGenerator()->create_cohort();
|
||||
|
||||
$context = context_system::instance();
|
||||
$roleid = $this->assignUserCapability('moodle/cohort:view', $context->id);
|
||||
|
||||
// Call the external function.
|
||||
$returnedcohorts = core_cohort_external::get_cohorts(array(
|
||||
$cohort1->id, $cohort2->id));
|
||||
|
||||
// Check we retrieve the good total number of enrolled cohorts + no error on capability.
|
||||
$this->assertEquals(2, count($returnedcohorts));
|
||||
|
||||
// Call the external function.
|
||||
$returnedcohorts = core_cohort_external::get_cohorts(array(
|
||||
$cohort1->id, $cohort2->id));
|
||||
|
||||
foreach ($returnedcohorts as $enrolledcohort) {
|
||||
if ($enrolledcohort['idnumber'] == $cohort1->idnumber) {
|
||||
$this->assertEquals($cohort1->name, $enrolledcohort['name']);
|
||||
$this->assertEquals($cohort1->description, $enrolledcohort['description']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test update_cohorts
|
||||
*/
|
||||
public function test_update_cohorts() {
|
||||
global $USER, $CFG, $DB;
|
||||
|
||||
$this->resetAfterTest(true);
|
||||
|
||||
$cohort1 = self::getDataGenerator()->create_cohort();
|
||||
|
||||
$cohort1 = array(
|
||||
'id' => $cohort1->id,
|
||||
'categorytype' => array('type' => 'id', 'value' => '1'),
|
||||
'name' => 'cohortnametest1',
|
||||
'idnumber' => 'idnumbertest1',
|
||||
'description' => 'This is a description for cohort 1'
|
||||
);
|
||||
|
||||
$context = context_system::instance();
|
||||
$roleid = $this->assignUserCapability('moodle/cohort:manage', $context->id);
|
||||
|
||||
// Call the external function.
|
||||
core_cohort_external::update_cohorts(array($cohort1));
|
||||
|
||||
$dbcohort = $DB->get_record('cohort', array('id' => $cohort1['id']));
|
||||
$contextid = $DB->get_field('context', 'id', array('instanceid' => $cohort1['categorytype']['value'],
|
||||
'contextlevel' => CONTEXT_COURSECAT));
|
||||
$this->assertEquals($dbcohort->contextid, $contextid);
|
||||
$this->assertEquals($dbcohort->name, $cohort1['name']);
|
||||
$this->assertEquals($dbcohort->idnumber, $cohort1['idnumber']);
|
||||
$this->assertEquals($dbcohort->description, $cohort1['description']);
|
||||
|
||||
// Call without required capability.
|
||||
$this->unassignUserCapability('moodle/cohort:manage', $context->id, $roleid);
|
||||
$this->setExpectedException('required_capability_exception');
|
||||
core_cohort_external::update_cohorts(array($cohort1));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test add_cohort_members
|
||||
*/
|
||||
public function test_add_cohort_members() {
|
||||
global $DB;
|
||||
|
||||
$this->resetAfterTest(true); // Reset all changes automatically after this test.
|
||||
|
||||
$contextid = context_system::instance()->id;
|
||||
|
||||
$cohort = array(
|
||||
'contextid' => $contextid,
|
||||
'name' => 'cohortnametest1',
|
||||
'idnumber' => 'idnumbertest1',
|
||||
'description' => 'This is a description for cohort 1'
|
||||
);
|
||||
$cohort0 = self::getDataGenerator()->create_cohort($cohort);
|
||||
// Check the cohorts were correctly created.
|
||||
$this->assertEquals(1, $DB->count_records_select('cohort', ' (id = :cohortid0)',
|
||||
array('cohortid0' => $cohort0->id)));
|
||||
|
||||
$cohort1 = array(
|
||||
'cohorttype' => array('type' => 'id', 'value' => $cohort0->id),
|
||||
'usertype' => array('type' => 'id', 'value' => '1')
|
||||
);
|
||||
|
||||
$roleid = $this->assignUserCapability('moodle/cohort:assign', $contextid);
|
||||
|
||||
// Call the external function.
|
||||
$addcohortmembers = core_cohort_external::add_cohort_members(array($cohort1));
|
||||
|
||||
// Check we retrieve the good total number of created cohorts + no error on capability.
|
||||
$this->assertEquals(1, count($addcohortmembers));
|
||||
|
||||
foreach ($addcohortmembers as $addcohortmember) {
|
||||
$dbcohort = $DB->get_record('cohort_members', array('cohortid' => $cohort0->id));
|
||||
$this->assertEquals($dbcohort->cohortid, $cohort1['cohorttype']['value']);
|
||||
$this->assertEquals($dbcohort->userid, $cohort1['usertype']['value']);
|
||||
}
|
||||
|
||||
// Call without required capability.
|
||||
$cohort2 = array(
|
||||
'cohorttype' => array('type' => 'id', 'value' => $cohort0->id),
|
||||
'usertype' => array('type' => 'id', 'value' => '2')
|
||||
);
|
||||
$this->unassignUserCapability('moodle/cohort:assign', $contextid, $roleid);
|
||||
$this->setExpectedException('required_capability_exception');
|
||||
$addcohortmembers = core_cohort_external::add_cohort_members(array($cohort2));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test delete_cohort_members
|
||||
*/
|
||||
public function test_delete_cohort_members() {
|
||||
global $DB;
|
||||
|
||||
$this->resetAfterTest(true); // Reset all changes automatically after this test.
|
||||
|
||||
$cohort1 = self::getDataGenerator()->create_cohort();
|
||||
$user1 = self::getDataGenerator()->create_user();
|
||||
$cohort2 = self::getDataGenerator()->create_cohort();
|
||||
$user2 = self::getDataGenerator()->create_user();
|
||||
|
||||
$context = context_system::instance();
|
||||
$roleid = $this->assignUserCapability('moodle/cohort:assign', $context->id);
|
||||
|
||||
$cohortaddmember1 = array(
|
||||
'cohorttype' => array('type' => 'id', 'value' => $cohort1->id),
|
||||
'usertype' => array('type' => 'id', 'value' => $user1->id)
|
||||
);
|
||||
$cohortmembers1 = core_cohort_external::add_cohort_members(array($cohortaddmember1));
|
||||
$cohortaddmember2 = array(
|
||||
'cohorttype' => array('type' => 'id', 'value' => $cohort2->id),
|
||||
'usertype' => array('type' => 'id', 'value' => $user2->id)
|
||||
);
|
||||
$cohortmembers2 = core_cohort_external::add_cohort_members(array($cohortaddmember2));
|
||||
|
||||
// Check we retrieve no cohorts + no error on capability.
|
||||
$this->assertEquals(2, $DB->count_records_select('cohort_members', ' ((cohortid = :idcohort1 AND userid = :iduser1)
|
||||
OR (cohortid = :idcohort2 AND userid = :iduser2))',
|
||||
array('idcohort1' => $cohort1->id, 'iduser1' => $user1->id, 'idcohort2' => $cohort2->id, 'iduser2' => $user2->id)));
|
||||
|
||||
// Call the external function.
|
||||
$cohortdel1 = array(
|
||||
'cohortid' => $cohort1->id,
|
||||
'userid' => $user1->id
|
||||
);
|
||||
$cohortdel2 = array(
|
||||
'cohortid' => $cohort2->id,
|
||||
'userid' => $user2->id
|
||||
);
|
||||
core_cohort_external::delete_cohort_members(array($cohortdel1, $cohortdel2));
|
||||
|
||||
// Check we retrieve no cohorts + no error on capability.
|
||||
$this->assertEquals(0, $DB->count_records_select('cohort_members', ' ((cohortid = :idcohort1 AND userid = :iduser1)
|
||||
OR (cohortid = :idcohort2 AND userid = :iduser2))',
|
||||
array('idcohort1' => $cohort1->id, 'iduser1' => $user1->id, 'idcohort2' => $cohort2->id, 'iduser2' => $user2->id)));
|
||||
|
||||
// Call without required capability.
|
||||
$this->unassignUserCapability('moodle/cohort:assign', $context->id, $roleid);
|
||||
$this->setExpectedException('required_capability_exception');
|
||||
core_cohort_external::delete_cohort_members(array($cohortdel1, $cohortdel2));
|
||||
}
|
||||
}
|
||||
@@ -35,6 +35,71 @@
|
||||
|
||||
$functions = array(
|
||||
|
||||
// Cohort related functions.
|
||||
|
||||
'core_cohort_create_cohorts' => array(
|
||||
'classname' => 'core_cohort_external',
|
||||
'methodname' => 'create_cohorts',
|
||||
'classpath' => 'cohort/externallib.php',
|
||||
'description' => 'Creates new cohorts.',
|
||||
'type' => 'write',
|
||||
'capabilities'=> 'moodle/cohort:manage',
|
||||
),
|
||||
|
||||
'core_cohort_delete_cohorts' => array(
|
||||
'classname' => 'core_cohort_external',
|
||||
'methodname' => 'delete_cohorts',
|
||||
'classpath' => 'cohort/externallib.php',
|
||||
'description' => 'Deletes all specified cohorts.',
|
||||
'type' => 'delete',
|
||||
'capabilities'=> 'moodle/cohort:manage',
|
||||
),
|
||||
|
||||
'core_cohort_get_cohorts' => array(
|
||||
'classname' => 'core_cohort_external',
|
||||
'methodname' => 'get_cohorts',
|
||||
'classpath' => 'cohort/externallib.php',
|
||||
'description' => 'Returns cohort details.',
|
||||
'type' => 'read',
|
||||
'capabilities'=> 'moodle/cohort:view',
|
||||
),
|
||||
|
||||
'core_cohort_update_cohorts' => array(
|
||||
'classname' => 'core_cohort_external',
|
||||
'methodname' => 'update_cohorts',
|
||||
'classpath' => 'cohort/externallib.php',
|
||||
'description' => 'Updates existing cohorts.',
|
||||
'type' => 'write',
|
||||
'capabilities'=> 'moodle/cohort:manage',
|
||||
),
|
||||
|
||||
'core_cohort_add_cohort_members' => array(
|
||||
'classname' => 'core_cohort_external',
|
||||
'methodname' => 'add_cohort_members',
|
||||
'classpath' => 'cohort/externallib.php',
|
||||
'description' => 'Adds cohort members.',
|
||||
'type' => 'write',
|
||||
'capabilities'=> 'moodle/cohort:assign',
|
||||
),
|
||||
|
||||
'core_cohort_delete_cohort_members' => array(
|
||||
'classname' => 'core_cohort_external',
|
||||
'methodname' => 'delete_cohort_members',
|
||||
'classpath' => 'cohort/externallib.php',
|
||||
'description' => 'Deletes cohort members.',
|
||||
'type' => 'delete',
|
||||
'capabilities'=> 'moodle/cohort:assign',
|
||||
),
|
||||
|
||||
'core_cohort_get_cohort_members' => array(
|
||||
'classname' => 'core_cohort_external',
|
||||
'methodname' => 'get_cohort_members',
|
||||
'classpath' => 'cohort/externallib.php',
|
||||
'description' => 'Returns cohort members.',
|
||||
'type' => 'read',
|
||||
'capabilities'=> 'moodle/cohort:view',
|
||||
),
|
||||
|
||||
// === group related functions ===
|
||||
|
||||
'moodle_group_create_groups' => array(
|
||||
|
||||
Reference in New Issue
Block a user