/** * */ function forum_user_can_post_discussion($forum, $currentgroup = -1, $groupmode = -1, $cm = NULL, $context = NULL) { // $forum is an object global $USER, $SESSION; if (!$cm) { if (!($cm = get_coursemodule_from_instance('forum', $forum->id, $forum->course))) { error('Course Module ID was incorrect'); } } if (!$context) { $context = get_context_instance(CONTEXT_MODULE, $cm->id); } if ($currentgroup == -1) { $currentgroup = get_current_group($cm->course); } if ($groupmode == -1) { if (!($course = get_record('course', 'id', $cm->course))) { error('Can not find course'); } $groupmode = groups_get_activity_groupmode($cm); } if ($forum->type == 'news') { $capname = 'mod/forum:addnews'; } else { $capname = 'mod/forum:startdiscussion'; } if (!has_capability($capname, $context)) { return false; } if ($forum->type == 'eachuser') { if (forum_user_has_posted_discussion($forum->id, $USER->id)) { return false; } } if (!$groupmode or has_capability('moodle/site:accessallgroups', $context)) { return true; } if ($currentgroup) { return groups_is_member($currentgroup); } else { //else it might be group 0 in visible mode if ($groupmode == VISIBLEGROUPS) { return true; } else { return false; } } }
/** * @global object * @param object $forum * @param object $currentgroup * @param int $unused * @param object $cm * @param object $context * @return bool */ function forum_user_can_post_discussion($forum, $currentgroup=null, $unused=-1, $cm=NULL, $context=NULL) { // $forum is an object global $USER; // shortcut - guest and not-logged-in users can not post if (isguestuser() or !isloggedin()) { return false; } if (!$cm) { debugging('missing cm', DEBUG_DEVELOPER); if (!$cm = get_coursemodule_from_instance('forum', $forum->id, $forum->course)) { print_error('invalidcoursemodule'); } } if (!$context) { $context = context_module::instance($cm->id); } if ($currentgroup === null) { $currentgroup = groups_get_activity_group($cm); } $groupmode = groups_get_activity_groupmode($cm); if ($forum->type == 'news') { $capname = 'mod/forum:addnews'; } else if ($forum->type == 'qanda') { $capname = 'mod/forum:addquestion'; } else { $capname = 'mod/forum:startdiscussion'; } if (!has_capability($capname, $context)) { return false; } if ($forum->type == 'single') { return false; } if ($forum->type == 'eachuser') { if (forum_user_has_posted_discussion($forum->id, $USER->id)) { return false; } } if (!$groupmode or has_capability('moodle/site:accessallgroups', $context)) { return true; } if ($currentgroup) { return groups_is_member($currentgroup); } else { // no group membership and no accessallgroups means no new discussions // reverted to 1.7 behaviour in 1.9+, buggy in 1.8.0-1.9.0 return false; } }
/** * Test forum_user_has_posted_discussion with multiple groups. */ public function test_forum_user_has_posted_discussion_multiple_groups() { global $CFG; $this->resetAfterTest(true); $course = self::getDataGenerator()->create_course(); $author = self::getDataGenerator()->create_user(); $this->getDataGenerator()->enrol_user($author->id, $course->id); $group1 = $this->getDataGenerator()->create_group(array('courseid' => $course->id)); $group2 = $this->getDataGenerator()->create_group(array('courseid' => $course->id)); groups_add_member($group1->id, $author->id); groups_add_member($group2->id, $author->id); $forum = self::getDataGenerator()->create_module('forum', (object) ['course' => $course->id], ['groupmode' => SEPARATEGROUPS]); self::setUser($author); // The user has not posted in either group. $this->assertFalse(forum_user_has_posted_discussion($forum->id, $author->id)); $this->assertFalse(forum_user_has_posted_discussion($forum->id, $author->id, $group1->id)); $this->assertFalse(forum_user_has_posted_discussion($forum->id, $author->id, $group2->id)); // Post in one group. $record = new stdClass(); $record->course = $course->id; $record->userid = $author->id; $record->forum = $forum->id; $record->groupid = $group1->id; $discussion = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record); // The author has now posted in one group, but the other user has not. $this->assertTrue(forum_user_has_posted_discussion($forum->id, $author->id)); $this->assertTrue(forum_user_has_posted_discussion($forum->id, $author->id, $group1->id)); $this->assertFalse(forum_user_has_posted_discussion($forum->id, $author->id, $group2->id)); // Post in the other group. $record = new stdClass(); $record->course = $course->id; $record->userid = $author->id; $record->forum = $forum->id; $record->groupid = $group2->id; $discussion = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record); // The author has now posted in one group, but the other user has not. $this->assertTrue(forum_user_has_posted_discussion($forum->id, $author->id)); $this->assertTrue(forum_user_has_posted_discussion($forum->id, $author->id, $group1->id)); $this->assertTrue(forum_user_has_posted_discussion($forum->id, $author->id, $group2->id)); }