Skip to content

Commit

Permalink
Merge branch 'MDL-51664-master' of git://github.com/FMCorz/moodle
Browse files Browse the repository at this point in the history
  • Loading branch information
danpoltawski authored and stronk7 committed Dec 3, 2015
2 parents 551088f + 583b02e commit 50901a5
Show file tree
Hide file tree
Showing 8 changed files with 95 additions and 15 deletions.
13 changes: 10 additions & 3 deletions lib/externallib.php
Original file line number Diff line number Diff line change
Expand Up @@ -964,21 +964,28 @@ class external_util {
* Validate a list of courses, returning the complete course objects for valid courses.
*
* @param array $courseids A list of course ids
* @param array $courses An array of courses already pre-fetched.
* @return array An array of courses and the validation warnings
*/
public static function validate_courses($courseids) {
public static function validate_courses($courseids, $courses = array()) {
// Delete duplicates.
$courseids = array_unique($courseids);
$courses = array();
$warnings = array();

// Remove courses which are not even requested.
$courses = array_intersect_key($courses, array_flip($courseids));

foreach ($courseids as $cid) {
// Check the user can function in this context.
try {
$context = context_course::instance($cid);
external_api::validate_context($context);
$courses[$cid] = get_course($cid);

if (!isset($courses[$cid])) {
$courses[$cid] = get_course($cid);
}
} catch (Exception $e) {
unset($courses[$cid]);
$warnings[] = array(
'item' => 'course',
'itemid' => $cid,
Expand Down
61 changes: 61 additions & 0 deletions lib/tests/externallib_test.php
Original file line number Diff line number Diff line change
Expand Up @@ -293,6 +293,67 @@ public function test_all_external_info($f) {
$this->assertInstanceOf('external_description', $desc->returns_desc);
}
}

public function test_validate_courses() {
$this->resetAfterTest(true);

$c1 = $this->getDataGenerator()->create_course();
$c2 = $this->getDataGenerator()->create_course();
$c3 = $this->getDataGenerator()->create_course();
$u1 = $this->getDataGenerator()->create_user();
$this->getDataGenerator()->enrol_user($u1->id, $c1->id);
$courseids = array($c1->id, $c2->id, $c3->id);

$this->setAdminUser();
list($courses, $warnings) = external_util::validate_courses($courseids);
$this->assertEmpty($warnings);
$this->assertCount(3, $courses);
$this->assertArrayHasKey($c1->id, $courses);
$this->assertArrayHasKey($c2->id, $courses);
$this->assertArrayHasKey($c3->id, $courses);
$this->assertEquals($c1->id, $courses[$c1->id]->id);
$this->assertEquals($c2->id, $courses[$c2->id]->id);
$this->assertEquals($c3->id, $courses[$c3->id]->id);

$this->setUser($u1);
list($courses, $warnings) = external_util::validate_courses($courseids);
$this->assertCount(2, $warnings);
$this->assertEquals($c2->id, $warnings[0]['itemid']);
$this->assertEquals($c3->id, $warnings[1]['itemid']);
$this->assertCount(1, $courses);
$this->assertArrayHasKey($c1->id, $courses);
$this->assertArrayNotHasKey($c2->id, $courses);
$this->assertArrayNotHasKey($c3->id, $courses);
$this->assertEquals($c1->id, $courses[$c1->id]->id);
}

/**
* Validate courses can re-use an array of prefetched courses.
*/
public function test_validate_courses_prefetch() {
$this->resetAfterTest(true);

$c1 = $this->getDataGenerator()->create_course();
$c2 = $this->getDataGenerator()->create_course();
$c3 = $this->getDataGenerator()->create_course();
$c4 = $this->getDataGenerator()->create_course();
$u1 = $this->getDataGenerator()->create_user();
$this->getDataGenerator()->enrol_user($u1->id, $c1->id);
$this->getDataGenerator()->enrol_user($u1->id, $c2->id);

$courseids = array($c1->id, $c2->id, $c3->id);
$courses = array($c2->id => $c2, $c3->id => $c3, $c4->id => $c4);

$this->setUser($u1);
list($courses, $warnings) = external_util::validate_courses($courseids, $courses);
$this->assertCount(2, $courses);
$this->assertCount(1, $warnings);
$this->assertArrayHasKey($c1->id, $courses);
$this->assertSame($c2, $courses[$c2->id]);
$this->assertArrayNotHasKey($c3->id, $courses);
// The extra course passed is not returned.
$this->assertArrayNotHasKey($c4->id, $courses);
}
}

/*
Expand Down
6 changes: 4 additions & 2 deletions mod/book/classes/external.php
Original file line number Diff line number Diff line change
Expand Up @@ -181,14 +181,16 @@ public static function get_books_by_courses($courseids = array()) {

$params = self::validate_parameters(self::get_books_by_courses_parameters(), array('courseids' => $courseids));

$courses = array();
if (empty($params['courseids'])) {
$params['courseids'] = array_keys(enrol_get_my_courses());
$courses = enrol_get_my_courses();
$params['courseids'] = array_keys($courses);
}

// Ensure there are courseids to loop through.
if (!empty($params['courseids'])) {

list($courses, $warnings) = external_util::validate_courses($params['courseids']);
list($courses, $warnings) = external_util::validate_courses($params['courseids'], $courses);

// Get the books in this course, this function checks users visibility permissions.
// We can avoid then additional validate_context calls.
Expand Down
6 changes: 4 additions & 2 deletions mod/chat/classes/external.php
Original file line number Diff line number Diff line change
Expand Up @@ -523,14 +523,16 @@ public static function get_chats_by_courses($courseids = array()) {

$params = self::validate_parameters(self::get_chats_by_courses_parameters(), array('courseids' => $courseids));

$courses = array();
if (empty($params['courseids'])) {
$params['courseids'] = array_keys(enrol_get_my_courses());
$courses = enrol_get_my_courses();
$params['courseids'] = array_keys($courses);
}

// Ensure there are courseids to loop through.
if (!empty($params['courseids'])) {

list($courses, $warnings) = external_util::validate_courses($params['courseids']);
list($courses, $warnings) = external_util::validate_courses($params['courseids'], $courses);

// Get the chats in this course, this function checks users visibility permissions.
// We can avoid then additional validate_context calls.
Expand Down
6 changes: 4 additions & 2 deletions mod/choice/classes/external.php
Original file line number Diff line number Diff line change
Expand Up @@ -480,14 +480,16 @@ public static function get_choices_by_courses($courseids = array()) {

$params = self::validate_parameters(self::get_choices_by_courses_parameters(), array('courseids' => $courseids));

$courses = array();
if (empty($params['courseids'])) {
$params['courseids'] = array_keys(enrol_get_my_courses());
$courses = enrol_get_my_courses();
$params['courseids'] = array_keys($courses);
}

// Ensure there are courseids to loop through.
if (!empty($params['courseids'])) {

list($courses, $warnings) = external_util::validate_courses($params['courseids']);
list($courses, $warnings) = external_util::validate_courses($params['courseids'], $courses);

// Get the choices in this course, this function checks users visibility permissions.
// We can avoid then additional validate_context calls.
Expand Down
6 changes: 4 additions & 2 deletions mod/forum/externallib.php
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,10 @@ public static function get_forums_by_courses($courseids = array()) {

$params = self::validate_parameters(self::get_forums_by_courses_parameters(), array('courseids' => $courseids));

$courses = array();
if (empty($params['courseids'])) {
$params['courseids'] = array_keys(enrol_get_my_courses());
$courses = enrol_get_my_courses();
$params['courseids'] = array_keys($courses);
}

// Array to store the forums to return.
Expand All @@ -71,7 +73,7 @@ public static function get_forums_by_courses($courseids = array()) {
// Ensure there are courseids to loop through.
if (!empty($params['courseids'])) {

list($courses, $warnings) = external_util::validate_courses($params['courseids']);
list($courses, $warnings) = external_util::validate_courses($params['courseids'], $courses);

// Get the forums in this course. This function checks users visibility permissions.
$forums = get_all_instances_in_courses("forum", $courses);
Expand Down
6 changes: 4 additions & 2 deletions mod/imscp/classes/external.php
Original file line number Diff line number Diff line change
Expand Up @@ -136,14 +136,16 @@ public static function get_imscps_by_courses($courseids = array()) {

$params = self::validate_parameters(self::get_imscps_by_courses_parameters(), array('courseids' => $courseids));

$courses = array();
if (empty($params['courseids'])) {
$params['courseids'] = array_keys(enrol_get_my_courses());
$courses = enrol_get_my_courses();
$params['courseids'] = array_keys($courses);
}

// Ensure there are courseids to loop through.
if (!empty($params['courseids'])) {

list($courses, $warnings) = external_util::validate_courses($params['courseids']);
list($courses, $warnings) = external_util::validate_courses($params['courseids'], $courses);

// Get the imscps in this course, this function checks users visibility permissions.
// We can avoid then additional validate_context calls.
Expand Down
6 changes: 4 additions & 2 deletions mod/scorm/classes/external.php
Original file line number Diff line number Diff line change
Expand Up @@ -640,14 +640,16 @@ public static function get_scorms_by_courses($courseids = array()) {

$params = self::validate_parameters(self::get_scorms_by_courses_parameters(), array('courseids' => $courseids));

$courses = array();
if (empty($params['courseids'])) {
$params['courseids'] = array_keys(enrol_get_my_courses());
$courses = enrol_get_my_courses();
$params['courseids'] = array_keys($courses);
}

// Ensure there are courseids to loop through.
if (!empty($params['courseids'])) {

list($courses, $warnings) = external_util::validate_courses($params['courseids']);
list($courses, $warnings) = external_util::validate_courses($params['courseids'], $courses);

// Get the scorms in this course, this function checks users visibility permissions.
// We can avoid then additional validate_context calls.
Expand Down

0 comments on commit 50901a5

Please sign in to comment.