From 9113408408b5244e3df3d7bf3bb337d8fed952b7 Mon Sep 17 00:00:00 2001 From: Colin Kuskie Date: Mon, 11 Jul 2011 15:04:54 -0700 Subject: [PATCH] When a post is purged, disqualify it as the last post in its thread, and the parent CS. Fixes bug #12183 --- docs/changelog/7.x.x.txt | 1 + lib/WebGUI/Asset/Post.pm | 10 ++-- t/Asset/Post/purging.t | 107 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 115 insertions(+), 3 deletions(-) create mode 100644 t/Asset/Post/purging.t diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index ce9b9d3ef..5239aabee 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -11,6 +11,7 @@ - fixed #12186: keywords template variable not working properly in Article - fixed #12190: List type form plugins that do not override getOptions show no value when getValueAsHtml is called - fixed #12135: Geo::Coder::Googlev3 needs common sense + - fixed #12183: Posts do not disqualify themselves when purged 7.10.19 - fixed #12169: extras uploads symlink export diff --git a/lib/WebGUI/Asset/Post.pm b/lib/WebGUI/Asset/Post.pm index a9633cd35..a493e2d61 100644 --- a/lib/WebGUI/Asset/Post.pm +++ b/lib/WebGUI/Asset/Post.pm @@ -1232,14 +1232,18 @@ Extend the base method to handle cleaning up storage locations. =cut sub purge { - my $self = shift; + my $self = shift; + my $purged = $self->next::method; + if ($purged) { my $sth = $self->session->db->read("select storageId from Post where assetId=".$self->session->db->quote($self->getId)); while (my ($storageId) = $sth->array) { - my $storage = WebGUI::Storage->get($self->session, $storageId); + my $storage = WebGUI::Storage->get($self->session, $storageId); $storage->delete if defined $storage; } $sth->finish; - return $self->next::method; + $self->disqualifyAsLastPost; + } + return $purged; } #------------------------------------------------------------------- diff --git a/t/Asset/Post/purging.t b/t/Asset/Post/purging.t new file mode 100644 index 000000000..9e62c7b84 --- /dev/null +++ b/t/Asset/Post/purging.t @@ -0,0 +1,107 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2009 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +## Test that archiving a post works, and checking side effects like updating +## lastPost information in the Thread, and CS. + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../lib"; +use WebGUI::Test; +use WebGUI::Session; +use Test::More tests => 7; # increment this value for each test you create +use WebGUI::Asset::Wobject::Collaboration; +use WebGUI::Asset::Post; +use WebGUI::Asset::Post::Thread; + +my $session = WebGUI::Test->session; + +# Do our work in the import node +my $node = WebGUI::Asset->getImportNode($session); + +# Grab a named version tag +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Collab setup"}); + +# Need to create a Collaboration system in which the post lives. +my @addArgs = ( undef, undef, { skipAutoCommitWorkflows => 1, skipNotification => 1 } ); + +my $collab = $node->addChild({className => 'WebGUI::Asset::Wobject::Collaboration'}, @addArgs); + +# finally, add posts and threads to the collaboration system + +my $first_thread = $collab->addChild( + { className => 'WebGUI::Asset::Post::Thread', }, + undef, + WebGUI::Test->webguiBirthday, + { skipAutoCommitWorkflows => 1, skipNotification => 1 } +); + +my $second_thread = $collab->addChild( + { className => 'WebGUI::Asset::Post::Thread', }, + undef, + WebGUI::Test->webguiBirthday, + { skipAutoCommitWorkflows => 1, skipNotification => 1 } +); + +##Thread 1, Post 1 => t1p1 +my $t1p1 = $first_thread->addChild( + { className => 'WebGUI::Asset::Post', }, + undef, + WebGUI::Test->webguiBirthday, + { skipAutoCommitWorkflows => 1, skipNotification => 1 } +); + +my $t1p2 = $first_thread->addChild( + { className => 'WebGUI::Asset::Post', }, + undef, + WebGUI::Test->webguiBirthday + 1, + { skipAutoCommitWorkflows => 1, skipNotification => 1 } +); + +my $past = time()-15; + +my $t2p1 = $second_thread->addChild( + { className => 'WebGUI::Asset::Post', }, + undef, + $past, + { skipAutoCommitWorkflows => 1, skipNotification => 1 } +); + +my $t2p2 = $second_thread->addChild( + { className => 'WebGUI::Asset::Post', }, + undef, + undef, + { skipAutoCommitWorkflows => 1, skipNotification => 1 } +); + +$versionTag->commit(); +WebGUI::Test->addToCleanup($versionTag); + +foreach my $asset ($collab, $t1p1, $t1p2, $t2p1, $t2p2, $first_thread, $second_thread, ) { + $asset = $asset->cloneFromDb; +} + +is $collab->getChildCount, 2, 'collab has correct number of children'; + +is $collab->get('lastPostId'), $t2p2->getId, 'lastPostId set in collab'; +is $collab->get('lastPostDate'), $t2p2->get('creationDate'), 'lastPostDate, too'; + +$t2p2->purge; + +$second_thread = $second_thread->cloneFromDb; +is $second_thread->get('lastPostId'), $t2p1->getId, '.. updated lastPostId in the thread'; +is $second_thread->get('lastPostDate'), $t2p1->get('creationDate'), '... lastPostDate, too'; + +$collab = $collab->cloneFromDb; +is $collab->get('lastPostId'), $t2p1->getId, '.. updated lastPostId in the CS'; +is $collab->get('lastPostDate'), $t2p1->get('creationDate'), '... lastPostDate, too'; + +#vim:ft=perl