diff --git a/lib/WebGUI/Workflow/Activity/ArchiveOldStories.pm b/lib/WebGUI/Workflow/Activity/ArchiveOldStories.pm new file mode 100644 index 000000000..d6dd3cd54 --- /dev/null +++ b/lib/WebGUI/Workflow/Activity/ArchiveOldStories.pm @@ -0,0 +1,104 @@ +package WebGUI::Workflow::Activity::ArchiveOldStories; + + +=head1 LEGAL + + ------------------------------------------------------------------- + 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 + ------------------------------------------------------------------- + +=cut + +use strict; +use base 'WebGUI::Workflow::Activity'; +use WebGUI::Asset; +use WebGUI::Asset::Wobject::StoryArchive; + +=head1 NAME + +Package WebGUI::Workflow::Activity::ArchiveOldStories + +=head1 DESCRIPTION + +Uses the settings in the Story Archive to determine whether the Stories (and Folders) in those Story Archives should be archived. + +=head1 SYNOPSIS + +See WebGUI::Workflow::Activity for details on how to use any activity. + +=head1 METHODS + +These methods are available from this class: + +=cut + + +#------------------------------------------------------------------- + +=head2 definition ( session, definition ) + +See WebGUI::Workflow::Activity::defintion() for details. + +=cut + +sub definition { + my $class = shift; + my $session = shift; + my $definition = shift; + my $i18n = WebGUI::International->new($session, "Workflow_Activity_ArchiveOldStories"); + push(@{$definition}, { + name=>$i18n->get("activityName"), + properties=> {} + }); + return $class->SUPER::definition($session,$definition); +} + + +#------------------------------------------------------------------- + +=head2 execute ( ) + +See WebGUI::Workflow::Activity::execute() for details. + +=cut + +sub execute { + my $self = shift; + my $session = $self->session; + my $epoch = $self->session->datetime->time(); + my $getAnArchive = WebGUI::Asset::Wobject::StoryArchive->getIsa($session); + ARCHIVE: while (my $archive = $getAnArchive->()) { + next ARCHIVE unless $archive && $archive->get("archiveAfter"); + my $archiveDate = $epoch - $archive->get("archiveAfter"); + my $folders = $archive->getLineage( + ['children'], + { + statusToInclude => ['approved'], + whereClause => 'creationDate < '.$session->db->quote($archiveDate), + returnObjects => 1, + }, + ); + FOLDER: foreach my $folder (@{ $folders }) { + next FOLDER unless $folder; + my $stories = $folder->getLineage( + ['children'], { returnObjects => 1, }, + ); + STORY: foreach my $story (@{ $stories }) { + next STORY unless $story; + $story->update({ status => 'archived' }); + } + $folder->update({ status => 'archived' }); + } + } + return $self->COMPLETE; +} + +1; + + diff --git a/lib/WebGUI/i18n/English/Workflow_Activity_ArchiveOldStories.pm b/lib/WebGUI/i18n/English/Workflow_Activity_ArchiveOldStories.pm new file mode 100644 index 000000000..d57118eb6 --- /dev/null +++ b/lib/WebGUI/i18n/English/Workflow_Activity_ArchiveOldStories.pm @@ -0,0 +1,13 @@ +package WebGUI::i18n::English::Workflow_Activity_ArchiveOldStories; +use strict; + +our $I18N = { + 'activityName' => { + message => q|Archive Old Stories|, + context => q|The name of this workflow activity.|, + lastUpdated => 0, + }, + +}; + +1; diff --git a/t/Workflow/Activity/ArchiveOldStories.t b/t/Workflow/Activity/ArchiveOldStories.t new file mode 100644 index 000000000..4dcb77a81 --- /dev/null +++ b/t/Workflow/Activity/ArchiveOldStories.t @@ -0,0 +1,127 @@ +#------------------------------------------------------------------- +# 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 +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../lib"; + +use WebGUI::Test; +use WebGUI::Asset; +use WebGUI::Asset::Story; +use WebGUI::Asset::Wobject::StoryArchive; +use WebGUI::Workflow::Activity::ArchiveOldStories; + +use Data::Dumper; +use Test::More; +use Test::Deep; + +plan tests => 6; # increment this value for each test you create + +my $session = WebGUI::Test->session; +$session->user({userId => 3}); + +my $home = WebGUI::Asset->getDefault($session); +my $wgBday = WebGUI::Test->webguiBirthday; + +my $creationDateSth = $session->db->prepare('update asset set creationDate=? where assetId=?'); + +my $archive1 = $home->addChild({ + className => 'WebGUI::Asset::Wobject::StoryArchive', + title => '2001 Stories', + archiveAfter => 50*365*24*3600, ##50 years ago +}); + +my $birthdayFolder = $archive1->getFolder($wgBday); +$creationDateSth->execute([$wgBday, $birthdayFolder->getId]); + +my @oldStories = (); +push @oldStories, $birthdayFolder->addChild({ className => 'WebGUI::Asset::Story',}); +push @oldStories, $birthdayFolder->addChild({ className => 'WebGUI::Asset::Story',}); +foreach my $story (@oldStories) { + $creationDateSth->execute([$wgBday, $story->getId]); +} + +my $archive2 = $home->addChild({ + className => 'WebGUI::Asset::Wobject::StoryArchive', + title => 'Stories from last week', + archiveAfter => 10*24*3600, #10 days ago +}); + +my $weekAgo = time() - (7*24*3600); +my $weekFolder = $archive2->getFolder($weekAgo); +my $weekStory = $weekFolder->addChild({className => 'WebGUI::Asset::Story',}); +$creationDateSth->execute([$weekAgo, $weekFolder->getId]); +$creationDateSth->execute([$weekAgo, $weekStory->getId]); + +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->commit; + +my $workflow = WebGUI::Workflow->create($session, + { + enabled => 1, + objectType => 'None', + mode => 'realtime', + }, +); +my $activity = $workflow->addActivity('WebGUI::Workflow::Activity::ArchiveOldStories'); + +my $instance1 = WebGUI::Workflow::Instance->create($session, + { + workflowId => $workflow->getId, + skipSpectreNotification => 1, + } +); + +my $retVal; + +$retVal = $instance1->run(); +is($retVal, 'complete', 'First workflow was run'); +$retVal = $instance1->run(); +is($retVal, 'done', 'Workflow is done'); + +my $archivedAssets = $home->getLineage( + ['descendants'], + { + includeOnlyClasses => ['WebGUI::Asset::Story', 'WebGUI::Asset::Wobject::Folder', 'WebGUI::Asset::Wobject::StoryArchive'], + statusToInclude => ['archived'], + }, +); + +cmp_bag( $archivedAssets, [ ], 'Nothing archived.'); + +$archive2->update({ archiveAfter => 5*24*3600, }); + +my $instance2 = WebGUI::Workflow::Instance->create($session, + { + workflowId => $workflow->getId, + skipSpectreNotification => 1, + } +); +$retVal = $instance2->run(); +is($retVal, 'complete', 'Second workflow was run'); +$retVal = $instance2->run(); +is($retVal, 'done', 'Workflow is done'); + +$archivedAssets = $home->getLineage( + ['descendants'], + { + includeOnlyClasses => ['WebGUI::Asset::Story', 'WebGUI::Asset::Wobject::Folder', 'WebGUI::Asset::Wobject::StoryArchive'], + statusToInclude => ['archived'], + }, +); + +cmp_bag( $archivedAssets, [ $weekStory->getId, $weekFolder->getId ], 'Nothing archived.'); + +END { + $creationDateSth->finish; + $versionTag->rollback; + $workflow->delete; +} +