MDL-12505 general advanced search cleanup + added capability test to recent activity; merged from MOODLE_19_STABLE

This commit is contained in:
skodak
2008-04-14 08:05:48 +00:00
parent 3c2bf848df
commit 6b7de0bb9b
+117 -129
View File
@@ -34,7 +34,7 @@ define ('FORUM_AGGREGATE_SUM', 5);
* will create a new instance and return the id number
* of the new instance.
* @param object $forum add forum instance (with magic quotes)
* @return int intance id
* @return int intance id
*/
function forum_add_instance($forum) {
global $CFG;
@@ -88,7 +88,7 @@ function forum_add_instance($forum) {
* (defined by the form in mod.html) this function
* will update an existing instance with new data.
* @param object $forum forum instance (with magic quotes)
* @return bool success
* @return bool success
*/
function forum_update_instance($forum) {
$forum->timemodified = time();
@@ -1099,10 +1099,15 @@ function forum_print_recent_activity($course, $viewfullnames, $timestart) {
if (!$cm->uservisible) {
continue;
}
$context = get_context_instance(CONTEXT_MODULE, $cm->id);
if (!has_capability('mod/forum:viewdiscussion', $context)) {
continue;
}
if (!empty($CFG->forum_enabletimedposts) and $USER->id != $post->duserid
and (($post->timestart > 0 and $post->timestart > time()) or ($post->timeend > 0 and $post->timeend < time()))) {
if (!has_capability('mod/forum:viewhiddentimedposts', get_context_instance(CONTEXT_MODULE, $cm->id))) {
if (!has_capability('mod/forum:viewhiddentimedposts', $context)) {
continue;
}
}
@@ -1110,7 +1115,7 @@ function forum_print_recent_activity($course, $viewfullnames, $timestart) {
$groupmode = groups_get_activity_groupmode($cm, $course);
if ($groupmode) {
if ($post->groupid == -1 or $groupmode == VISIBLEGROUPS or has_capability('moodle/site:accessallgroups', get_context_instance(CONTEXT_MODULE, $cm->id))) {
if ($post->groupid == -1 or $groupmode == VISIBLEGROUPS or has_capability('moodle/site:accessallgroups', $context)) {
// oki (Open discussions have groupid -1)
} else {
// separate mode
@@ -1254,7 +1259,7 @@ function forum_get_user_grades($forum, $userid=0) {
*
* @param object $forum null means all forums
* @param int $userid specific user only, 0 mean all
* @param boolean $nullifnone return null if grade does not exist
* @param boolean $nullifnone return null if grade does not exist
* @return void
*/
function forum_update_grades($forum=null, $userid=0, $nullifnone=true) {
@@ -1494,7 +1499,7 @@ function forum_get_all_discussion_posts($discussionid, $sort, $tracking=false) {
foreach ($posts as $pid=>$p) {
if ($tracking) {
if (forum_tp_is_post_old($p)) {
$posts[$pid]->postread = true;
$posts[$pid]->postread = true;
}
}
if (!$p->parent) {
@@ -1539,6 +1544,7 @@ function forum_get_child_posts($parent, $forumid) {
function forum_get_readable_forums($userid, $courseid=0) {
global $CFG, $USER;
require_once($CFG->dirroot.'/course/lib.php');
if (!$forummod = get_record('modules', 'name', 'forum')) {
error('The forum module is not installed');
@@ -1554,95 +1560,79 @@ function forum_get_readable_forums($userid, $courseid=0) {
$courses = array_merge($courses1, $courses2);
}
if (!$courses) {
return false;
return array();
}
$readableforums = array();
foreach ($courses as $course) {
$coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
if (!has_capability('moodle/course:viewhiddenactivities', $coursecontext)) {
$selecthidden = ' AND cm.visible = 1';
} else {
$selecthidden = '';
$modinfo =& get_fast_modinfo($course);
if (is_null($modinfo->groups)) {
$modinfo->groups = groups_get_user_groups($course->id, $userid);
}
$selectforums = "SELECT f.id AS id,
f.name AS name,
f.type AS type,
f.course AS course,
cm.id AS cmid,
cm.visible AS cmvisible,
cm.groupmode AS cmgroupmode,
cm.groupingid AS cmgroupingid,
cm.groupmembersonly AS cmgroupmembersonly
FROM {$CFG->prefix}course_modules cm,
{$CFG->prefix}forum f
WHERE cm.instance = f.id
AND cm.course = {$course->id}
AND cm.module = {$forummod->id}
$selecthidden
ORDER BY f.name ASC";
if (empty($modinfo->instances['forum'])) {
// hmm, no forums?
continue;
}
if ($forums = get_records_sql($selectforums)) {
$courseforums = get_records('forum', 'course', $course->id);
$groups = array();
if ($group = groups_get_all_groups($course->id, $userid)) {
foreach($group as $grp) {
if (isset($grp->id)) {
$groups[] = $grp->id;
foreach ($modinfo->instances['forum'] as $forumid => $cm) {
if (!$cm->uservisible or !isset($courseforums[$forumid])) {
continue;
}
$context = get_context_instance(CONTEXT_MODULE, $cm->id);
$forum = $courseforums[$forumid];
if (!has_capability('mod/forum:viewdiscussion', $context)) {
continue;
}
/// group access
if (groups_get_activity_groupmode($cm, $course) == SEPARATEGROUPS and !has_capability('moodle/site:accessallgroups', $context)) {
if (is_null($modinfo->groups)) {
$modinfo->groups = groups_get_user_groups($course->id, $USER->id);
}
if (empty($CFG->enablegroupings)) {
$forum->onlygroups = $modinfo->groups[0];
$forum->onlygroups[] = -1;
} else if (isset($modinfo->groups[$cm->groupingid])) {
$forum->onlygroups = $modinfo->groups[$cm->groupingid];
$forum->onlygroups[] = -1;
} else {
$forum->onlygroups = array(-1);
}
}
/// hidden timed discussions
$forum->viewhiddentimedposts = true;
if (!empty($CFG->forum_enabletimedposts)) {
if (!has_capability('mod/forum:viewhiddentimedposts', $context)) {
$forum->viewhiddentimedposts = false;
}
}
/// qanda access
if ($forum->type == 'qanda'
&& !has_capability('mod/forum:viewqandawithoutposting', $context)) {
// We need to check whether the user has posted in the qanda forum.
$forum->onlydiscussions = array(); // Holds discussion ids for the discussions
// the user is allowed to see in this forum.
if ($discussionspostedin = forum_discussions_user_has_posted_in($forum->id, $USER->id)) {
foreach ($discussionspostedin as $d) {
$forum->onlydiscussions[] = $d->id;
}
}
}
foreach ($forums as $forum) {
$forumcontext = get_context_instance(CONTEXT_MODULE, $forum->cmid);
if (has_capability('mod/forum:viewdiscussion', $forumcontext)) {
// Evaluate groupmode.
$cm = new object;
$cm->id = $forum->cmid;
$cm->groupmode = $forum->cmgroupmode;
$cm->groupingid = $forum->cmgroupingid;
$cm->groupmembersonly = $forum->cmgroupmembersonly;
$cm->course = $forum->course;
$forum->cmgroupmode = groups_get_activity_groupmode($cm);
if (!groups_course_module_visible($cm)) {
continue;
}
if ($forum->cmgroupmode == SEPARATEGROUPS
&& !has_capability('moodle/site:accessallgroups', $forumcontext)) {
$forum->accessallgroups = false;
$forum->accessgroup = $groups; // The user can only access
// discussions for this group.
} else {
$forum->accessallgroups = true;
}
$forum->viewhiddentimedposts
= has_capability('mod/forum:viewhiddentimedposts', $forumcontext);
if ($forum->type == 'qanda'
&& !has_capability('mod/forum:viewqandawithoutposting', $forumcontext)) {
// We need to check whether the user has posted in the qanda forum.
$forum->onlydiscussions = array(); // Holds discussion ids for the discussions
// the user is allowed to see in this forum.
if ($discussionspostedin =
forum_discussions_user_has_posted_in($forum->id, $USER->id)) {
foreach ($discussionspostedin as $d) {
array_push($forum->onlydiscussions, $d->id);
}
}
}
array_push($readableforums, $forum);
}
}
$readableforums[$forum->id] = $forum;
}
unset($modinfo);
} // End foreach $courses
//print_object($courses);
@@ -1669,52 +1659,50 @@ function forum_search_posts($searchterms, $courseid=0, $limitfrom=0, $limitnum=5
$forums = forum_get_readable_forums($USER->id, $courseid);
if (count($forums) == 0) {
$totalcount = 0;
return false;
}
for ($i=0; $i<count($forums); $i++) {
if ($i == 0) {
$selectdiscussion = " ((d.forum = {$forums[$i]->id}";
} else {
$selectdiscussion .= " OR (d.forum = {$forums[$i]->id}";
}
if (!empty($CFG->forum_enabletimedposts) && !$forums[$i]->viewhiddentimedposts) {
$now = time();
$selectdiscussion .= " AND ( d.userid = {$USER->id}
OR ((d.timestart = 0 OR d.timestart <= $now)
AND (d.timeend = 0 OR d.timeend > $now)) )";
}
if ($forums[$i]->type == 'qanda' && isset($forums[$i]->onlydiscussions)) {
// This is a qanda forum.
if (is_array($forums[$i]->onlydiscussions)) {
// Show question posts as well as posts from discussions in
// which the user has posted a reply.
if (!empty($forums[$i]->onlydiscussions)) {
$onlydiscussions = "(d.id = ".implode(' OR d.id = ', $forums[$i]->onlydiscussions).") OR";
} else {
$onlydiscussions = "";
}
$selectdiscussion .= " AND ($onlydiscussions p.parent = 0)";
} else {
// Show only the question posts.
$selectdiscussion .= ' AND (p.parent = 0)';
}
}
if (!$forums[$i]->accessallgroups) {
if (!empty($forums[$i]->accessgroup)) {
$groups = rtrim(implode(",", $forums[$i]->accessgroup),",");
$selectdiscussion .= " AND (d.groupid in ($groups)";
$selectdiscussion .= ' OR d.groupid = -1)'; // -1 means open for all groups.
} else {
// User isn't in any group. Only search discussions that are
// open to all groups.
$selectdiscussion .= ' AND d.groupid = -1';
}
}
$selectdiscussion .= ")\n";
}
$selectdiscussion .= ")";
$now = round(time(), -2); // db friendly
$fullaccess = array();
$where = array();
foreach ($forums as $forumid => $forum) {
$select = array();
if (!$forum->viewhiddentimedposts) {
$select[] = "(d.userid = {$USER->id} OR (d.timestart < $now AND (d.timeend = 0 OR d.timeend > $now)))";
}
if ($forum->type == 'qanda') {
if (!empty($forum->onlydiscussions)) {
$discussionsids = implode(',', $forum->onlydiscussions);
$select[] = "(d.id IN ($discussionsids) OR p.parent = 0)";
} else {
$select[] = "p.parent = 0";
}
}
if (!empty($forum->onlygroups)) {
$groupids = implode(',', $forum->onlygroups);
$select[] = "d.groupid IN ($groupids)";
}
if ($select) {
$selects = implode(" AND ", $select);
$where[] = "(d.forum = $forumid AND $selects)";
} else {
$fullaccess[] = $forumid;
}
}
if ($fullaccess) {
$fullids = implode(',', $fullaccess);
$where[] = "(d.forum IN ($fullids))";
}
$selectdiscussion = "(".implode(" OR ", $where).")";
// Some differences SQL
$LIKE = sql_ilike();
@@ -1836,7 +1824,7 @@ function forum_get_unmailed_posts($starttime, $endtime, $now=null) {
if (empty($now)) {
$now = time();
}
$timedsql = "AND (d.timestart < $now AND (d.timeend = 0 OR d.timeend > $now))";
$timedsql = "AND (d.timestart < $now AND (d.timeend = 0 OR d.timeend > $now))";
} else {
$timedsql = "";
}
@@ -1889,12 +1877,12 @@ function forum_get_user_posts($forumid, $userid) {
if (!has_capability('mod/forum:viewhiddentimedposts' , get_context_instance(CONTEXT_MODULE, $cm->id))) {
$now = time();
$timedsql = "AND (d.timestart < $now AND (d.timeend = 0 OR d.timeend > $now))";
}
}
}
return get_records_sql("SELECT p.*, d.forum, u.firstname, u.lastname, u.email, u.picture, u.imagealt
FROM {$CFG->prefix}forum f
JOIN {$CFG->prefix}forum_discussions d ON d.forum = f.id
JOIN {$CFG->prefix}forum_discussions d ON d.forum = f.id
JOIN {$CFG->prefix}forum_posts p ON p.discussion = d.id
JOIN {$CFG->prefix}user u ON u.id = p.userid
WHERE f.id = $forumid
@@ -1918,12 +1906,12 @@ function forum_get_user_involved_discussions($forumid, $userid) {
if (!has_capability('mod/forum:viewhiddentimedposts' , get_context_instance(CONTEXT_MODULE, $cm->id))) {
$now = time();
$timedsql = "AND (d.timestart < $now AND (d.timeend = 0 OR d.timeend > $now))";
}
}
}
return get_records_sql("SELECT DISTINCT d.*
FROM {$CFG->prefix}forum f
JOIN {$CFG->prefix}forum_discussions d ON d.forum = f.id
JOIN {$CFG->prefix}forum_discussions d ON d.forum = f.id
JOIN {$CFG->prefix}forum_posts p ON p.discussion = d.id
WHERE f.id = $forumid
AND p.userid = $userid
@@ -1945,12 +1933,12 @@ function forum_count_user_posts($forumid, $userid) {
if (!has_capability('mod/forum:viewhiddentimedposts' , get_context_instance(CONTEXT_MODULE, $cm->id))) {
$now = time();
$timedsql = "AND (d.timestart < $now AND (d.timeend = 0 OR d.timeend > $now))";
}
}
}
return get_records_sql("SELECT COUNT(p.id) AS postcount, MAX(p.modified) AS lastpost
FROM {$CFG->prefix}forum f
JOIN {$CFG->prefix}forum_discussions d ON d.forum = f.id
JOIN {$CFG->prefix}forum_discussions d ON d.forum = f.id
JOIN {$CFG->prefix}forum_posts p ON p.discussion = d.id
JOIN {$CFG->prefix}user u ON u.id = p.userid
WHERE f.id = $forumid