From ee85bc1e02b92c9c944d5b5bda58624aadcc09f0 Mon Sep 17 00:00:00 2001 From: JT Smith Date: Fri, 5 Oct 2007 20:20:42 +0000 Subject: [PATCH] fix: Last Reply and Replies columns not updating --- docs/changelog/7.x.x.txt | 1 + docs/upgrades/upgrade_7.4.8-7.4.9.pl | 12 ++++ lib/WebGUI/Asset/Post.pm | 57 +++++++--------- lib/WebGUI/Asset/Post/Thread.pm | 29 +++++--- lib/WebGUI/Asset/Wobject/Collaboration.pm | 82 ++++++++++++----------- lib/WebGUI/Asset/Wobject/MessageBoard.pm | 6 +- 6 files changed, 100 insertions(+), 87 deletions(-) diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 45271cf33..8a8138079 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -7,6 +7,7 @@ - fix: wiki recent - fix: Dashboard content positioning field problem - fix: graphing doesn't work with GraphicsMagick + - fix: Last Reply and Replies columns not updating - fix: Calendar generated iCal for last 30 days instead of next 30 days - fix: hover help doesn't appear for matrix fields - Collaboration systems should always tell browser there is new content diff --git a/docs/upgrades/upgrade_7.4.8-7.4.9.pl b/docs/upgrades/upgrade_7.4.8-7.4.9.pl index 9798af8e2..7305be52a 100644 --- a/docs/upgrades/upgrade_7.4.8-7.4.9.pl +++ b/docs/upgrades/upgrade_7.4.8-7.4.9.pl @@ -22,6 +22,7 @@ my $session = start(); # this line required removeOrphanedGroupings($session); # upgrade functions go here fixDashboardContentPositions($session); +fixPosts($session); finish($session); # this line required @@ -36,6 +37,17 @@ sub removeOrphanedGroupings { } +#------------------------------------------------- +sub fixPosts { + my $session = shift; + my $db = $session->db; + print "\tRemoving unneeded fields from Posts.\n" unless ($quiet); + $db->write("alter table Post drop column dateSubmitted"); + $db->write("alter table Post drop column dateUpdated"); + $db->write("update Collaboration set sortBy='assetData.revisionDate' where sortBy='dateUpdated'"); + $db->write("update Collaboration set sortBy='creationDate' where sortBy='dateSubmitted'"); +} + #------------------------------------------------- sub fixDashboardContentPositions { my $session = shift; diff --git a/lib/WebGUI/Asset/Post.pm b/lib/WebGUI/Asset/Post.pm index 76ea595ab..52d2f484e 100644 --- a/lib/WebGUI/Asset/Post.pm +++ b/lib/WebGUI/Asset/Post.pm @@ -72,16 +72,12 @@ sub addRevision { my $now = time(); if ($threadId eq "") { # new post if ($newSelf->getParent->isa("WebGUI::Asset::Wobject::Collaboration")) { - $newSelf->update({threadId=>$newSelf->getId, dateSubmitted=>$now}); + $newSelf->update({threadId=>$newSelf->getId}); } else { - $newSelf->update({threadId=>$newSelf->getParent->get("threadId"), dateSubmitted=>$now}); + $newSelf->update({threadId=>$newSelf->getParent->get("threadId")}); } delete $newSelf->{_thread}; } - $newSelf->update({ - dateUpdated=>$now, - }); - $newSelf->getThread->unmarkRead; return $newSelf; @@ -99,7 +95,7 @@ sub canEdit { my $self = shift; return (($self->session->form->process("func") eq "add" || ($self->session->form->process("assetId") eq "new" && $self->session->form->process("func") eq "editSave" && $self->session->form->process("class","className") eq "WebGUI::Asset::Post")) && $self->getThread->getParent->canPost) || # account for new posts - ($self->isPoster && $self->getThread->getParent->get("editTimeout") > ($self->session->datetime->time() - $self->get("dateUpdated"))) || + ($self->isPoster && $self->getThread->getParent->get("editTimeout") > ($self->session->datetime->time() - $self->get("revisionDate"))) || $self->getThread->getParent->canEdit; } @@ -150,7 +146,7 @@ sub commit { my $u = WebGUI::User->new($self->session, $self->get("ownerUserId")); $u->karma($self->getThread->getParent->get("karmaPerPost"), $self->getId, "Collaboration post"); } - $self->getThread->incrementReplies($self->get("dateUpdated"),$self->getId) if ($self->isReply); + $self->getThread->incrementReplies($self->get("revisionDate"),$self->getId) if ($self->isReply); } } @@ -176,15 +172,6 @@ sub definition { fieldType=>"hidden", defaultValue=>undef }, - dateSubmitted => { - noFormPost=>1, - fieldType=>"hidden", - defaultValue=>$session->datetime->time() - }, - dateUpdated => { - fieldType=>"hidden", - defaultValue=>$session->datetime->time() - }, username => { fieldType=>"hidden", defaultValue=>$session->form->process("visitorUsername") || $session->user->profileField("alias") || $session->user->username @@ -517,8 +504,8 @@ sub getTemplateVars { $var{"user.isPoster"} = $self->isPoster; $var{"avatar.url"} = $self->getAvatarUrl; $var{"userProfile.url"} = $self->getUrl("op=viewProfile;uid=".$self->get("ownerUserId")); - $var{"dateSubmitted.human"} =$self->session->datetime->epochToHuman($self->get("dateSubmitted")); - $var{"dateUpdated.human"} =$self->session->datetime->epochToHuman($self->get("dateUpdated")); + $var{"dateSubmitted.human"} =$self->session->datetime->epochToHuman($self->get("creationDate")); + $var{"dateUpdated.human"} =$self->session->datetime->epochToHuman($self->get("revisionDate")); $var{'title.short'} = $self->chopTitle; $var{content} = $self->formatContent if ($self->getThread); $var{'user.canEdit'} = $self->canEdit if ($self->getThread); @@ -695,7 +682,7 @@ Returns a boolean indicating whether this post is new (not an edit). sub isNew { my $self = shift; - return $self->get("dateSubmitted") eq $self->get("dateUpdated"); + return $self->get("creationDate") == $self->get("revisionDate"); } #------------------------------------------------------------------- @@ -1027,19 +1014,23 @@ Moves post to the trash and updates reply counter on thread. =cut sub trash { - my $self = shift; - $self->SUPER::trash; - $self->getThread->sumReplies if ($self->isReply); - if ($self->getThread->get("lastPostId") eq $self->getId) { - my $threadLineage = $self->getThread->get("lineage"); - my ($id, $date) = $self->session->db->quickArray("select Post.assetId, Post.dateSubmitted from Post, asset where asset.lineage like ".$self->session->db->quote($threadLineage.'%')." and Post.assetId<>".$self->session->db->quote($self->getId)." and asset.assetId=Post.assetId and asset.state='published' order by Post.dateSubmitted desc"); - $self->getThread->update({lastPostId=>$id, lastPostDate=>$date}); - } - if ($self->getThread->getParent->get("lastPostId") eq $self->getId) { - my $forumLineage = $self->getThread->getParent->get("lineage"); - my ($id, $date) = $self->session->db->quickArray("select Post.assetId, Post.dateSubmitted from Post, asset where asset.lineage like ".$self->session->db->quote($forumLineage.'%')." and Post.assetId<>".$self->session->db->quote($self->getId)." and asset.assetId=Post.assetId and asset.state='published' order by Post.dateSubmitted desc"); - $self->getThread->getParent->update({lastPostId=>$id, lastPostDate=>$date}); - } + my $self = shift; + $self->SUPER::trash; + $self->getThread->sumReplies if ($self->isReply); + if ($self->getThread->get("lastPostId") eq $self->getId) { + my $threadLineage = $self->getThread->get("lineage"); + my ($id, $date) = $self->session->db->quickArray("select assetId, creationDate from asset where + lineage like ? and assetId<>? and asset.state='published' and className like 'WebGUI::Asset::Post%' + order by creationDate desc",[$threadLineage.'%', $self->getId]); + $self->getThread->update({lastPostId=>$id, lastPostDate=>$date}); + } + if ($self->getThread->getParent->get("lastPostId") eq $self->getId) { + my $forumLineage = $self->getThread->getParent->get("lineage"); + my ($id, $date) = $self->session->db->quickArray("select assetId, creationDate from asset where + lineage like ? and assetId<>? and asset.state='published' and className like 'WebGUI::Asset::Post%' + order by creationDate desc",[$forumLineage.'%', $self->getId]); + $self->getThread->getParent->update({lastPostId=>$id, lastPostDate=>$date}); + } } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Asset/Post/Thread.pm b/lib/WebGUI/Asset/Post/Thread.pm index dfd7d7762..73a8ff9a8 100644 --- a/lib/WebGUI/Asset/Post/Thread.pm +++ b/lib/WebGUI/Asset/Post/Thread.pm @@ -63,7 +63,7 @@ sub commit { my $self = shift; $self->SUPER::commit; if ($self->isNew) { - $self->getParent->incrementThreads($self->get("dateUpdated"),$self->getId); + $self->getParent->incrementThreads($self->get("revisionDate"),$self->getId); } } @@ -623,6 +623,7 @@ sub setLastPost { $self->getParent->setLastPost($id,$date); } +#------------------------------------------------------------------- sub normalizeLastPost { my $self = shift; # Hmm. Is this right? @@ -704,14 +705,21 @@ Moves thread to the trash and updates reply counter on thread. =cut sub trash { - my $self = shift; - $self->SUPER::trash; - $self->getParent->sumReplies; - if ($self->getParent->get("lastPostId") eq $self->getId) { - my $parentLineage = $self->getThread->get("lineage"); - my ($id, $date) = $self->session->db->quickArray("select Post.assetId, Post.dateSubmitted from Post, asset where asset.lineage like ".$self->session->db->quote($parentLineage.'%')." and Post.assetId<>".$self->session->db->quote($self->getId)." and Post.assetId=asset.assetId and asset.state='published' order by Post.dateSubmitted desc"); - $self->getParent->setLastPost('','') ? $self->getParent->setLastPost($id,$date) : $id; + my $self = shift; + $self->SUPER::trash; + $self->getParent->sumReplies; + if ($self->getParent->get("lastPostId") eq $self->getId) { + my $parentLineage = $self->getThread->get("lineage"); + my ($id, $date) = $self->session->db->quickArray("select assetId, creationDate from asset where + lineage like ? and assetId<>? and asset.state='published' and className like 'WebGUI::Asset::Post%' + order by creationDate desc",[$parentLineage.'%', $self->getId]); + if (defined $id) { + $self->getParent->setLastPost($id,$date); } + else { + $self->getParent->setLastPost('',''); + } + } } @@ -884,10 +892,9 @@ sub view { my $p = WebGUI::Paginator->new($self->session,$self->getUrl,$self->getParent->get("postsPerPage")); my $sql = "select asset.assetId, asset.className, assetData.revisionDate as revisionDate, assetData.url as url from asset left join assetData on assetData.assetId=asset.assetId - left join Post on Post.assetId=assetData.assetId and assetData.revisionDate=Post.revisionDate where asset.lineage like ".$self->session->db->quote($self->get("lineage").'%') ." and asset.state='published' - and assetData.revisionDate=(SELECT max(revisionDate) from assetData where assetData.assetId=asset.assetId + and assetData.revisionDate=(SELECT max(assetData.revisionDate) from assetData where assetData.assetId=asset.assetId and ( assetData.status in ('approved','archived') or assetData.tagId=".$self->session->db->quote($self->session->scratch->get("versionTag")); @@ -898,7 +905,7 @@ sub view { order by "; if ($layout eq "flat") { - $sql .= "Post.dateSubmitted"; + $sql .= "asset.creationDate"; } else { $sql .= "asset.lineage"; } diff --git a/lib/WebGUI/Asset/Wobject/Collaboration.pm b/lib/WebGUI/Asset/Wobject/Collaboration.pm index 0d47a5108..c7cf003f1 100644 --- a/lib/WebGUI/Asset/Wobject/Collaboration.pm +++ b/lib/WebGUI/Asset/Wobject/Collaboration.pm @@ -93,15 +93,17 @@ sub appendPostListTemplateVars { my $p = shift; my $page = $p->getPageData; my $i = 0; + my ($icon, $datetime) = $self->session->quick(qw(icon datetime)); foreach my $row (@$page) { my $post = WebGUI::Asset->new($self->session,$row->{assetId}, $row->{className}, $row->{revisionDate}); $post->{_parent} = $self; # caching parent for efficiency - my $controls = $self->session->icon->delete('func=delete',$post->get("url"),"Delete").$self->session->icon->edit('func=edit',$post->get("url")); + my $controls = $icon->delete('func=delete',$post->get("url"),"Delete") . $icon->edit('func=edit',$post->get("url")); if ($self->get("sortBy") eq "lineage") { if ($self->get("sortOrder") eq "desc") { - $controls .= $self->session->icon->moveUp('func=demote',$post->get("url")).$self->session->icon->moveDown('func=promote',$post->get("url")); - } else { - $controls .= $self->session->icon->moveUp('func=promote',$post->get("url")).$self->session->icon->moveDown('func=demote',$post->get("url")); + $controls .= $icon->moveUp('func=demote',$post->get("url")).$icon->moveDown('func=promote',$post->get("url")); + } + else { + $controls .= $icon->moveUp('func=promote',$post->get("url")).$icon->moveDown('func=demote',$post->get("url")); } } my @rating_loop; @@ -114,13 +116,13 @@ sub appendPostListTemplateVars { if ($self->get("displayLastReply")) { my $lastPost = $post->getLastPost(); %lastReply = ( - "lastReply.url"=>$lastPost->getUrl.'#'.$lastPost->getId, - "lastReply.title"=>$lastPost->get("title"), - "lastReply.user.isVisitor"=>$lastPost->get("ownerUserId") eq "1", - "lastReply.username"=>$lastPost->get("username"), - "lastReply.userProfile.url"=>$lastPost->WebGUI::Asset::Post::getPosterProfileUrl(), - "lastReply.dateSubmitted.human"=>$self->session->datetime->epochToHuman($lastPost->get("dateSubmitted"),"%z"), - "lastReply.timeSubmitted.human"=>$self->session->datetime->epochToHuman($lastPost->get("dateSubmitted"),"%Z") + "lastReply.url" => $lastPost->getUrl.'#'.$lastPost->getId, + "lastReply.title" => $lastPost->get("title"), + "lastReply.user.isVisitor" => $lastPost->get("ownerUserId") eq "1", + "lastReply.username" => $lastPost->get("username"), + "lastReply.userProfile.url" => $lastPost->getPosterProfileUrl(), + "lastReply.dateSubmitted.human" => $datetime->epochToHuman($lastPost->get("creationDate"),"%z"), + "lastReply.timeSubmitted.human" => $datetime->epochToHuman($lastPost->get("creationDate"),"%Z"), ); } $hasRead = $post->isMarkedRead; @@ -133,32 +135,32 @@ sub appendPostListTemplateVars { } my %postVars = ( %{$post->get}, - "id"=>$post->getId, - "url"=>$url, - rating_loop=>\@rating_loop, - "content"=>$post->formatContent, - "status"=>$post->getStatus, - "thumbnail"=>$post->getThumbnailUrl, - "image.url"=>$post->getImageUrl, - "dateSubmitted.human"=>$self->session->datetime->epochToHuman($post->get("dateSubmitted"),"%z"), - "dateUpdated.human"=>$self->session->datetime->epochToHuman($post->get("dateUpdated"),"%z"), - "timeSubmitted.human"=>$self->session->datetime->epochToHuman($post->get("dateSubmitted"),"%Z"), - "timeUpdated.human"=>$self->session->datetime->epochToHuman($post->get("dateUpdated"),"%Z"), - "userProfile.url"=>$post->getPosterProfileUrl, - "user.isVisitor"=>$post->get("ownerUserId") eq "1", - "edit.url"=>$post->getEditUrl, - 'controls'=>$controls, - "isSecond"=>(($i+1)%2==0), - "isThird"=>(($i+1)%3==0), - "isFourth"=>(($i+1)%4==0), - "isFifth"=>(($i+1)%5==0), - "user.hasRead" => $hasRead, - "user.isPoster"=>$post->isPoster, - "avatar.url"=>$post->getAvatarUrl, + "id" => $post->getId, + "url" => $url, + rating_loop => \@rating_loop, + "content" => $post->formatContent, + "status" => $post->getStatus, + "thumbnail" => $post->getThumbnailUrl, + "image.url" => $post->getImageUrl, + "dateSubmitted.human" => $datetime->epochToHuman($post->get("creationDate"),"%z"), + "dateUpdated.human" => $datetime->epochToHuman($post->get("revisionDate"),"%z"), + "timeSubmitted.human" => $datetime->epochToHuman($post->get("creationDate"),"%Z"), + "timeUpdated.human" => $datetime->epochToHuman($post->get("revisionDate"),"%Z"), + "userProfile.url" => $post->getPosterProfileUrl, + "user.isVisitor" => $post->get("ownerUserId") eq "1", + "edit.url" => $post->getEditUrl, + 'controls' => $controls, + "isSecond" => (($i+1)%2==0), + "isThird" => (($i+1)%3==0), + "isFourth" => (($i+1)%4==0), + "isFifth" => (($i+1)%5==0), + "user.hasRead" => $hasRead, + "user.isPoster" => $post->isPoster, + "avatar.url" => $post->getAvatarUrl, %lastReply ); $post->getTemplateMetadataVars(\%postVars); - if ($row->{className} eq 'WebGUI::Asset::Post::Thread') { + if ($row->{className} =~ m/^WebGUI::Asset::Post::Thread/) { $postVars{'rating'} = $post->get('threadRating'); } push(@{$var->{post_loop}}, \%postVars ); @@ -363,8 +365,8 @@ sub definition { my %sortByOptions; tie %sortByOptions, 'Tie::IxHash'; %sortByOptions = (lineage=>$i18n->get('sequence'), - dateUpdated=>$i18n->get('date updated'), - dateSubmitted=>$i18n->get('date submitted'), + "assetData.revisionDate"=>$i18n->get('date updated'), + creationDate=>$i18n->get('date submitted'), title=>$i18n->get('title'), userDefined1=>$i18n->get('user defined 1'), userDefined2=>$i18n->get('user defined 2'), @@ -611,7 +613,7 @@ sub definition { }, sortBy =>{ fieldType=>"selectBox", - defaultValue=>'dateUpdated', + defaultValue=>'revisionDate', tab=>'display', options=>\%sortByOptions, label=>$i18n->get('sort by'), @@ -829,7 +831,7 @@ SQL 'link' => $postUrl, guid => $postUrl, description => $post->get('synopsis'), - pubDate => $datetime->epochToMail($post->get('dateUpdated')), + pubDate => $datetime->epochToMail($post->get('revisionDate')), attachmentLoop => $attachmentLoop, userDefined1 => $post->get("userDefined1"), userDefined2 => $post->get("userDefined2"), @@ -942,7 +944,7 @@ sub getThreadsPaginator { } $self->session->scratch->set($scratchSortOrder, $sortOrder); } - $sortBy ||= "dateUpdated"; + $sortBy ||= "revisionDate"; $sortOrder ||= "desc"; # Sort by the thread rating instead of the post rating. other places don't care about threads. if ($sortBy eq 'rating') { @@ -1013,7 +1015,7 @@ sub getViewTemplateVars { $var{'sortby.username.url'} = $self->getSortByUrl("username"); $var{'karmaIsEnabled'} = $self->session->setting->get("useKarma"); $var{'sortby.karmaRank.url'} = $self->getSortByUrl("karmaRank"); - $var{'sortby.date.url'} = $self->getSortByUrl("dateSubmitted"); + $var{'sortby.date.url'} = $self->getSortByUrl("creationDate"); $var{'sortby.lastreply.url'} = $self->getSortByUrl("lastPostDate"); $var{'sortby.views.url'} = $self->getSortByUrl("views"); $var{'sortby.replies.url'} = $self->getSortByUrl("replies"); diff --git a/lib/WebGUI/Asset/Wobject/MessageBoard.pm b/lib/WebGUI/Asset/Wobject/MessageBoard.pm index a7a1c2f7f..f16945b17 100644 --- a/lib/WebGUI/Asset/Wobject/MessageBoard.pm +++ b/lib/WebGUI/Asset/Wobject/MessageBoard.pm @@ -119,9 +119,9 @@ sub view { if (defined $lastPost) { %lastPostVars = ( 'forum.lastPost.url' => $lastPost->getUrl, - 'forum.lastPost.date' => $self->session->datetime->epochToHuman($lastPost->get("dateSubmitted"),"%z"), - 'forum.lastPost.time' => $self->session->datetime->epochToHuman($lastPost->get("dateSubmitted"),"%Z"), - 'forum.lastPost.epoch' => $lastPost->get("dateSubmitted"), + 'forum.lastPost.date' => $self->session->datetime->epochToHuman($lastPost->get("creationDate"),"%z"), + 'forum.lastPost.time' => $self->session->datetime->epochToHuman($lastPost->get("creationDate"),"%Z"), + 'forum.lastPost.epoch' => $lastPost->get("creationDate"), 'forum.lastPost.subject' => $lastPost->get("title"), 'forum.lastPost.user.hasRead' => $lastPost->getThread->isMarkedRead, 'forum.lastPost.user.id' => $lastPost->get("ownerUserId"),