コード例 #1
0
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));
}
コード例 #2
0
 /**
  * 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;
 }
コード例 #3
0
 $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) {
コード例 #4
0
/**
 * 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;
}
コード例 #5
0
ファイル: lib.php プロジェクト: unikent/moodle-mod_forumng
/**
 * 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);
}
コード例 #6
0
 /**
  * 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");
         }
     }
 }
コード例 #7
0
 * @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();
コード例 #8
0
 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.
 }
コード例 #9
0
 /**
  * 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;
 }
コード例 #10
0
 /**
  * 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));
 }
コード例 #11
0
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();
}
コード例 #12
0
 /**
  * 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.");
     }
 }
コード例 #13
0
ファイル: lib.php プロジェクト: ULCC-QMUL/moodle-mod_forumng
 /**
  * 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;
 }