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 '
'; - print_user_picture($post->userid, $courseid, $post->picture); + print_user_picture($postuser, $courseid); echo ' | '; if ($post->parent) { @@ -2175,7 +2199,7 @@ function forum_print_post(&$post, $cours echo '