Merge branch 'MDL-29472_m' of git://github.com/andreabix/moodle

This commit is contained in:
Damyon Wiese
2013-05-08 12:51:00 +08:00
3 changed files with 972 additions and 0 deletions
+613
View File
@@ -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')),
)
)
);
}
}
+294
View File
@@ -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));
}
}
+65
View File
@@ -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(