mirror of
https://github.com/moodle/moodle.git
synced 2025-04-07 17:33:18 +02:00
MDL-50493 forum: Handle correctly qanda forums in get_discussion_posts
This commit is contained in:
parent
17abbfba1f
commit
b1aa7dfac3
@ -404,6 +404,7 @@ class mod_forum_external extends external_api {
|
||||
public static function get_forum_discussion_posts($discussionid, $sortby = "created", $sortdirection = "DESC") {
|
||||
global $CFG, $DB, $USER;
|
||||
|
||||
$posts = array();
|
||||
$warnings = array();
|
||||
|
||||
// Validate the parameter.
|
||||
@ -463,9 +464,9 @@ class mod_forum_external extends external_api {
|
||||
$forumtracked = forum_tp_is_tracked($forum);
|
||||
|
||||
$sort = 'p.' . $sortby . ' ' . $sortdirection;
|
||||
$posts = forum_get_all_discussion_posts($discussion->id, $sort, $forumtracked);
|
||||
$allposts = forum_get_all_discussion_posts($discussion->id, $sort, $forumtracked);
|
||||
|
||||
foreach ($posts as $pid => $post) {
|
||||
foreach ($allposts as $post) {
|
||||
|
||||
if (!forum_user_can_see_post($forum, $discussion, $post, null, $cm)) {
|
||||
$warning = array();
|
||||
@ -480,16 +481,16 @@ class mod_forum_external extends external_api {
|
||||
// Function forum_get_all_discussion_posts adds postread field.
|
||||
// Note that the value returned can be a boolean or an integer. The WS expects a boolean.
|
||||
if (empty($post->postread)) {
|
||||
$posts[$pid]->postread = false;
|
||||
$post->postread = false;
|
||||
} else {
|
||||
$posts[$pid]->postread = true;
|
||||
$post->postread = true;
|
||||
}
|
||||
|
||||
$posts[$pid]->canreply = $canreply;
|
||||
if (!empty($posts[$pid]->children)) {
|
||||
$posts[$pid]->children = array_keys($posts[$pid]->children);
|
||||
$post->canreply = $canreply;
|
||||
if (!empty($post->children)) {
|
||||
$post->children = array_keys($post->children);
|
||||
} else {
|
||||
$posts[$pid]->children = array();
|
||||
$post->children = array();
|
||||
}
|
||||
|
||||
$user = new stdclass();
|
||||
@ -530,7 +531,7 @@ class mod_forum_external extends external_api {
|
||||
}
|
||||
}
|
||||
|
||||
$posts[$pid] = (array) $post;
|
||||
$posts[] = $post;
|
||||
}
|
||||
|
||||
$result = array();
|
||||
|
@ -510,6 +510,75 @@ class mod_forum_external_testcase extends externallib_advanced_testcase {
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Test get forum posts (qanda forum)
|
||||
*/
|
||||
public function test_mod_forum_get_forum_discussion_posts_qanda() {
|
||||
global $CFG, $DB;
|
||||
|
||||
$this->resetAfterTest(true);
|
||||
|
||||
$record = new stdClass();
|
||||
$user1 = self::getDataGenerator()->create_user($record);
|
||||
$user2 = self::getDataGenerator()->create_user();
|
||||
|
||||
// Set the first created user to the test user.
|
||||
self::setUser($user1);
|
||||
|
||||
// Create course to add the module.
|
||||
$course1 = self::getDataGenerator()->create_course();
|
||||
$this->getDataGenerator()->enrol_user($user1->id, $course1->id);
|
||||
$this->getDataGenerator()->enrol_user($user2->id, $course1->id);
|
||||
|
||||
// Forum with tracking off.
|
||||
$record = new stdClass();
|
||||
$record->course = $course1->id;
|
||||
$record->type = 'qanda';
|
||||
$forum1 = self::getDataGenerator()->create_module('forum', $record);
|
||||
$forum1context = context_module::instance($forum1->cmid);
|
||||
|
||||
// Add discussions to the forums.
|
||||
$record = new stdClass();
|
||||
$record->course = $course1->id;
|
||||
$record->userid = $user2->id;
|
||||
$record->forum = $forum1->id;
|
||||
$discussion1 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
|
||||
|
||||
// Add 1 reply (not the actual user).
|
||||
$record = new stdClass();
|
||||
$record->discussion = $discussion1->id;
|
||||
$record->parent = $discussion1->firstpost;
|
||||
$record->userid = $user2->id;
|
||||
$discussion1reply1 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
|
||||
|
||||
// We still see only the original post.
|
||||
$posts = mod_forum_external::get_forum_discussion_posts($discussion1->id, 'modified', 'DESC');
|
||||
$posts = external_api::clean_returnvalue(mod_forum_external::get_forum_discussion_posts_returns(), $posts);
|
||||
$this->assertEquals(1, count($posts['posts']));
|
||||
|
||||
// Add a new reply, the user is going to be able to see only the original post and their new post.
|
||||
$record = new stdClass();
|
||||
$record->discussion = $discussion1->id;
|
||||
$record->parent = $discussion1->firstpost;
|
||||
$record->userid = $user1->id;
|
||||
$discussion1reply2 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
|
||||
|
||||
$posts = mod_forum_external::get_forum_discussion_posts($discussion1->id, 'modified', 'DESC');
|
||||
$posts = external_api::clean_returnvalue(mod_forum_external::get_forum_discussion_posts_returns(), $posts);
|
||||
$this->assertEquals(2, count($posts['posts']));
|
||||
|
||||
// Now, we can fake the time of the user post, so he can se the rest of the discussion posts.
|
||||
$discussion1reply2->created -= $CFG->maxeditingtime * 2;
|
||||
$DB->update_record('forum_posts', $discussion1reply2);
|
||||
|
||||
$posts = mod_forum_external::get_forum_discussion_posts($discussion1->id, 'modified', 'DESC');
|
||||
$posts = external_api::clean_returnvalue(mod_forum_external::get_forum_discussion_posts_returns(), $posts);
|
||||
$this->assertEquals(3, count($posts['posts']));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Test get forum discussions paginated
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user