/** * Get forum list for a user on a course. * * @param string $courseshortname Website shortname. * @param string $oucu Username. * @return array Forum details objects. */ public static function get_forum_list($courseshortname, $oucu) { global $DB; // Validate the parameters. $params = self::validate_parameters(self::get_forum_list_parameters(), array('shortname' => $courseshortname, 'oucu' => $oucu)); // Get course object from the shortname. $course = $DB->get_record('course', array('shortname' => $courseshortname)); if ($course === false) { throw new moodle_exception(get_string('cannotfindcourse', 'error')); } $forumlist = array(); // Get the user's id from the supplied username (oucu). $userid = $DB->get_field('user', 'id', array('username' => $oucu)); if ($userid === false) { throw new moodle_exception(get_string('cannotfinduser', 'error', $oucu)); } // Get forums for the given course and user. $forums = mod_forumng::get_course_forums($course, $userid, mod_forumng::UNREAD_BINARY); $modinfo = get_fast_modinfo($course, $userid); // Loop through the forum instances, they are correctly ordered by sections. foreach ($modinfo->get_instances_of('forumng') as $cm) { // Only include this forum if it is visible to the user. if ($cm->uservisible) { $forum = $forums[$cm->instance]; if ($forum->is_clone()) { $forum->init_unread_from_original(mod_forumng::UNREAD_BINARY, $userid); } $forumdetails = new stdClass(); $forumdetails->name = $forum->get_name(); if ($forum->has_unread_discussions()) { $forumdetails->unread = 'y'; } else { $forumdetails->unread = 'n'; } $forumlist[] = $forumdetails; unset($forumdetails); } } return $forumlist; }
function mod_forumng_cm_info_view(cm_info $cm) { global $CFG; require_once $CFG->dirroot . '/mod/forumng/mod_forumng.php'; static $forums = null; if ($forums === null) { // Read tracking is for real users only if (mod_forumng::enabled_read_tracking() && !isguestuser() && isloggedin()) { $forums = mod_forumng::get_course_forums($cm->get_course(), 0, mod_forumng::UNREAD_BINARY); } else { $forums = array(); } } // If current forum is listed, check whether it's unread or not if (array_key_exists($cm->instance, $forums)) { if ($forums[$cm->instance]->has_unread_discussions()) { $cm->set_after_link('<span class="unread">' . get_string('hasunreadposts', 'forumng') . '</span>'); } } }
if ($requestingsubscribegroup && $groupid) { $forum->subscribe(0, $groupid); $confirmtext = get_string('subscribe_confirm_group', 'forumng'); } else { print_error('error_invalidsubscriptionrequest', 'forumng'); } } } } } } // Handle whole course if ($courseid) { $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST); require_login($course); $forums = mod_forumng::get_course_forums($course, 0, mod_forumng::UNREAD_NONE, array(), true); foreach ($forums as $forum) { if (!$forum->can_change_subscription()) { continue; } $subscriptioninfo = $forum->get_subscription_info(); $discussionidcount = count($subscriptioninfo->discussionids); if ($subscriptioninfo->wholeforum) { //subscribed to the entire forum $subscribed = mod_forumng::FULLY_SUBSCRIBED; } else { if ($discussionidcount == 0) { $subscribed = mod_forumng::NOT_SUBSCRIBED; } else { $subscribed = mod_forumng::PARTIALLY_SUBSCRIBED; }
$table->head = array($strforum, $strdescription, $strdiscussionsunread); $table->align = array('left', 'left', 'center'); if ($useweeks || $usesections) { array_unshift($table->head, $useweeks ? $strweek : $strsection); array_unshift($table->align, 'left'); } if ($canmaybesubscribe) { $table->head[] = $strsubscribed; $table->align[] = 'center'; } if ($showrss = ($canmaybesubscribe || $course->id == SITEID) && !empty($CFG->enablerssfeeds) && !empty($CFG->forumng_enablerssfeeds)) { $table->head[] = $strfeeds; $table->align[] = 'center'; } // Construct forums array $forums = mod_forumng::get_course_forums($course, 0, mod_forumng::UNREAD_DISCUSSIONS, array(), true); // Display all forums $currentsection = 0; $cansubscribesomething = false; $canunsubscribesomething = false; foreach ($forums as $forum) { $cm = $forum->get_course_module(); // Skip forum if it's not visible or you can't read discussions there if (!$cm->uservisible || !has_capability('mod/forumng:viewdiscussion', $forum->get_context())) { continue; } $row = array(); // Get section number if ($cm->sectionnum != $currentsection) { $printsection = $cm->sectionnum; // Between each section add a horizontal gap (copied this code,
/** * Tests discussion copying to another group and another course forum * (Does not check attachments or ratings copying) */ public function test_copy() { global $USER; $this->resetAfterTest(); $this->setAdminUser(); $course1 = $this->get_new_course(); $course2 = $this->get_new_course(); $group1 = $this->get_new_group($course1->id); $group2 = $this->get_new_group($course1->id); $orig = $this->get_new_forumng($course1->id, array('groupmode' => VISIBLEGROUPS)); $other = $this->get_new_forumng($course2->id); $dis = $this->get_new_discussion($orig, array('groupid' => $group1->id, 'userid' => $USER->id)); $lastpost = mod_forumng_post::get_from_id($dis->get_last_post_id(), 0); $dis->create_reply($lastpost, 'reply', 'reply', FORMAT_HTML); $dis->copy($orig, $group2->id); $dis->copy($other, mod_forumng::CLONE_DIRECT); $forums1 = mod_forumng::get_course_forums($course1); $forums2 = mod_forumng::get_course_forums($course2); $this->assertEquals(2, $forums1[$orig->get_id()]->get_num_discussions()); $this->assertEquals(1, $forums2[$other->get_id()]->get_num_discussions()); $list = $forums1[$orig->get_id()]->get_discussion_list($group2->id); $this->assertFalse($list->is_empty()); $discussion = $list->get_normal_discussions(); $this->assertEquals(2, reset($discussion)->get_num_posts()); if (mod_forumng::search_installed()) { $searchdoc = reset($discussion)->get_root_post()->search_get_document(); $this->assertTrue($searchdoc->find()); $query = new local_ousearch_search('reply'); $query->set_coursemodule($other->get_course_module(true)); $results = $query->query(); $this->assertNotEmpty($results->results); } }
/** * Extend tests that check forumns and discussions being marked as read. * */ public function test_discussions_mark_read() { global $USER, $DB; $this->resetAfterTest(true); $this->setAdminUser(); $adminid = $USER->id; $generator = $this->getDataGenerator()->get_plugin_generator('mod_forumng'); $course = $this->get_new_course(); $etuser1 = $this->get_new_user('editingteacher', $course->id); $suser1 = $this->get_new_user('student', $course->id); $suser2 = $this->get_new_user('student', $course->id); $group1 = $this->get_new_group($course->id); $group2 = $this->get_new_group($course->id); $this->get_new_group_member($group1->id, $etuser1->id); $this->get_new_group_member($group1->id, $suser1->id); // Create 2 forums (1 group forum, 1 no groups), each with 1 discussion. $forum1 = $this->get_new_forumng($course->id, array('groupmode' => VISIBLEGROUPS)); $forum2 = $this->get_new_forumng($course->id); $did1 = $generator->create_discussion(array('course' => $course, 'forum' => $forum1->get_id(), 'userid' => $etuser1->id, 'groupid' => $group1->id)); $did2 = $generator->create_discussion(array('course' => $course, 'forum' => $forum2->get_id(), 'userid' => $etuser1->id)); // Set the time for offset use. $posttime = time(); // Ensure user prefs allow discussions/posts to be marked as read 'automatically'. unset_user_preference('forumng_manualmark', $etuser1); unset_user_preference('forumng_manualmark', $suser1); // Root post auto marked as read for ET the creator, of forum1 at group level. $etforums = mod_forumng::get_course_forums($course, $etuser1->id, mod_forumng::UNREAD_DISCUSSIONS); // Forum contains discussion post read by etuser1. $this->assertFalse($etforums[$forum1->get_id()]->has_unread_discussions()); $this->assertEquals(0, $etforums[$forum1->get_id()]->get_num_unread_discussions()); // Suser1 has NOT read root posts. $s1forums = mod_forumng::get_course_forums($course, $suser1->id, mod_forumng::UNREAD_DISCUSSIONS); // Forums contain discussion posts NOT read by Suser1. $this->assertTrue($s1forums[$forum1->get_id()]->has_unread_discussions()); $this->assertTrue($s1forums[$forum2->get_id()]->has_unread_discussions()); // Discussion contains posts NOT read by S1. $this->assertEquals(1, $s1forums[$forum1->get_id()]->get_num_unread_discussions()); $this->assertEquals(1, $s1forums[$forum2->get_id()]->get_num_unread_discussions()); // User Prefs allow the marking of both discussion root posts as read 'automatically'. $posttime = $posttime + 2; $did1read = mod_forumng_discussion::get_from_id($did1[0], 0); $did1read->mark_read($posttime, $suser1->id); $did2read = mod_forumng_discussion::get_from_id($did2[0], 0); $did2read->mark_read($posttime, $suser1->id); // Check the root posts now marked as read for S1. $s1forums = mod_forumng::get_course_forums($course, $suser1->id, mod_forumng::UNREAD_DISCUSSIONS); // Forums contain NO discussions not read by Suser1. $this->assertFalse($s1forums[$forum1->get_id()]->has_unread_discussions()); $this->assertFalse($s1forums[$forum2->get_id()]->has_unread_discussions()); // No forumn discussions contain root posts not read by Suser1. $this->assertEquals(0, $s1forums[$forum1->get_id()]->get_num_unread_discussions()); $this->assertEquals(0, $s1forums[$forum2->get_id()]->get_num_unread_discussions()); // Set user pref so discussions/posts marked 'manually'. set_user_preference('forumng_manualmark', 1, $etuser1); set_user_preference('forumng_manualmark', 1, $suser1); // Add extra posts to both discussions with time modified offset. $posttime = $posttime + 2; $did1s1p1 = $generator->create_post(array('discussionid' => $did1[0], 'parentpostid' => $did1[1], 'userid' => $suser1->id, 'modified' => $posttime)); $did1etp1 = $generator->create_post(array('discussionid' => $did1[0], 'parentpostid' => $did1[1], 'userid' => $etuser1->id, 'modified' => $posttime)); $did1s2p1 = $generator->create_post(array('discussionid' => $did1[0], 'parentpostid' => $did1[1], 'userid' => $suser2->id, 'modified' => $posttime)); $did2s1p2 = $generator->create_post(array('discussionid' => $did2[0], 'parentpostid' => $did2[1], 'userid' => $suser1->id, 'modified' => $posttime)); $did2etp2 = $generator->create_post(array('discussionid' => $did2[0], 'parentpostid' => $did2[1], 'userid' => $etuser1->id, 'modified' => $posttime)); $did2s2p1 = $generator->create_post(array('discussionid' => $did2[0], 'parentpostid' => $did2[1], 'userid' => $suser2->id, 'modified' => $posttime)); $did1s1post1 = mod_forumng_post::get_from_id($did1s1p1->id, 0); $did2s1post2 = mod_forumng_post::get_from_id($did2s1p2->id, 0); $did1etpost1 = mod_forumng_post::get_from_id($did1etp1->id, 0); $did2etpost2 = mod_forumng_post::get_from_id($did2etp2->id, 0); $did1s2post1 = mod_forumng_post::get_from_id($did1s2p1->id, 0); $did2s2post1 = mod_forumng_post::get_from_id($did2s2p1->id, 0); // Check read status of new posts. $etforums = mod_forumng::get_course_forums($course, $etuser1->id, mod_forumng::UNREAD_DISCUSSIONS); // Discussions DO have posts not read by ET. $this->assertTrue($etforums[$forum1->get_id()]->has_unread_discussions()); $this->assertTrue($etforums[$forum2->get_id()]->has_unread_discussions()); // A number of discussions contain posts NOT read by ET. $this->assertEquals(1, $etforums[$forum1->get_id()]->get_num_unread_discussions()); $this->assertEquals(1, $etforums[$forum2->get_id()]->get_num_unread_discussions()); $s1forums = mod_forumng::get_course_forums($course, $suser1->id, mod_forumng::UNREAD_DISCUSSIONS); // Discussions DO have posts not read by Suser1. $this->assertTrue($s1forums[$forum1->get_id()]->has_unread_discussions()); $this->assertTrue($s1forums[$forum2->get_id()]->has_unread_discussions()); // A number of discussions contain posts NOT read by Suser1. $this->assertEquals(1, $s1forums[$forum1->get_id()]->get_num_unread_discussions()); $this->assertEquals(1, $s1forums[$forum2->get_id()]->get_num_unread_discussions()); // Mark posts read individually. $posttime = $posttime + 2; $did1s1post1->mark_read($posttime, $etuser1->id); // Poster suser1, reader teacher 1. $did2s1post2->mark_read($posttime, $etuser1->id); // Poster suser1, reader teacher 1. $did1etpost1->mark_read($posttime, $suser1->id); // Poster etuser1, reader suser1. $did2etpost2->mark_read($posttime, $suser1->id); // Poster etuser1, reader suser1. $did1s2post1->mark_read($posttime, $suser1->id); $did2s2post1->mark_read($posttime, $suser1->id); $did1s2post1->mark_read($posttime, $etuser1->id); $did2s2post1->mark_read($posttime, $etuser1->id); // Check read status of newly marked read posts. $etforums = mod_forumng::get_course_forums($course, $etuser1->id, mod_forumng::UNREAD_DISCUSSIONS); // Discussions have NO posts not read by ET. $this->assertFalse($etforums[$forum1->get_id()]->has_unread_discussions()); $this->assertFalse($etforums[$forum2->get_id()]->has_unread_discussions()); // No discussions contain posts not read by ET. $this->assertEquals(0, $etforums[$forum1->get_id()]->get_num_unread_discussions()); $this->assertEquals(0, $etforums[$forum2->get_id()]->get_num_unread_discussions()); $s1forums = mod_forumng::get_course_forums($course, $suser1->id, mod_forumng::UNREAD_DISCUSSIONS); // Discussions have NO posts not read by Suser1. $this->assertFalse($s1forums[$forum1->get_id()]->has_unread_discussions()); $this->assertFalse($s1forums[$forum2->get_id()]->has_unread_discussions()); // No discussions contain posts not read by Suser1. $this->assertEquals(0, $s1forums[$forum1->get_id()]->get_num_unread_discussions()); $this->assertEquals(0, $s1forums[$forum2->get_id()]->get_num_unread_discussions()); // Get read counts for ET user, includes their own posts, // also checks both query_forums() and query_discussions(). $discussion1etuser = mod_forumng_discussion::get_from_id($did1[0], 0, $etuser1->id); $etuserposts = $discussion1etuser->get_num_posts(); $this->assertEquals(1, count($etuserposts)); $unreadpostsetuser = $discussion1etuser->get_num_unread_posts(); $this->assertEquals(0, $unreadpostsetuser); $readpostsetuser = $DB->get_records('forumng_read_posts', array('userid' => $etuser1->id)); $this->assertCount(4, $readpostsetuser); $discussion2etuser = mod_forumng_discussion::get_from_id($did2[0], 0, $etuser1->id); $etuserposts = $discussion2etuser->get_num_posts(); $this->assertEquals(1, count($etuserposts)); $unreadpostsetuser = $discussion2etuser->get_num_unread_posts(); $this->assertEquals(0, $unreadpostsetuser); $readpostsetuser = $DB->get_records('forumng_read_posts', array('userid' => $etuser1->id)); $this->assertCount(4, $readpostsetuser); // Get read counts for the student user 1, includes count of their own posts. $discussion1suser1 = mod_forumng_discussion::get_from_id($did1[0], 0, $suser1->id); $suser1posts = $discussion1suser1->get_num_posts(); $this->assertEquals(1, count($suser1posts)); $unreadpostsuser1 = $discussion1suser1->get_num_unread_posts(); $this->assertEquals(0, $unreadpostsuser1); $readpostsuser1 = $DB->get_records('forumng_read_posts', array('userid' => $suser1->id)); $this->assertCount(4, $readpostsuser1); $discussion2suser1 = mod_forumng_discussion::get_from_id($did2[0], 0, $suser1->id); $suser1posts = $discussion2suser1->get_num_posts(); $this->assertEquals(1, count($suser1posts)); $unreadpostsuser1 = $discussion2suser1->get_num_unread_posts(); $this->assertEquals(0, $unreadpostsuser1); $readpostsuser1 = $DB->get_records('forumng_read_posts', array('userid' => $suser1->id)); $this->assertCount(4, $readpostsuser1); // Ensure user prefs allow discussions/posts to be marked as read 'automatically'. unset_user_preference('forumng_manualmark', $etuser1); unset_user_preference('forumng_manualmark', $suser1); // Mark read at forumn/discussion level 'automatically'. $posttime = $posttime + 2; // Mark forumn/discussion 1 read 'automatically'. $did1read = mod_forumng_discussion::get_from_id($did1[0], 0); $did1read->mark_read($posttime, $etuser1->id); $did1read->mark_read($posttime, $suser1->id); // Mark forumn/discussion 2 read 'automatically'. $did2read = mod_forumng_discussion::get_from_id($did2[0], 0); $did2read->mark_read($posttime, $suser1->id); $did2read->mark_read($posttime, $etuser1->id); // Re-check Forumn read status of forum/discussions/posts. $etforums = mod_forumng::get_course_forums($course, $etuser1->id, mod_forumng::UNREAD_DISCUSSIONS); // Forum discussions have NO posts not read by ET. $this->assertFalse($etforums[$forum1->get_id()]->has_unread_discussions('use')); $this->assertFalse($etforums[$forum2->get_id()]->has_unread_discussions()); // No forum discussion contains posts not read by ET. $this->assertEquals(0, $etforums[$forum1->get_id()]->get_num_unread_discussions()); $this->assertEquals(0, $etforums[$forum2->get_id()]->get_num_unread_discussions()); $s1forums = mod_forumng::get_course_forums($course, $suser1->id, mod_forumng::UNREAD_DISCUSSIONS); // Forum discussions have NO posts not read by S1. $this->assertFalse($s1forums[$forum1->get_id()]->has_unread_discussions()); $this->assertFalse($s1forums[$forum2->get_id()]->has_unread_discussions()); // No forum discussion contains posts not read by S1. $this->assertEquals(0, $s1forums[$forum1->get_id()]->get_num_unread_discussions()); $this->assertEquals(0, $s1forums[$forum2->get_id()]->get_num_unread_discussions()); // Add some more posts to discussion 2 only, to remain NOT MARKED manually. $posttime = $posttime + 2; $did2s1p3 = $generator->create_post(array('discussionid' => $did2[0], 'parentpostid' => $did2[1], 'userid' => $suser1->id, 'modified' => $posttime)); $did2s1post3 = mod_forumng_post::get_from_id($did2s1p3->id, 0); $did2etp3 = $generator->create_post(array('discussionid' => $did2[0], 'parentpostid' => $did2[1], 'userid' => $suser2->id, 'modified' => $posttime)); $did2etpost3 = mod_forumng_post::get_from_id($did2etp3->id, 0); // Setuser pref so discussions/posts can be marked 'manually'. set_user_preference('forumng_manualmark', 1, $etuser1); set_user_preference('forumng_manualmark', 1, $suser1); // Check read status of forum/discussions/posts. $etforums = mod_forumng::get_course_forums($course, $etuser1->id, mod_forumng::UNREAD_DISCUSSIONS); // Forumn discussion 1 has NO post not read by ET. $this->assertFalse($etforums[$forum1->get_id()]->has_unread_discussions()); $this->assertEquals(0, $etforums[$forum1->get_id()]->get_num_unread_discussions()); // Forumn discussion 2 has post NOT read by ET. $this->assertTrue($etforums[$forum2->get_id()]->has_unread_discussions()); $this->assertEquals(1, $etforums[$forum2->get_id()]->get_num_unread_discussions()); $s1forums = mod_forumng::get_course_forums($course, $suser1->id, mod_forumng::UNREAD_DISCUSSIONS); // Forumn discussions 1 has NO post unread by S1. $this->assertFalse($s1forums[$forum1->get_id()]->has_unread_discussions()); $this->assertEquals(0, $s1forums[$forum1->get_id()]->get_num_unread_discussions()); // Forumn discussion 2 DOES contain posts not read by S1. $this->assertTrue($s1forums[$forum2->get_id()]->has_unread_discussions()); $this->assertEquals(1, $s1forums[$forum2->get_id()]->get_num_unread_discussions()); // Mark only the older posts read individually. $posttime = $posttime + 2; $did1s1post1->mark_read($posttime, $etuser1->id); // Poster suser1, reader teacher 1. $did2s1post2->mark_read($posttime, $etuser1->id); // Poster suser1, reader teacher 1. $did1etpost1->mark_read($posttime, $suser1->id); // Poster etuser1, reader suser1. $did2etpost2->mark_read($posttime, $suser1->id); // Poster etuser1, reader suser1. // Get read counts for ET user, includes their own posts, // also checks both query_forums() and query_discussions(). $discussion1etuser = mod_forumng_discussion::get_from_id($did1[0], 0, $etuser1->id); $etuserposts = $discussion1etuser->get_num_posts(); $this->assertEquals(4, $etuserposts); $unreadpostsetuser = $discussion1etuser->get_num_unread_posts(); $this->assertEquals(0, $unreadpostsetuser); $readpostsetuser = $DB->get_records('forumng_read_posts', array('userid' => $etuser1->id)); $this->assertCount(2, $readpostsetuser); $discussion2etuser = mod_forumng_discussion::get_from_id($did2[0], 0, $etuser1->id); $etuserposts = $discussion2etuser->get_num_posts(); $this->assertEquals(6, $etuserposts); $unreadpostsetuser = $discussion2etuser->get_num_unread_posts(); $this->assertEquals(2, $unreadpostsetuser); // Get read counts for the student user 1, includes count of their own posts. $discussion1suser1 = mod_forumng_discussion::get_from_id($did1[0], 0, $suser1->id); $suser1posts = $discussion1suser1->get_num_posts(); $this->assertEquals(1, count($suser1posts)); $unreadpostsuser1 = $discussion1suser1->get_num_unread_posts(); $this->assertEquals(0, $unreadpostsuser1); $readpostsuser1 = $DB->get_records('forumng_read_posts', array('userid' => $suser1->id)); $this->assertCount(2, $readpostsuser1); $discussion2suser1 = mod_forumng_discussion::get_from_id($did2[0], 0, $suser1->id); $suser1posts = $discussion2suser1->get_num_posts(); $this->assertEquals(1, count($suser1posts)); $unreadpostsuser1 = $discussion2suser1->get_num_unread_posts(); $this->assertEquals(1, $unreadpostsuser1); $readpostsuser1 = $DB->get_records('forumng_read_posts', array('userid' => $suser1->id)); $this->assertCount(2, $readpostsuser1); // Check read status of forum/discussions/posts. $etforums = mod_forumng::get_course_forums($course, $etuser1->id, mod_forumng::UNREAD_DISCUSSIONS); // Forumn discussion 1 has NO posts not read by ET. $this->assertFalse($etforums[$forum1->get_id()]->has_unread_discussions()); $this->assertEquals(0, $etforums[$forum1->get_id()]->get_num_unread_discussions()); // Forumn discussion 2 contains posts NOT read by ET. $this->assertTrue($etforums[$forum2->get_id()]->has_unread_discussions()); $this->assertEquals(1, $etforums[$forum2->get_id()]->get_num_unread_discussions()); $s1forums = mod_forumng::get_course_forums($course, $suser1->id, mod_forumng::UNREAD_DISCUSSIONS); // Forumn discussion 1 has NO posts not read by S1. $this->assertFalse($etforums[$forum1->get_id()]->has_unread_discussions()); $this->assertEquals(0, $etforums[$forum1->get_id()]->get_num_unread_discussions()); // Forumn discussion 2 contains posts NOT read by S1. $this->assertTrue($etforums[$forum2->get_id()]->has_unread_discussions()); $this->assertEquals(1, $etforums[$forum2->get_id()]->get_num_unread_discussions()); // Mark forumns read 'automatically'. $forums = mod_forumng::get_course_forums($course, $etuser1->id); $posttime = $posttime + 2; $forums[$forum1->get_id()]->mark_read(0, $posttime, $etuser1->id); $forums[$forum2->get_id()]->mark_read(0, $posttime, $etuser1->id); $forums = mod_forumng::get_course_forums($course, $suser1->id); $posttime = $posttime + 2; $forums[$forum2->get_id()]->mark_read(0, $posttime, $suser1->id); $forums[$forum1->get_id()]->mark_read(0, $posttime, $suser1->id); // Check Discussion read status of forum/discussions. $etforums = mod_forumng::get_course_forums($course, $etuser1->id, mod_forumng::UNREAD_DISCUSSIONS); // Forum discussions have NO posts not read by ET. $this->assertFalse($etforums[$forum1->get_id()]->has_unread_discussions()); $this->assertFalse($etforums[$forum2->get_id()]->has_unread_discussions()); // Forum discussions contain NO posts unread by ET. $this->assertEquals(0, $etforums[$forum1->get_id()]->get_num_unread_discussions()); $this->assertEquals(0, $etforums[$forum2->get_id()]->get_num_unread_discussions()); $s1forums = mod_forumng::get_course_forums($course, $suser1->id, mod_forumng::UNREAD_DISCUSSIONS); // Forum discussions have NO posts not read by S1. $this->assertFalse($s1forums[$forum1->get_id()]->has_unread_discussions()); $this->assertFalse($s1forums[$forum2->get_id()]->has_unread_discussions()); // No Forum 1 discussion contains posts not read by S1. $this->assertEquals(0, $s1forums[$forum1->get_id()]->get_num_unread_discussions()); $this->assertEquals(0, $s1forums[$forum2->get_id()]->get_num_unread_discussions()); }
/** * Return forums on course that have unread posts for current user * * @param stdClass $course * @return array */ function forumng_get_ourecent_activity($course) { global $CFG; require_once $CFG->dirroot . '/mod/forumng/mod_forumng.php'; $forums = mod_forumng::get_course_forums($course, 0, mod_forumng::UNREAD_BINARY); $return = array(); foreach ($forums as $forum) { if ($forum->has_unread_discussions()) { $data = new stdClass(); $data->cm = $forum->get_course_module(); $data->icon = '%%unread%%'; $return[$data->cm->id] = $data; } } return $return; }
/** * Tests that discussions can be marked as read. * (unread count etc tested in test_get_course_forums()) */ public function test_mark_read() { global $USER, $DB; $this->resetAfterTest(true); $this->setAdminUser(); $adminid = $USER->id; $generator = $this->getDataGenerator()->get_plugin_generator('mod_forumng'); $course = $this->get_new_course(); $user1 = $this->get_new_user('editingteacher', $course->id); $group1 = $this->get_new_group($course->id); $group2 = $this->get_new_group($course->id); $this->get_new_group_member($group1->id, $user1->id); $this->get_new_group_member($group2->id, $user1->id); $forum1 = $this->get_new_forumng($course->id, array('groupmode' => VISIBLEGROUPS, 'shared' => true, 'cmidnumber' => 'SFGF')); $forum2 = $this->get_new_forumng($course->id, array('usesharedgroup' => array('useshared' => true, 'originalcmidnumber' => 'SFGF'))); $generator->create_discussion(array('course' => $course, 'forum' => $forum1->get_id(), 'userid' => $USER->id, 'groupid' => $group1->id)); $generator->create_discussion(array('course' => $course, 'forum' => $forum2->get_id(), 'userid' => $USER->id, 'groupid' => $group2->id)); $forums = mod_forumng::get_course_forums($course, $user1->id); $this->assertTrue($forums[$forum1->get_id()]->has_unread_discussions()); $this->assertTrue($forums[$forum2->get_id()]->has_unread_discussions()); $this->assertEquals(2, $forums[$forum1->get_id()]->get_num_unread_discussions()); $this->assertEquals(2, $forums[$forum2->get_id()]->get_num_unread_discussions()); $forums[$forum1->get_id()]->mark_read($group2->id, 0, $user1->id); $forums = mod_forumng::get_course_forums($course, $user1->id); $this->assertEquals(1, $forums[$forum1->get_id()]->get_num_unread_discussions()); $this->assertEquals(1, $forums[$forum2->get_id()]->get_num_unread_discussions()); $forums[$forum2->get_id()]->mark_read($group1->id, 0, $user1->id); $forums = mod_forumng::get_course_forums($course, $user1->id); $this->assertFalse($forums[$forum1->get_id()]->has_unread_discussions()); $this->assertFalse($forums[$forum2->get_id()]->has_unread_discussions()); }
/** * Checks timed discussions read */ public function test_timed_discussions_read() { $this->resetAfterTest(); $this->setAdminUser(); $course = $this->get_new_course('TESTTIME'); $student = $this->get_new_user('student', $course->id); $manager = $this->get_new_user('manager', $course->id); list($forum, $discussions) = $this->create_timed_discussions_forum($course->id); $sforum = mod_forumng::get_course_forums($course, $student->id); $this->assertEquals(2, $sforum[$forum->get_id()]->get_num_unread_discussions()); // Check manager (can see timed discussions). $mforum = mod_forumng::get_course_forums($course, $manager->id); $this->assertEquals(4, $mforum[$forum->get_id()]->get_num_unread_discussions()); }