function forumng_delete_instance($id) { global $DB; require_once dirname(__FILE__) . '/mod_forumng.php'; $cm = get_coursemodule_from_instance('forumng', $id); $forum = mod_forumng::get_from_id($id, mod_forumng::CLONE_DIRECT, true, $cm); $forum->delete_all_data(); if (mod_forumng::search_installed()) { $cm = $forum->get_course_module(); local_ousearch_document::delete_module_instance_data($cm); } if ($forum->is_shared()) { // Find all the clone instances. $clones = $forum->get_clone_details(); $transaction = $DB->start_delegated_transaction(); foreach ($clones as $clone) { if (!forumng_delete_instance($clone->cloneforumngid)) { notify("Could not delete the Clone forumng (id) {$clone->cloneforumngid} "); return false; } if (!delete_course_module($clone->context->instanceid)) { notify("Could not delete the Clone\n forumng (coursemoduleid) {$clone->context}->instanceid "); return false; } if (!delete_mod_from_section($clone->context->instanceid, $clone->sectionid)) { notify("Could not delete the sectionid {$clone->sectionid} from that section"); return false; } rebuild_course_cache($clone->courseid, true); } $transaction->allow_commit(); } return $DB->delete_records('forumng', array('id' => $id)); }
/** * Obtains a discussion from the cache. * @param object $info Object from session cache * @return mod_forumng_discussion New discussion object or null if there is a * problem and you should re-cache */ private static function create_from_cache($info) { $discussionfields = unserialize($info->discussionfields); $forum = mod_forumng::get_from_id($discussionfields->forumngid, $info->cloneid); if ($forum->get_settings_hash() != $info->settingshash) { return null; } $result = new mod_forumng_discussion($forum, $discussionfields, true, $info->userid); $result->groupscache = unserialize($info->groupscache); $result->postscache = $info->postscache; $result->incache = true; return $result; }
$draft = null; $replytoid = 0; $cmid = 0; $groupid = 0; $forum = null; if ($draftid = optional_param('draft', 0, PARAM_INT)) { $pageparams['draft'] = $draftid; $draft = mod_forumng_draft::get_from_id($draftid); // Draft post must be for current user! if ($draft->get_user_id() != $USER->id) { print_error('draft_mismatch', 'forumng'); } if ($draft->is_reply()) { $replytoid = $draft->get_parent_post_id(); } else { $forum = mod_forumng::get_from_id($draft->get_forumng_id(), optional_param('clone', 0, PARAM_INT)); $groupid = $draft->get_group_id(); } } if ($forum || ($cmid = optional_param('id', 0, PARAM_INT))) { // For new discussions, id (forum cmid) and groupid are required (groupid // may be mod_forumng::ALL_GROUPS if required) if ($forum) { // Came from draft post $cmid = $forum->get_course_module_id(); } else { $pageparams['id'] = $cmid; $forum = mod_forumng::get_from_cmid($cmid, $cloneid); } if ($forum->get_group_mode()) { if (!$draft) {
/** * Get search results. * @param object $course * @param string $author * @param int $daterangefrom * @param int $daterangeto * @param int $page * @param int $resultsperpage (FORUMNG_SEARCH_RESULTSPERPAGE used as constant) * @return object */ function forumng_get_results_for_all_forums($course, $author = null, $daterangefrom = 0, $daterangeto = 0, $page, $asmoderator = false, $resultsperpage = FORUMNG_SEARCH_RESULTSPERPAGE) { $before = microtime(true); global $CFG, $DB, $USER; require_once $CFG->dirroot . '/mod/forumng/mod_forumng.php'; // Get all forums $modinfo = get_fast_modinfo($course); $visibleforums = array(); $accessallgroups = array(); foreach ($modinfo->cms as $cmid => $cm) { if ($cm->modname === 'forumng' && $cm->uservisible) { $visibleforums[$cm->instance] = $cm->groupmode; // Check access all groups for this forum, if they have it, add to list $forum = mod_forumng::get_from_id($cm->instance, mod_forumng::CLONE_DIRECT); if ($forum->get_group_mode() == SEPARATEGROUPS) { if (has_capability('moodle/site:accessallgroups', $forum->get_context())) { $accessallgroups[] = $cm->instance; } } } } $forumngids = array_keys($visibleforums); $separategroupsforumngids = array_keys($visibleforums, SEPARATEGROUPS); $params = array(); list($inforumngids, $moreparams) = mod_forumng_utils::get_in_array_sql('d.forumngid', $forumngids); $where = "WHERE {$inforumngids}"; $params = array_merge($params, $moreparams); list($inseparategroups, $moreparams) = mod_forumng_utils::get_in_array_sql('d.forumngid', $separategroupsforumngids); $where .= " AND ((NOT ({$inseparategroups}))"; $params = array_merge($params, $moreparams); list($inaccessallgroups, $moreparams) = mod_forumng_utils::get_in_array_sql('d.forumngid', $accessallgroups); $where .= " OR {$inaccessallgroups}"; $params = array_merge($params, $moreparams); $where .= " OR gm.id IS NOT NULL"; $where .= " OR d.groupid IS NULL)"; // Note: Even if you have capability to view the deleted or timed posts, // we don't show them for consistency with the full-text search. $currenttime = time(); $where .= " AND (? >= d.timestart OR d.timestart = 0)"; $params[] = $currenttime; $where .= " AND (? < d.timeend OR d.timeend = 0)"; $params[] = $currenttime; // Exclude older post versions. $where .= " AND p.oldversion = 0 "; $where .= " AND d.deleted = 0 AND p.deleted = 0 "; if (!empty($author)) { $coursecontext = context_course::instance($course->id); $seeanon = has_capability('mod/forumng:postanon', $coursecontext); if ($asmoderator) { if ($seeanon) { $where .= " AND p.asmoderator > ? "; $params[] = mod_forumng::ASMODERATOR_NO; } else { $where .= " AND p.asmoderator = ? "; $params[] = mod_forumng::ASMODERATOR_IDENTIFY; } } else { if (!$seeanon) { $where .= " AND p.asmoderator != ? "; $params[] = mod_forumng::ASMODERATOR_ANON; } } } if ($author) { list($morewhere, $moreparams) = forumng_get_author_sql($author); $where .= $morewhere; $params = array_merge($params, $moreparams); } if ($daterangefrom && !is_array($daterangefrom)) { $where .= " AND p.modified>=?"; $params[] = $daterangefrom; } if ($daterangeto && !is_array($daterangeto)) { $where .= " AND p.modified<=?"; $params[] = $daterangeto; } $sql = "SELECT p.modified, p.id, p.discussionid, gm.id AS useringroup,\n p.userid, p.parentpostid, p.subject AS title, p.message AS summary, u.username,\n u.firstname, u.lastname, d.forumngid, d.groupid, p2.subject AS discussionsubject\n FROM {forumng_posts} p\n INNER JOIN {forumng_discussions} d ON d.id = p.discussionid\n INNER JOIN {forumng_posts} p2 ON p2.id = d.postid\n INNER JOIN {user} u ON p.userid = u.id\n LEFT JOIN {groups_members} gm ON gm.groupid = d.groupid AND gm.userid = {$USER->id}\n {$where}\n ORDER BY p.modified DESC, p.id ASC"; $results = new stdClass(); $results->success = 1; $results->numberofentries = 0; $results->done = 0; $posts = $DB->get_records_sql($sql, $params, $page, $resultsperpage); foreach ($posts as $post) { if (!$post->title) { // Ideally we would get the parent post that has a subject, but // this could involve a while loop that might make numeroous // queries, so instead, let's just use the discussion subject $post->title = get_string('re', 'forumng', $post->discussionsubject); } $post->title = s(strip_tags($post->title)); $post->summary = s(strip_tags(shorten_text($post->summary, 250))); $post->url = $CFG->wwwroot . "/mod/forumng/discuss.php?d={$post->discussionid}" . $forum->get_clone_param(mod_forumng::PARAM_PLAIN) . "#p{$post->id}"; } $results->results = $posts; $results->searchtime = microtime(true) - $before; $results->numberofentries = count($results->results); if (count($results->results) < $resultsperpage) { $results->done = 1; } else { if (!($extrapost = $DB->get_records_sql($sql, $params, $page + $resultsperpage, 1))) { $results->done = 1; } } return $results; }
/** * Update activity grades. * * @param stdClass $forumng database record * @param int $userid specific user only, 0 means all * @param bool $nullifnone - not used */ function forumng_update_grades($forumng, $userid = 0, $nullifnone = true) { require_once dirname(__FILE__) . '/mod_forumng.php'; $cm = get_coursemodule_from_instance('forumng', $forumng->id); $forum = mod_forumng::get_from_id($forumng->id, mod_forumng::CLONE_DIRECT, true, $cm); $forum->update_grades($userid, null); }
/** * Either delete or archive old discussions based on the forum setting */ public static function archive_old_discussions() { global $CFG, $DB; $now = time(); $housekeepingquery = "\nFROM\n {forumng_discussions} fd\n INNER JOIN {forumng_posts} fp ON fd.lastpostid = fp.id\n INNER JOIN {forumng} f ON fd.forumngid = f.id\nWHERE\n f.removeafter<>0 AND fd.sticky<>1 AND fp.modified<? - f.removeafter\n"; $housekeepingparams = array($now); $count = $DB->count_records_sql("SELECT COUNT(1) {$housekeepingquery}", $housekeepingparams); if ($count) { if (!PHPUNIT_TEST) { mtrace("\nBeginning processing {$count} discussion archiving/deleting requests"); } $housekeepingrs = $DB->get_recordset_sql("\nSELECT\n fd.id AS discussionid, f.id AS forumngid, f.removeafter, f.removeto\n{$housekeepingquery}\nORDER BY f.removeto", $housekeepingparams); $targetforum = null; $targetcourseid = null; $cronlog = ''; $discussionmovecount = 0; $discussiondeletecount = 0; $discussionautolocked = 0; foreach ($housekeepingrs as $rec) { $discussion = mod_forumng_discussion::get_from_id($rec->discussionid, mod_forumng::CLONE_DIRECT); if ($rec->removeto) { if ($rec->removeto == -1) { // Locked record or discussion deleted. if ($discussion->is_locked() || $discussion->is_auto_locked() || $discussion->is_deleted()) { continue; } else { $end = $discussion->get_time_end(); $canautolock = true; // Check to see whether time now is beyond the end time. if ($end > $now) { $canautolock = false; } if ($canautolock) { // Lock record. $discussion->auto_lock(); $discussionautolocked++; } else { continue; } } } else { // Moving to a different forum. $forum = $discussion->get_forum(); $course = $forum->get_course(); $modinfo = get_fast_modinfo($course); if ($forum->can_archive_forum($modinfo, $cronlog)) { // Do not get the target forum and course id again // if the target forum is the same. if (!$targetforum || $targetforum->get_id() != $rec->removeto) { $targetforum = mod_forumng::get_from_id($rec->removeto, mod_forumng::CLONE_DIRECT); $targetforum = $targetforum->get_real_forum(); } // Target discussion groupid must be the same as the original groupid. $targetgroupmode = $targetforum->get_group_mode(); $targetgroupid = $targetgroupmode ? $discussion->get_group_id() : null; $discussion->move($targetforum, $targetgroupid); $discussionmovecount++; } } } else { // Delete all discussions and relevant data permanently. $discussion->permanently_delete(); $discussiondeletecount++; } } $housekeepingrs->close(); if (!PHPUNIT_TEST) { mtrace("\n {$discussionmovecount} discussions have been archived and " . "{$discussiondeletecount} discussions have been deleted permanently and " . "{$discussionautolocked} discussions have been automatically locked"); } } }
* @package mod * @subpackage forumng * @copyright 2011 The Open University * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once '../../config.php'; require_once 'mod_forumng.php'; $draftid = required_param('draft', PARAM_INT); $pageparams = array('draft' => $draftid); $cloneid = optional_param('clone', 0, PARAM_INT); if ($cloneid) { $pageparams['clone'] = $cloneid; } // Load draft and forum $draft = mod_forumng_draft::get_from_id($draftid); $forum = mod_forumng::get_from_id($draft->get_forumng_id(), $cloneid); $course = $forum->get_course(); $cm = $forum->get_course_module(); $pagename = get_string('deletedraft', 'forumng'); $out = $forum->init_page(new moodle_url('/mod/forumng/deletedraft.php', $pageparams), $pagename); // Check it belongs to current user if ($USER->id != $draft->get_user_id()) { print_error('draft_mismatch', 'forumng'); } // If they are actually deleting it, go ahead if ($_SERVER['REQUEST_METHOD'] == 'POST') { $draft->delete($forum->get_context(true)); redirect($forum->get_url(mod_forumng::PARAM_PLAIN)); } // Confirm page. Work out navigation for header print $out->header();
public function test_tag_discussion() { global $DB, $USER, $SITE, $CFG; require_once $CFG->dirroot . '/tag/lib.php'; $this->resetAfterTest(true); $this->setAdminUser(); // Create the generator object and do standard checks. $generator = self::getDataGenerator()->get_plugin_generator('mod_forumng'); // Create course. $record = new stdClass(); $record->shortname = 'testcourse'; $course = self::getDataGenerator()->create_course($record); // Create groups. $group1 = $this->get_new_group($course->id); $group2 = $this->get_new_group($course->id); // Create forum. $forumrecord = $generator->create_instance(array('course' => $course->id, 'tags' => true, 'groupmode' => VISIBLEGROUPS)); $forum = mod_forumng::get_from_id($forumrecord->id, mod_forumng::CLONE_DIRECT, true); // Set use tag. $CFG->usetags = true; // Set forum to tag enabling. $this->assertTrue($CFG->usetags); $this->assertEquals(true, $forum->get_tags_enabled()); // Start a discussion in forum (group1). $record = new stdClass(); $record->course = $course->id; $record->forum = $forum->get_id(); $record->groupid = $group1->id; $record->userid = $USER->id; $record->timestart = time(); $ids1 = $generator->create_discussion($record); // Start a second discussion in forum (group1). $record = new stdClass(); $record->course = $course->id; $record->forum = $forum->get_id(); $record->groupid = $group1->id; $record->userid = $USER->id; $record->timestart = time(); $ids2 = $generator->create_discussion($record); // Start a third discussion in forum (group2). $record = new stdClass(); $record->course = $course->id; $record->forum = $forum->get_id(); $record->groupid = $group2->id; $record->userid = $USER->id; $record->timestart = time(); $ids3 = $generator->create_discussion($record); // Set up tags in each discussion. $discussionid = $ids1[0]; $discussion = mod_forumng_discussion::get_from_id($discussionid, 0); $this->assertEmpty($discussion->get_tags()); // Edit discussion settings. $discussion->edit_settings($discussion::NOCHANGE, $discussion::NOCHANGE, $discussion::NOCHANGE, $discussion::NOCHANGE, $discussion::NOCHANGE, array('tag1', 'tag2', 'tag3')); $tags1 = $discussion->get_tags(); $this->assertCount(3, $tags1); $discussion1 = $discussion; $discussionid = $ids2[0]; $discussion = mod_forumng_discussion::get_from_id($discussionid, 0); $this->assertEmpty($discussion->get_tags()); // Edit discussion settings. $discussion->edit_settings(mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, array('tag1', 'tag2')); $tags2 = $discussion->get_tags(); $this->assertCount(2, $tags2); $discussion2 = $discussion; $discussionid = $ids3[0]; $discussion = mod_forumng_discussion::get_from_id($discussionid, 0); $this->assertEmpty($discussion->get_tags()); // Edit discussion settings. $discussion->edit_settings(mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, array('tag1')); $tags3 = $discussion->get_tags(); $this->assertCount(1, $tags3); $discussion3 = $discussion; // Create a discussion with no tags for later use. $record = new stdClass(); $record->course = $course->id; $record->forum = $forum->get_id(); $record->groupid = $group2->id; $record->userid = $USER->id; $record->timestart = time(); $ids4 = $generator->create_discussion($record); // Get id of 'tag1'. $tagid = array_search('tag1', $tags3); // Get all tags and check on numbers for each tag. $tagsused = $forum->get_tags_used(); $this->assertCount(3, $tagsused); $tagsused1 = $forum->get_tags_used($group1->id); $this->assertCount(3, $tagsused1); $tagsused2 = $forum->get_tags_used($group2->id); $this->assertCount(1, $tagsused2); $this->assertArrayHasKey($tagid, $tagsused2); $this->assertObjectHasAttribute('displayname', $tagsused2[$tagid]); $this->assertObjectHasAttribute('count', $tagsused2[$tagid]); $this->assertEquals('tag1', $tagsused2[$tagid]->displayname); $this->assertEquals(1, $tagsused2[$tagid]->count); // Get all discussions featuring 'tag1'. $list = $forum->get_discussion_list(mod_forumng::ALL_GROUPS, $forum->can_view_hidden(), 1, mod_forumng::SORT_DATE, false, 0, true, $tagid); $taggedlist = $list->get_normal_discussions(); $this->assertCount(3, $taggedlist); // Get all discussions featuring 'tag1'.for group1. $list1 = $forum->get_discussion_list($group1->id, $forum->can_view_hidden(), 1, mod_forumng::SORT_DATE, false, 0, true, $tagid); $taggedlist1 = $list1->get_normal_discussions(); $this->assertCount(2, $taggedlist1); // Get all discussions featuring 'tag1'.for group2. $list2 = $forum->get_discussion_list($group2->id, $forum->can_view_hidden(), 1, mod_forumng::SORT_DATE, false, 0, true, $tagid); $taggedlist2 = $list2->get_normal_discussions(); $this->assertCount(1, $taggedlist2); // Get all discussions featuring 'tag3'.for group2 - which should be none. $tagid = array_search('tag3', $tags1); $list = $forum->get_discussion_list($group2->id, $forum->can_view_hidden(), 1, mod_forumng::SORT_DATE, false, 0, true, $tagid); $taggedlist = $list->get_normal_discussions(); $this->assertCount(0, $taggedlist); // Set tags specifically for group 1. $forumng = new stdClass(); $forumng->settags = array('g1 vamp', 'g1 zomb', 'g1 mumm', 'g1 damm'); $forumng->id = $forum->get_id(); $forumng->instance = $forum->get_id(); $forumng->tags = 1; forumng_update_instance($forumng); $context = $forum->get_context(); mod_forumng::set_group_tags($forum->get_id(), $group1->id, $forumng->settags); $tagsused1 = $forum::get_set_tags($forumng->id, $group1->id); $this->assertCount(4, $tagsused1); // Set tags for group 2 (should return main set tags also). $g2tags = array('g2 ghost', 'g2 ghoul', 'g2 googl', 'g2 welf', 'g2 gobb'); mod_forumng::set_group_tags($forum->get_id(), $group2->id, $g2tags); $tagsused2 = $forum::get_set_tags($forumng->id, $group2->id); $this->assertCount(9, $tagsused2); $tagsused3 = $forum::get_set_tags($forumng->id); $this->assertCount(4, $tagsused3); // Test that group only tags can be returned. $tagsused1 = $forum::get_set_tags($forumng->id, $group1->id, true); $this->assertCount(4, $tagsused1); $tagsused2 = $forum::get_set_tags($forumng->id, $group2->id, true); $this->assertCount(5, $tagsused2); // Need to test permanently delete. $discussionid = $ids4[0]; $discussion = mod_forumng_discussion::get_from_id($discussionid, 0); $this->assertEmpty($discussion->get_tags()); // Edit discussion settings. $discussion->edit_settings(mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, array('t1', 't2', 't3')); $tags4 = $discussion->get_tags(); $this->assertCount(3, $tags4); $discussion4 = $discussion; // Delete discussion. $discussion4->permanently_delete(false); $this->assertFalse($DB->get_record('forumng_discussions', array('id' => $discussion->get_id()))); $this->assertEmpty($DB->get_records('tag_instance', array('itemid' => $discussion->get_id(), 'itemtype' => 'forumng discussions'))); // Test group tag setting. $user2 = $this->get_new_user(); $this->setUser($user2); mod_forumng::set_group_tags($forumng->id, $group1->id, array('t1', 'tnew')); $tagsused = $forum::get_set_tags($forumng->id, $group1->id, true); $this->assertCount(2, $tagsused); mod_forumng::set_group_tags($forumng->id, $group1->id, array('t1')); $tagsused = $forum::get_set_tags($forumng->id, $group1->id, true); $this->assertCount(1, $tagsused); // Create a new forum and add same group tags. $forumrecord2 = $generator->create_instance(array('course' => $course->id, 'tags' => true, 'groupmode' => VISIBLEGROUPS)); $forum2 = mod_forumng::get_from_id($forumrecord2->id, mod_forumng::CLONE_DIRECT, true); mod_forumng::set_group_tags($forumrecord2->id, $group1->id, array('t1')); $tagsused = $forum::get_set_tags($forumrecord2->id, $group1->id, true); $this->assertCount(1, $tagsused); // Create a new forum and add same group tags (should use another user). $forumrecord2 = $generator->create_instance(array('course' => $course->id, 'tags' => true, 'groupmode' => VISIBLEGROUPS)); $forum2 = mod_forumng::get_from_id($forumrecord2->id, mod_forumng::CLONE_DIRECT, true); mod_forumng::set_group_tags($forumrecord2->id, $group1->id, array('t1')); $tagsused = $forum::get_set_tags($forumrecord2->id, $group1->id, true); $this->assertCount(1, $tagsused); // Create a new forum and add same group tags (should fail as ou of users). $forumrecord2 = $generator->create_instance(array('course' => $course->id, 'tags' => true, 'groupmode' => VISIBLEGROUPS)); $forum2 = mod_forumng::get_from_id($forumrecord2->id, mod_forumng::CLONE_DIRECT, true); $this->setExpectedException('moodle_exception'); mod_forumng::set_group_tags($forumrecord2->id, $group1->id, array('t1')); // Do not add any tests after this point as exception called above. }
/** * Create new forumng instance using generator, returns instance record + cm * @param int $courseid * @param array $options * @return mod_forumng */ public function get_new_forumng($courseid, $options = null) { global $CFG, $DB; require_once $CFG->dirroot . '/mod/forumng/mod_forumng.php'; if (is_null($options)) { $options = array(); } else { $options = (array) $options; } $options['course'] = $courseid; $generator = $this->getDataGenerator()->get_plugin_generator('mod_forumng'); $forum = $generator->create_instance((object) $options); $this->assertNotEmpty($forum); $cm = get_coursemodule_from_instance('forumng', $forum->id); $this->assertNotEmpty($cm); $clone = mod_forumng::CLONE_DIRECT; if (!empty($options['usesharedgroup']['originalcmidnumber'])) { // Clone forum - swap forum id into clone and find original. if ($origcm = $DB->get_record('course_modules', array('idnumber' => $options['usesharedgroup']['originalcmidnumber'], 'module' => $DB->get_field('modules', 'id', array('name' => 'forumng'))))) { $clone = $cm->id; $forum->id = $DB->get_field('forumng', 'id', array('id' => $origcm->instance), MUST_EXIST); } } $forum = mod_forumng::get_from_id($forum->id, $clone, true); return $forum; }
/** * Test subscription functions. * Also tests removing user from group and course. * Does not test discussion level subscription. */ public function test_subscription() { global $USER, $DB; $this->assertEquals('array', gettype(mod_forumng::get_subscription_options())); $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); $user2 = $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, $user1->id); $this->get_new_group_member($group2->id, $user1->id); $this->get_new_group_member($group2->id, $user2->id); $forum1 = $this->get_new_forumng($course->id, array('groupmode' => VISIBLEGROUPS, 'subscription' => mod_forumng::SUBSCRIPTION_PERMITTED)); $forum2 = $this->get_new_forumng($course->id, array('groupmode' => VISIBLEGROUPS, 'subscription' => mod_forumng::SUBSCRIPTION_FORCED)); $forum3 = $this->get_new_forumng($course->id, array('groupmode' => VISIBLEGROUPS, 'subscription' => mod_forumng::SUBSCRIPTION_INITIALLY_SUBSCRIBED)); $forum4 = $this->get_new_forumng($course->id, array('groupmode' => VISIBLEGROUPS, 'subscription' => mod_forumng::SUBSCRIPTION_NOT_PERMITTED)); set_config('forumng_subscription', mod_forumng::SUBSCRIPTION_FORCED); $this->assertEquals(mod_forumng::SUBSCRIPTION_FORCED, $forum1->get_effective_subscription_option()); set_config('forumng_subscription', -1); $this->assertEquals(mod_forumng::SUBSCRIPTION_PERMITTED, $forum1->get_effective_subscription_option()); $this->assertEquals(mod_forumng::SUBSCRIPTION_FORCED, $forum2->get_effective_subscription_option()); $this->assertEquals(mod_forumng::SUBSCRIPTION_INITIALLY_SUBSCRIBED, $forum3->get_effective_subscription_option()); $this->assertEquals(mod_forumng::SUBSCRIPTION_NOT_PERMITTED, $forum4->get_effective_subscription_option()); $this->assertFalse($forum2->is_forced_to_subscribe()); $this->assertFalse($forum3->is_initially_subscribed()); $this->assertTrue($forum2->is_forced_to_subscribe($user1->id)); $this->assertTrue($forum3->is_initially_subscribed($user1->id)); $this->assertEmpty($forum1->get_auto_subscribers()); $this->assertEmpty($forum4->get_auto_subscribers()); $this->assertCount(2, $forum2->get_auto_subscribers()); $this->assertCount(2, $forum3->get_auto_subscribers()); $this->assertEmpty($forum1->get_subscribers()); $this->assertEmpty($forum4->get_subscribers()); $this->assertCount(1, $forum2->get_subscribers($group1->id)); $this->assertCount(2, $forum2->get_subscribers()); $this->assertCount(2, $forum3->get_subscribers()); $this->assertFalse($forum1->get_subscription_info($user1->id)->wholeforum); $this->assertTrue($forum2->get_subscription_info($user1->id)->wholeforum); $this->assertTrue($forum3->get_subscription_info($user1->id)->wholeforum); $this->assertTrue($forum2->get_subscription_info($user2->id)->wholeforum); $this->assertTrue($forum3->get_subscription_info($user2->id)->wholeforum); $this->assertFalse($forum4->get_subscription_info($user1->id)->wholeforum); $forum1->subscribe($user1->id, $group1->id, true); $forum1->subscribe($user1->id, $group2->id); $this->assertArrayHasKey($group1->id, $forum1->get_subscription_info($user1->id)->groupids); $this->assertArrayHasKey($group2->id, $forum1->get_subscription_info($user1->id)->groupids); $this->assertCount(1, $forum1->get_subscribers()); $forum1->unsubscribe($user1->id, $group1->id, true); $forum1->subscribe($user1->id); $this->assertEmpty($forum1->get_subscription_info($user1->id)->groupids); $this->assertTrue($forum1->get_subscription_info($user1->id)->wholeforum); $this->assertCount(1, $forum1->get_subscribers()); $forum1->unsubscribe($user1->id); $forum1->subscribe($user1->id, $group2->id); groups_remove_member($group2, $user1); $this->assertEmpty($forum1->get_subscribers($group2->id)); $forum1->subscribe($user1->id); $role = $DB->get_record('role', array('shortname' => 'editingteacher')); role_unassign($role->id, $user1->id, context_course::instance($course->id)->id); $this->assertEmpty($forum1->get_subscribers()); // Test can subscribe (private) via can_change_subscription(). $forum = mod_forumng::get_from_id($forum1->get_id(), mod_forumng::CLONE_DIRECT); $this->assertFalse($forum->can_change_subscription($user1->id)); }
function make_forumng($courseid, $starttime, $discussions, $posts, $readpercent, $readusers, &$userids, $subscribepercent, $ratingpercent) { global $DB; $section = $DB->get_record('course_sections', array('course' => $courseid, 'section' => 0), '*', MUST_EXIST); $transaction = $DB->start_delegated_transaction(); // Create course modules record $mod = new stdClass(); $mod->course = $courseid; $mod->module = $DB->get_field('modules', 'id', array('name' => 'forumng')); $mod->section = $section->section; // was $section->id; logical but incorrect! $mod->added = $starttime; $mod->visible = 1; // course_modules and course_sections each contain a reference // to each other, so we have to update one of them twice. // Note: This is unbelievable!!! $mod->section MUST BE section number (not id) // Adds course_module with section number, add_mod_to_section uses // section number (& course id) to get section id, which is returned // course module record then updated to replace section number by id!!! if (!($mod->coursemodule = add_course_module($mod))) { throw new Exception("Could not add a new course module"); } if (!($sectionid = course_add_cm_to_section($mod->course, $mod->coursemodule, $mod->section))) { throw new Exception("Could not add the new course module to that section"); } // Create forum object $forumng = new stdClass(); static $index = 0; $index++; $forumng->name = 'Perf test ' . date('Ymd H:j', $starttime) . ' ' . $index; $forumng->course = $courseid; $forumng->section = $section; $forumng->cmidnumber = $mod->coursemodule; if (!($forumng->id = forumng_add_instance($forumng))) { throw new dml_exception('Failed to add forum'); } // Mark cm object as owning it $updatemod = new stdClass(); $updatemod->id = $mod->coursemodule; $updatemod->instance = $forumng->id; $updatemod->section = $sectionid; $DB->update_record('course_modules', $updatemod); // Make it be random users included in the forum shuffle($userids); // OK, forum is created. Let's make discussions $forum = mod_forumng::get_from_id($forumng->id, mod_forumng::CLONE_DIRECT); $count = my_random($discussions); for ($i = 0; $i < $count; $i++) { make_discussion($forum, $posts, my_random_percentage($readpercent) ? $readusers : 0, $userids, $ratingpercent); } // Add subscribe users set_time_limit(200); for ($i = 0; $i < $readusers; $i++) { if (my_random_percentage($subscribepercent)) { $forum->subscribe($userids[$i]); } } $transaction->allow_commit(); }
/** * Either delete or archive old discussions based on the forum setting */ static function archive_old_discussions() { global $CFG, $DB; $now = time(); $housekeepingquery = "\nFROM\n {forumng_discussions} fd\n INNER JOIN {forumng_posts} fp ON fd.lastpostid = fp.id\n INNER JOIN {forumng} f ON fd.forumngid = f.id\nWHERE\n f.removeafter<>0 AND fd.sticky<>1 AND fp.modified<? - f.removeafter\n"; $housekeepingparams = array($now); $count = $DB->count_records_sql("SELECT COUNT(1) {$housekeepingquery}", $housekeepingparams); if ($count) { mtrace("\nBeginning processing {$count} discussion archiving/deleting requests"); $housekeepingrs = $DB->get_recordset_sql("\nSELECT\n fd.id AS discussionid, f.id AS forumngid, f.removeafter, f.removeto\n{$housekeepingquery}\nORDER BY f.removeto", $housekeepingparams); $targetforum = null; $targetcourseid = null; $cronlog = ''; $discussionmovecount = 0; $discussiondeletecount = 0; foreach ($housekeepingrs as $rec) { $discussion = mod_forumng_discussion::get_from_id($rec->discussionid, mod_forumng::CLONE_DIRECT); if ($rec->removeto) { //moving to a different forum $forum = $discussion->get_forum(); $course = $forum->get_course(); $modinfo = get_fast_modinfo($course); if ($forum->can_archive_forum($modinfo, $cronlog)) { // Do not get the target forum and course id again // if the target forum is the same if (!$targetforum || $targetforum->get_id() != $rec->removeto) { $targetforum = mod_forumng::get_from_id($rec->removeto, mod_forumng::CLONE_DIRECT); $targetforum = $targetforum->get_real_forum(); } //target discussion groupid must be the same as the original groupid $targetgroupmode = $targetforum->get_group_mode(); $targetgroupid = $targetgroupmode ? $discussion->get_group_id() : null; $discussion->move($targetforum, $targetgroupid); $discussionmovecount++; } } else { //Delete all discussions and relevant data permanently $discussion->permanently_delete(); $discussiondeletecount++; } } $housekeepingrs->close(); mtrace("\n {$discussionmovecount} discussions have been archived and " . "{$discussiondeletecount} discussions have been deleted permanently."); } }
/** * Function to create a dummy discussion. * * @param array|stdClass $record * @return stdClass the discussion object */ public function create_discussion($record = null) { global $CFG; require_once $CFG->dirroot . '/mod/forumng/mod_forumng.php'; // Increment the forum discussion count. $this->forumdiscussioncount++; $record = (array) $record; if (!isset($record['course'])) { throw new coding_exception('course must be present, in mod_forumng_generator::create_discussion() $record'); } if (!isset($record['forum'])) { throw new coding_exception('forum must be present, in mod_forumng_generator::create_discussion() $record'); } if (!isset($record['userid'])) { throw new coding_exception('userid must be present, in mod_forumng_generator::create_discussion() $record'); } if (!isset($record['groupid'])) { $record['groupid'] = -1; } if (!isset($record['subject'])) { $record['subject'] = "Subject for discussion " . $this->forumdiscussioncount; } if (!isset($record['message'])) { $record['message'] = html_writer::tag('p', 'Message for discussion ' . $this->forumdiscussioncount); } if (!isset($record['format'])) { $record['format'] = FORMAT_MOODLE; } if (!isset($record['timestart'])) { $record['timestart'] = 0; } if (!isset($record['timeend'])) { $record['timeend'] = 0; } // Get a forum object. $forum = mod_forumng::get_from_id($record['forum'], mod_forumng::CLONE_DIRECT); // Create the discussion. $discussionid = $forum->create_discussion($record['groupid'], $record['subject'], $record['message'], $record['format'], false, false, $record['timestart'], $record['timeend'], false, false, $record['userid']); return $discussionid; }