Index: lib/weblib.php =================================================================== RCS file: /cvsroot/moodle/moodle/lib/weblib.php,v retrieving revision 1.812.2.88 diff -u -F^f -u -F^f -r1.812.2.88 weblib.php --- lib/weblib.php 12 Oct 2007 09:18:22 -0000 1.812.2.88 +++ lib/weblib.php 30 Nov 2007 06:12:27 -0000 @@ -3330,7 +3330,10 @@ function print_file_picture($path, $cour /** * Print the specified user's avatar. * - * @param int $userid ? + * If you pass a $user object that has id, picture, imagealt, firstname, lastname + * you save a DB query. + * + * @param int $userid takes a userid, or a userobj * @param int $courseid ? * @param boolean $picture Print the user picture? * @param int $size Size in pixels. Special values are (true/1 = 100px) and (false/0 = 35px) for backward compatability @@ -3341,14 +3344,46 @@ function print_file_picture($path, $cour * return string * @todo Finish documenting this function */ -function print_user_picture($userid, $courseid, $picture, $size=0, $return=false, $link=true, $target='', $alttext=true) { +function print_user_picture($user, $courseid, $picture=NULL, $size=0, $return=false, $link=true, $target='', $alttext=true) { global $CFG, $HTTPSPAGEREQUIRED; + $needrec = false; + // only touch the DB if we are missing data... + if (is_object($user)) { + // Note - both picture and imagealt _can_ be empty + // what we are trying to see here is if they have been fetched + // from the DB. We should use isset() _except_ that some installs + // have those fields as nullable, and isset() will return false + // on null. The only safe thing is to ask array_key_exists() + // which works on objects. property_exists() isn't quite + // what we want here... + if (! (array_key_exists('picture', $user) + && ($alttext && array_key_exists('imagealt', $user) + || (isset($user->firstname) && isset($user->lastname)))) ) { + $needrec = true; + $user = $user->id; + } + } else { + if ($alttext) { + // we need firstname, lastname, imagealt, can't escape... + $needrec = true; + } else { + $userobj = new StdClass; // fake it to save DB traffic + $userobj->id = $user; + $userobj->picture = $picture; + $user = clone($userobj); + unset($userobj); + } + } + if ($needrec) { + $user = get_record('user','id',$user, '', '', '', '', 'id,firstname,lastname,imagealt'); + } + if ($link) { if ($target) { $target=' target="_blank"'; } - $output = ''; + $output = ''; } else { $output = ''; } @@ -3369,19 +3404,23 @@ function print_user_picture($userid, $co } else { $wwwroot = $CFG->wwwroot; } + + if (is_null($picture)) { + $picture = $user->picture; + } if ($picture) { // Print custom user picture if ($CFG->slasharguments) { // Use this method if possible for better caching - $src = $wwwroot .'/user/pix.php/'. $userid .'/'. $file .'.jpg'; + $src = $wwwroot .'/user/pix.php/'. $user->id .'/'. $file .'.jpg'; } else { - $src = $wwwroot .'/user/pix.php?file=/'. $userid .'/'. $file .'.jpg'; + $src = $wwwroot .'/user/pix.php?file=/'. $user->id .'/'. $file .'.jpg'; } } else { // Print default user pictures (use theme version if available) $class .= " defaultuserpic"; $src = "$CFG->pixpath/u/$file.png"; } $imagealt = ''; - if ($alttext and $user = get_record('user','id',$userid)) { + if ($alttext) { if (!empty($user->imagealt)) { $imagealt = $user->imagealt; } else { Index: mod/forum/discuss.php =================================================================== RCS file: /cvsroot/moodle/moodle/mod/forum/discuss.php,v retrieving revision 1.95.2.9 diff -u -F^f -u -F^f -r1.95.2.9 discuss.php --- mod/forum/discuss.php 21 May 2007 14:41:21 -0000 1.95.2.9 +++ mod/forum/discuss.php 30 Nov 2007 06:12:29 -0000 @@ -121,6 +121,8 @@ error("Discussion no longer exists", "$CFG->wwwroot/mod/forum/view.php?f=$forum->id"); } + $post->modcontext = $modcontext; + if (forum_tp_can_track_forums($forum) && forum_tp_is_tracked($forum) && $CFG->forum_usermarksread) { if ($mark == 'read') { Index: mod/forum/lib.php =================================================================== RCS file: /cvsroot/moodle/moodle/mod/forum/lib.php,v retrieving revision 1.536.2.40 diff -u -F^f -u -F^f -r1.536.2.40 lib.php --- mod/forum/lib.php 28 Nov 2007 07:49:55 -0000 1.536.2.40 +++ mod/forum/lib.php 30 Nov 2007 06:12:31 -0000 @@ -404,6 +404,7 @@ function forum_cron() { $queue->userid = $userto->id; $queue->discussionid = $discussion->id; $queue->postid = $post->id; + $queue->timemodified = $post->modified; if (!insert_record('forum_queue', $queue)) { mtrace("Error: mod/forum/cron.php: Could not queue for digest mail for id $post->id to user $userto->id ($userto->email) .. not trying again."); } @@ -478,6 +479,10 @@ function forum_cron() { // Now see if there are any digest mails waiting to be sent, and if we should send them + mtrace('Starting digest processing...'); + + @set_time_limit(300); // terminate if not able to fetch all digests in 5 minutes + if (!isset($CFG->digestmailtimelast)) { // To catch the first time set_config('digestmailtimelast', 0); } @@ -485,13 +490,17 @@ function forum_cron() { $timenow = time(); $digesttime = usergetmidnight($timenow, $sitetimezone) + ($CFG->digestmailtime * 3600); - if ($CFG->digestmailtimelast < $digesttime and $timenow > $digesttime) { + // Delete any really old ones (normally there shouldn't be any) + $weekago = $timenow - (7 * 24 * 3600); + delete_records_select('forum_queue', "timemodified < $weekago"); + mtrace ('Cleaned old digest records'); - set_config('digestmailtimelast', $timenow); + if ($CFG->digestmailtimelast < $digesttime and $timenow > $digesttime) { mtrace('Sending forum digests: '.userdate($timenow, '', $sitetimezone)); - if ($digestposts = get_records('forum_queue')) { + $digestposts_rs = get_recordset('forum_queue'); + if (!rs_EOF($digestposts_rs)) { // We have work to do $usermailcount = 0; @@ -500,7 +509,7 @@ function forum_cron() { $discussionposts = array(); $userdiscussions = array(); - foreach ($digestposts as $digestpost) { + while ($digestpost = rs_fetch_next_record($digestposts_rs)) { if (!isset($users[$digestpost->userid])) { if ($user = get_record('user', 'id', $digestpost->userid)) { $users[$digestpost->userid] = $user; @@ -557,6 +566,7 @@ function forum_cron() { $userdiscussions[$digestpost->userid][$digestpost->discussionid] = $digestpost->discussionid; $discussionposts[$digestpost->discussionid][$digestpost->postid] = $digestpost->postid; } + rs_close($digestposts_rs); /// Finished iteration, let's close the resultset // Data collected, start sending out emails to each user foreach ($userdiscussions as $userid => $thesediscussions) { @@ -710,6 +720,8 @@ function forum_cron() { } } } + /// We have finishied all digest emails, update $CFG->digestmailtimelast + set_config('digestmailtimelast', $timenow); } if (!empty($usermailcount)) { @@ -1241,7 +1253,7 @@ function forum_scale_used_anywhere($scal function forum_get_post_full($postid) { global $CFG; - return get_record_sql("SELECT p.*, d.forum, u.firstname, u.lastname, u.email, u.picture + return get_record_sql("SELECT p.*, d.forum, u.firstname, u.lastname, u.email, u.picture, u.imagealt FROM {$CFG->prefix}forum_posts p LEFT JOIN {$CFG->prefix}forum_discussions d ON p.discussion = d.id LEFT JOIN {$CFG->prefix}user u ON p.userid = u.id @@ -1256,7 +1268,7 @@ function forum_get_post_full($postid) { function forum_get_discussion_posts($discussion, $sort, $forumid) { global $CFG; - return get_records_sql("SELECT p.*, $forumid AS forum, u.firstname, u.lastname, u.email, u.picture + return get_records_sql("SELECT p.*, $forumid AS forum, u.firstname, u.lastname, u.email, u.picture, u.imagealt FROM {$CFG->prefix}forum_posts p LEFT JOIN {$CFG->prefix}user u ON p.userid = u.id WHERE p.discussion = $discussion @@ -1271,7 +1283,7 @@ function forum_get_discussion_posts($dis function forum_get_child_posts($parent, $forumid) { global $CFG; - return get_records_sql("SELECT p.*, $forumid AS forum, u.firstname, u.lastname, u.email, u.picture + return get_records_sql("SELECT p.*, $forumid AS forum, u.firstname, u.lastname, u.email, u.picture, u.imagealt FROM {$CFG->prefix}forum_posts p LEFT JOIN {$CFG->prefix}user u ON p.userid = u.id WHERE p.parent = '$parent' @@ -1804,7 +1816,7 @@ function forum_get_discussions($forum="0 //TODO: there must be a nice way to do this that keeps both postgres and mysql 3.2x happy but I can't find it right now. if ($CFG->dbfamily == 'postgres' || $CFG->dbfamily == 'mssql' || $CFG->dbfamily == 'oracle') { return get_records_sql("SELECT $postdata, d.name, d.timemodified, d.usermodified, d.groupid, - u.firstname, u.lastname, u.email, u.picture $umfields + u.firstname, u.lastname, u.email, u.picture, u.imagealt $umfields FROM {$CFG->prefix}forum_discussions d JOIN {$CFG->prefix}forum_posts p ON p.discussion = d.id JOIN {$CFG->prefix}user u ON p.userid = u.id @@ -1815,7 +1827,7 @@ function forum_get_discussions($forum="0 ORDER BY $forumsort", $limitfrom, $limitnum); } else { // MySQL query. TODO: Check if this is needed (MySQL 4.1 should work with the above query) return get_records_sql("SELECT $postdata, d.name, d.timemodified, d.usermodified, d.groupid, - u.firstname, u.lastname, u.email, u.picture $umfields + u.firstname, u.lastname, u.email, u.picture, u.imagealt $umfields FROM ({$CFG->prefix}forum_posts p, {$CFG->prefix}user u, {$CFG->prefix}forum_discussions d) @@ -2086,12 +2098,16 @@ function forum_print_post(&$post, $cours static $strmarkread, $strmarkunread, $istracked; - $discussion = get_record('forum_discussions', 'id', $post->discussion); - if (!$cm = get_coursemodule_from_instance('forum', $discussion->forum)) { - error('Course Module ID was incorrect'); + if (empty($post->modcontext)) { // Have to generate it, which is expensive! Should always be set. + if (empty($post->forum)) { + $discussion = get_record('forum_discussions', 'id', $post->discussion); + $post->forum = $discussion->forum; + } + if (!$cm = get_coursemodule_from_instance('forum', $post->forum)) { + error('Course Module ID was incorrect'); + } + $post->modcontext = get_context_instance(CONTEXT_MODULE, $cm->id); } - $modcontext = get_context_instance(CONTEXT_MODULE, $cm->id); - if (!forum_user_can_see_post($post->forum,$post->discussion,$post)) { if (empty($SESSION->forum_search)) { @@ -2162,8 +2178,16 @@ function forum_print_post(&$post, $cours echo ''; echo ''; + // Picture + $postuser = new object; + $postuser->id = $post->userid; + $postuser->firstname = $post->firstname; + $postuser->lastname = $post->lastname; + $postuser->imagealt = $post->imagealt; + $postuser->picture = $post->picture; + echo ''; if ($post->parent) { @@ -2175,7 +2199,7 @@ function forum_print_post(&$post, $cours echo '
'.format_string($post->subject).'
'; echo '
'; - $fullname = fullname($post, has_capability('moodle/site:viewfullnames', $modcontext)); + $fullname = fullname($post, has_capability('moodle/site:viewfullnames', $post->modcontext)); $by->name = ''.$fullname.''; $by->date = userdate($post->modified); @@ -2260,16 +2284,18 @@ function forum_print_post(&$post, $cours } } - $forumtype = get_field('forum', 'type', 'id', $post->forum); + if (!isset($post->forumtype)) { + $post->forumtype = get_field('forum', 'type', 'id', $post->forum); + } $age = time() - $post->created; // Hack for allow to edit news posts those are not displayed yet until they are displayed if (!$post->parent - && $forumtype == 'news' + && $post->forumtype == 'news' && get_field_sql("SELECT id FROM {$CFG->prefix}forum_discussions WHERE id = $post->discussion AND timestart > ".time())) { $age = 0; } - $editanypost = has_capability('mod/forum:editanypost', $modcontext); + $editanypost = has_capability('mod/forum:editanypost', $post->modcontext); @@ -2279,16 +2305,16 @@ function forum_print_post(&$post, $cours } } - if (has_capability('mod/forum:splitdiscussions', $modcontext) - && $post->parent && $forumtype != 'single') { + if (has_capability('mod/forum:splitdiscussions', $post->modcontext) + && $post->parent && $post->forumtype != 'single') { $commands[] = ''.$strprune.''; } if (($ownpost and $age < $CFG->maxeditingtime - and has_capability('mod/forum:deleteownpost', $modcontext)) - or has_capability('mod/forum:deleteanypost', $modcontext)) { + and has_capability('mod/forum:deleteownpost', $post->modcontext)) + or has_capability('mod/forum:deleteanypost', $post->modcontext)) { $commands[] = ''.$strdelete.''; } @@ -2315,7 +2341,7 @@ function forum_print_post(&$post, $cours if ($useratings) { $mypost = ($USER->id == $post->userid); - $canviewallratings = has_capability('mod/forum:viewanyrating', $modcontext); + $canviewallratings = has_capability('mod/forum:viewanyrating', $post->modcontext); if ($canviewallratings and !$mypost) { forum_print_ratings_mean($post->id, $ratings->scale, $canviewallratings); @@ -2378,19 +2404,19 @@ function forum_print_post(&$post, $cours * @param boolean $canviewparticipants True if user has the viewparticipants permission for this course */ function forum_print_discussion_header(&$post, $forum, $group=-1, $datestring="", - $cantrack=true, $forumtracked=true, $canviewparticipants=true) { + $cantrack=true, $forumtracked=true, $canviewparticipants=true, $modcontext=NULL) { global $USER, $CFG; static $rowcount; static $strmarkalldread; - - if (!$cm = get_coursemodule_from_instance('forum', $forum->id, $forum->course)) { - error('Course Module ID was incorrect'); + if (empty($modcontext)) { + if (!$cm = get_coursemodule_from_instance('forum', $forum->id, $forum->course)) { + error('Course Module ID was incorrect'); + } + $modcontext = get_context_instance(CONTEXT_MODULE, $cm->id); } - $modcontext = get_context_instance(CONTEXT_MODULE, $cm->id); - if (!isset($rowcount)) { $rowcount = 0; @@ -2410,8 +2436,15 @@ function forum_print_discussion_header(& echo "\n"; // Picture + $postuser = new object; + $postuser->id = $post->userid; + $postuser->firstname = $post->firstname; + $postuser->lastname = $post->lastname; + $postuser->imagealt = $post->imagealt; + $postuser->picture = $post->picture; + echo '
\n"; // User name @@ -3446,12 +3479,14 @@ function forum_user_can_see_post($forum, * */ function forum_print_latest_discussions($course, $forum, $maxdiscussions=5, $displayformat='plain', $sort='', - $currentgroup=-1, $groupmode=-1, $page=-1) { + $currentgroup=-1, $groupmode=-1, $page=-1, $cm=NULL) { global $CFG, $USER; - - if (!$cm = get_coursemodule_from_instance('forum', $forum->id, $forum->course)) { - error('Course Module ID was incorrect'); - } + + if (!$cm) { + if (!$cm = get_coursemodule_from_instance('forum', $forum->id, $forum->course)) { + error('Course Module ID was incorrect'); + } + } $context = get_context_instance(CONTEXT_MODULE, $cm->id); @@ -3635,7 +3670,7 @@ function forum_print_latest_discussions( $group = -1; } forum_print_discussion_header($discussion, $forum, $group, $strdatestring, $cantrack, $forumtracked, - $canviewparticipants); + $canviewparticipants, $context); break; default: if ($canreply or $discussion->replies) { @@ -3721,6 +3756,17 @@ function forum_print_discussion($course, $user_read_array = array(); } + if (empty($post->modcontext)) { // Have to generate it, which is expensive! Should always be set. + if (empty($post->forum)) { + $discussion = get_record('forum_discussions', 'id', $post->discussion); + $post->forum = $discussion->forum; + } + if (!$cm = get_coursemodule_from_instance('forum', $post->forum)) { + error('Course Module ID was incorrect'); + } + $post->modcontext = get_context_instance(CONTEXT_MODULE, $cm->id); + } + if (forum_print_post($post, $course->id, $ownpost, $reply, $link=false, $ratings, '', '', (!$forumtracked || isset($user_read_array[$post->id]) || forum_tp_is_post_old($post)))) { $ratingsmenuused = true; @@ -3731,21 +3777,21 @@ function forum_print_discussion($course, case FORUM_MODE_FLATNEWEST : default: if (forum_print_posts_flat($post->discussion, $course->id, $mode, $ratings, $reply, - $user_read_array, $post->forum)) { + $user_read_array, $post->forum, $post->modcontext)) { $ratingsmenuused = true; } break; case FORUM_MODE_THREADED : if (forum_print_posts_threaded($post->id, $course->id, 0, $ratings, $reply, - $user_read_array, $post->forum)) { + $user_read_array, $post->forum, $post->modcontext)) { $ratingsmenuused = true; } break; case FORUM_MODE_NESTED : if (forum_print_posts_nested($post->id, $course->id, $ratings, $reply, - $user_read_array, $post->forum)) { + $user_read_array, $post->forum, $post->modcontext)) { $ratingsmenuused = true; } break; @@ -3772,7 +3818,7 @@ function forum_print_discussion($course, /** * TODO document */ -function forum_print_posts_flat($discussion, $courseid, $direction, $ratings, $reply, &$user_read_array, $forumid=0) { +function forum_print_posts_flat($discussion, $courseid, $direction, $ratings, $reply, &$user_read_array, $forumid=0, $modcontext=NULL) { global $USER, $CFG; $link = false; @@ -3788,6 +3834,7 @@ function forum_print_posts_flat($discuss foreach ($posts as $post) { $post->subject = format_string($post->subject); + $post->modcontext = $modcontext; $ownpost = ($USER->id == $post->userid); if (forum_print_post($post, $courseid, $ownpost, $reply, $link, $ratings, @@ -3804,7 +3851,7 @@ function forum_print_posts_flat($discuss /** * TODO document */ -function forum_print_posts_threaded($parent, $courseid, $depth, $ratings, $reply, &$user_read_array, $forumid=0) { +function forum_print_posts_threaded($parent, $courseid, $depth, $ratings, $reply, &$user_read_array, $forumid=0, $modcontext=NULL) { global $USER, $CFG; $link = false; @@ -3814,10 +3861,6 @@ function forum_print_posts_threaded($par if ($posts = forum_get_child_posts($parent, $forumid)) { - if (!$cm = get_coursemodule_from_instance('forum', $forumid, $courseid)) { - error('Course Module ID was incorrect'); - } - $modcontext = get_context_instance(CONTEXT_MODULE, $cm->id); $canviewfullnames = has_capability('moodle/site:viewfullnames', $modcontext); foreach ($posts as $post) { @@ -3825,8 +3868,8 @@ function forum_print_posts_threaded($par echo '
'; if ($depth > 0) { $ownpost = ($USER->id == $post->userid); - $post->subject = format_string($post->subject); + $post->modcontext = $modcontext; if (forum_print_post($post, $courseid, $ownpost, $reply, $link, $ratings, '', '', (isset($user_read_array[$post->id]) || forum_tp_is_post_old($post)))) { @@ -3855,7 +3898,7 @@ function forum_print_posts_threaded($par } if (forum_print_posts_threaded($post->id, $courseid, $depth-1, $ratings, $reply, - $user_read_array, $forumid)) { + $user_read_array, $forumid, $modcontext)) { $ratingsmenuused = true; } echo "
\n"; @@ -3867,7 +3910,7 @@ function forum_print_posts_threaded($par /** * TODO document */ -function forum_print_posts_nested($parent, $courseid, $ratings, $reply, &$user_read_array, $forumid=0) { +function forum_print_posts_nested($parent, $courseid, $ratings, $reply, &$user_read_array, $forumid=0, $modcontext=NULL) { global $USER, $CFG; $link = false; @@ -3885,11 +3928,13 @@ function forum_print_posts_nested($paren $post->subject = format_string($post->subject); + $post->modcontext = $modcontext; + if (forum_print_post($post, $courseid, $ownpost, $reply, $link, $ratings, '', '', (isset($user_read_array[$post->id]) || forum_tp_is_post_old($post)))) { $ratingsmenuused = true; } - if (forum_print_posts_nested($post->id, $courseid, $ratings, $reply, $user_read_array, $forumid)) { + if (forum_print_posts_nested($post->id, $courseid, $ratings, $reply, $user_read_array, $forumid, $modcontext)) { $ratingsmenuused = true; } echo "\n"; Index: mod/forum/version.php =================================================================== RCS file: /cvsroot/moodle/moodle/mod/forum/version.php,v retrieving revision 1.62.2.2 diff -u -F^f -u -F^f -r1.62.2.2 version.php --- mod/forum/version.php 21 Mar 2007 06:01:34 -0000 1.62.2.2 +++ mod/forum/version.php 30 Nov 2007 06:12:31 -0000 @@ -5,7 +5,7 @@ // This fragment is called by /admin/index.php //////////////////////////////////////////////////////////////////////////////// -$module->version = 2007020202; +$module->version = 2007113000; $module->requires = 2007020201; // Requires this Moodle version $module->cron = 60; Index: mod/forum/view.php =================================================================== RCS file: /cvsroot/moodle/moodle/mod/forum/view.php,v retrieving revision 1.94.2.4 diff -u -F^f -u -F^f -r1.94.2.4 view.php --- mod/forum/view.php 15 May 2007 18:27:01 -0000 1.94.2.4 +++ mod/forum/view.php 30 Nov 2007 06:12:31 -0000 @@ -69,7 +69,6 @@ print_header_simple(format_string($forum->name), "", "$navigation ".format_string($forum->name), "", "", true, $buttontext, navmenu($course, $cm)); - /// Some capability checks. if (empty($cm->visible) and !has_capability('moodle/course:viewhiddenactivities', $context)) { notice(get_string("activityiscurrentlyhidden")); Index: mod/forum/db/install.xml =================================================================== RCS file: /cvsroot/moodle/moodle/mod/forum/db/install.xml,v retrieving revision 1.4 diff -u -F^f -u -F^f -r1.4 install.xml --- mod/forum/db/install.xml 28 Aug 2006 16:20:52 -0000 1.4 +++ mod/forum/db/install.xml 30 Nov 2007 06:12:31 -0000 @@ -1,5 +1,5 @@ - @@ -87,7 +87,8 @@ - + + @@ -179,4 +180,4 @@ - \ No newline at end of file + Index: mod/forum/db/upgrade.php =================================================================== RCS file: /cvsroot/moodle/moodle/mod/forum/db/upgrade.php,v retrieving revision 1.1 diff -u -F^f -u -F^f -r1.1 upgrade.php --- mod/forum/db/upgrade.php 26 Oct 2006 17:33:42 -0000 1.1 +++ mod/forum/db/upgrade.php 30 Nov 2007 06:12:31 -0000 @@ -32,6 +32,17 @@ function xmldb_forum_upgrade($oldversion /// $result = result of "/lib/ddllib.php" function calls /// } + if ($result && $oldversion < 2007113000) { + + /// Define field timemodified to be added to forum_queue + $table = new XMLDBTable('forum_queue'); + $field = new XMLDBField('timemodified'); + $field->setAttributes(XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, '0', 'postid'); + + /// Launch add field timemodified + $result = $result && add_field($table, $field); + } + return $result; }
'; - print_user_picture($post->userid, $courseid, $post->picture); + print_user_picture($postuser, $courseid); echo ''; - print_user_picture($post->userid, $forum->course, $post->picture); + print_user_picture($postuser, $forum->course); echo "