diff --git a/mod/forum/externallib.php b/mod/forum/externallib.php index 325ba2a05ea..0f9c8263720 100644 --- a/mod/forum/externallib.php +++ b/mod/forum/externallib.php @@ -61,60 +61,41 @@ class mod_forum_external extends external_api { $params = self::validate_parameters(self::get_forums_by_courses_parameters(), array('courseids' => $courseids)); if (empty($params['courseids'])) { - // Get all the courses the user can view. - $courseids = array_keys(enrol_get_my_courses()); - } else { - $courseids = $params['courseids']; + $params['courseids'] = array_keys(enrol_get_my_courses()); } // Array to store the forums to return. $arrforums = array(); + $warnings = array(); // Ensure there are courseids to loop through. - if (!empty($courseids)) { - // Array of the courses we are going to retrieve the forums from. - $dbcourses = array(); - // Mod info for courses. - $modinfocourses = array(); + if (!empty($params['courseids'])) { - // Go through the courseids and return the forums. - foreach ($courseids as $courseid) { - // Check the user can function in this context. - try { - $context = context_course::instance($courseid); - self::validate_context($context); - // Get the modinfo for the course. - $modinfocourses[$courseid] = get_fast_modinfo($courseid); - $dbcourses[$courseid] = $modinfocourses[$courseid]->get_course(); - - } catch (Exception $e) { - continue; - } - } + list($courses, $warnings) = external_util::validate_courses($params['courseids']); // Get the forums in this course. This function checks users visibility permissions. - if ($forums = get_all_instances_in_courses("forum", $dbcourses)) { - foreach ($forums as $forum) { + $forums = get_all_instances_in_courses("forum", $courses); + foreach ($forums as $forum) { - $course = $dbcourses[$forum->course]; - $cm = $modinfocourses[$course->id]->get_cm($forum->coursemodule); - $context = context_module::instance($cm->id); + $course = $courses[$forum->course]; + $cm = get_coursemodule_from_instance('forum', $forum->id, $course->id); + $context = context_module::instance($cm->id); - // Skip forums we are not allowed to see discussions. - if (!has_capability('mod/forum:viewdiscussion', $context)) { - continue; - } - - // Format the intro before being returning using the format setting. - list($forum->intro, $forum->introformat) = external_format_text($forum->intro, $forum->introformat, - $context->id, 'mod_forum', 'intro', 0); - // Discussions count. This function does static request cache. - $forum->numdiscussions = forum_count_discussions($forum, $cm, $course); - $forum->cmid = $forum->coursemodule; - - // Add the forum to the array to return. - $arrforums[$forum->id] = $forum; + // Skip forums we are not allowed to see discussions. + if (!has_capability('mod/forum:viewdiscussion', $context)) { + continue; } + + // Format the intro before being returning using the format setting. + list($forum->intro, $forum->introformat) = external_format_text($forum->intro, $forum->introformat, + $context->id, 'mod_forum', 'intro', 0); + // Discussions count. This function does static request cache. + $forum->numdiscussions = forum_count_discussions($forum, $cm, $course); + $forum->cmid = $forum->coursemodule; + $forum->cancreatediscussions = forum_user_can_post_discussion($forum, null, -1, $cm, $context); + + // Add the forum to the array to return. + $arrforums[$forum->id] = $forum; } } @@ -155,7 +136,8 @@ class mod_forum_external extends external_api { 'completionreplies' => new external_value(PARAM_INT, 'Student must post replies'), 'completionposts' => new external_value(PARAM_INT, 'Student must post discussions or replies'), 'cmid' => new external_value(PARAM_INT, 'Course module id'), - 'numdiscussions' => new external_value(PARAM_INT, 'Number of discussions in the forum', VALUE_OPTIONAL) + 'numdiscussions' => new external_value(PARAM_INT, 'Number of discussions in the forum', VALUE_OPTIONAL), + 'cancreatediscussions' => new external_value(PARAM_BOOL, 'If the user can create discussions', VALUE_OPTIONAL), ), 'forum' ) ); diff --git a/mod/forum/tests/externallib_test.php b/mod/forum/tests/externallib_test.php index 97972d6079a..563429a1a3d 100644 --- a/mod/forum/tests/externallib_test.php +++ b/mod/forum/tests/externallib_test.php @@ -88,6 +88,7 @@ class mod_forum_external_testcase extends externallib_advanced_testcase { $discussion1 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record); // Expect one discussion. $forum1->numdiscussions = 1; + $forum1->cancreatediscussions = true; $record = new stdClass(); $record->course = $course2->id; @@ -97,6 +98,8 @@ class mod_forum_external_testcase extends externallib_advanced_testcase { $discussion3 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record); // Expect two discussions. $forum2->numdiscussions = 2; + // Default limited role, no create discussion capability enabled. + $forum2->cancreatediscussions = false; // Check the forum was correctly created. $this->assertEquals(2, $DB->count_records_select('forum', 'id = :forum1 OR id = :forum2', @@ -155,6 +158,13 @@ class mod_forum_external_testcase extends externallib_advanced_testcase { $forums = external_api::clean_returnvalue(mod_forum_external::get_forums_by_courses_returns(), $forums); $this->assertCount(1, $forums); $this->assertEquals($expectedforums[$forum1->id], $forums[0]); + $this->assertTrue($forums[0]['cancreatediscussions']); + + // Change the type of the forum, the user shouldn't be able to add discussions. + $DB->set_field('forum', 'type', 'news', array('id' => $forum1->id)); + $forums = mod_forum_external::get_forums_by_courses(); + $forums = external_api::clean_returnvalue(mod_forum_external::get_forums_by_courses_returns(), $forums); + $this->assertFalse($forums[0]['cancreatediscussions']); // Call for the second course we unenrolled the user from. $forums = mod_forum_external::get_forums_by_courses(array($course2->id)); diff --git a/mod/forum/upgrade.txt b/mod/forum/upgrade.txt index 9df95f69d56..03a0e133b0e 100644 --- a/mod/forum/upgrade.txt +++ b/mod/forum/upgrade.txt @@ -1,6 +1,10 @@ This files describes API changes in /mod/forum/*, information provided here is intended especially for developers. +=== 3.0 === + * External function get_forums_by_courses now returns and additional field "cancreatediscussions" that indicates if the user + can create discussions in the forum. + === 2.8 === * The following functions have all been marked as deprecated. Many of these have not been supported in many releases and should not be relied