From 299442662a61c8e2edbacbf3a33cf54b1998f590 Mon Sep 17 00:00:00 2001 From: Colin Kuskie Date: Thu, 25 Jun 2009 15:33:43 +0000 Subject: [PATCH] Add a progress bar to Delete in the AssetManager. --- docs/changelog/7.x.x.txt | 1 + lib/WebGUI/AssetTrash.pm | 77 +++++++++++++++++++++++--------- lib/WebGUI/i18n/English/Asset.pm | 10 ++--- 3 files changed, 61 insertions(+), 27 deletions(-) diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index bf0246f4b..06d2b1dde 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -9,6 +9,7 @@ - fixed #10549: EMS import - fixed #10561: pb: purge - fixed #10563: pb: rollback version tag + - fixed #10562: pb: delete 7.7.11 - Fixed a bug where empty version tags were not deleted. (Martin Kamerbeek / Oqapi) diff --git a/lib/WebGUI/AssetTrash.pm b/lib/WebGUI/AssetTrash.pm index 39871928f..2b0570aab 100644 --- a/lib/WebGUI/AssetTrash.pm +++ b/lib/WebGUI/AssetTrash.pm @@ -134,7 +134,7 @@ sub purge { # can't delete if it's one of these things if ($self->getId eq $session->setting->get("defaultPage") || $self->getId eq $session->setting->get("notFoundPage") || $self->get("isSystem")) { - $outputSub->(sprintf $i18n->get('Trying to delete system page %s. Aborting purge'), $self->getTitle); + $outputSub->(sprintf $i18n->get('Trying to delete system page %s. Aborting'), $self->getTitle); $session->errorHandler->security("delete a system protected page (".$self->getId.")"); return 0; } @@ -174,7 +174,7 @@ sub purge { # gotta delete stuff we've exported unless ($options->{skipExported}) { $outputSub->($i18n->get('Deleting exported files')); - $self->_invokeWorkflowOnExportedFiles($self->session->setting->get('purgeWorkflow'), 1); + $self->_invokeWorkflowOnExportedFiles($session->setting->get('purgeWorkflow'), 1); } # gonna need this at the end @@ -218,36 +218,59 @@ sub purge { #------------------------------------------------------------------- -=head2 trash ( ) +=head2 trash ( $options ) Removes asset from lineage, places it in trash state. The "gap" in the lineage is changed in state to trash-limbo. +=head3 $options + +An optional hashref of options + +=head4 outputSub + +A subroutine used to report the status of the purge, most likely used by WebGUI::ProgressBar->update. + =cut sub trash { - my $self = shift; - return undef if ($self->getId eq $self->session->setting->get("defaultPage") || $self->getId eq $self->session->setting->get("notFoundPage") || $self->get('isSystem')); + my $self = shift; + my $options = shift; + my $session = $self->session; + my $outputSub = $options->{outputSub} || sub {}; + my $i18n = WebGUI::International->new($session, 'Asset'); + + if ($self->getId eq $session->setting->get("defaultPage") || $self->getId eq $session->setting->get("notFoundPage") || $self->get('isSystem')) { + $outputSub->(sprintf $i18n->get('Trying to delete system page %s. Aborting'), $self->getTitle); + $session->errorHandler->security("delete a system protected page (".$self->getId.")"); + return undef; + } + + $outputSub->($i18n->get('Deleting exported files')); foreach my $asset ($self, @{$self->getLineage(['descendants'], {returnObjects => 1})}) { - $asset->_invokeWorkflowOnExportedFiles($self->session->setting->get('trashWorkflow'), 1); + $asset->_invokeWorkflowOnExportedFiles($session->setting->get('trashWorkflow'), 1); } # Trash any shortcuts to this asset my $shortcuts - = WebGUI::Asset::Shortcut->getShortcutsForAssetId($self->session, $self->getId, { returnObjects => 1}); + = WebGUI::Asset::Shortcut->getShortcutsForAssetId($session, $self->getId, { returnObjects => 1}); + $outputSub->($i18n->get('Purging shortcuts')); for my $shortcut ( @$shortcuts ) { - $shortcut->trash; + $shortcut->trash({ outputSub => $outputSub, }); } # Raw database work is more efficient than $asset->update - my $db = $self->session->db; + my $db = $session->db; $db->beginTransaction; my $sth = $db->read("select assetId from asset where lineage like ?",[$self->get("lineage").'%']); + $outputSub->($i18n->get('Clearing search index')); while (my ($id) = $sth->array) { $db->write("delete from assetIndex where assetId=?",[$id]); } + + $outputSub->($i18n->get('Clearing asset tables')); $db->write("update asset set state='trash-limbo' where lineage like ?",[$self->get("lineage").'%']); - $db->write("update asset set state='trash', stateChangedBy=?, stateChanged=? where assetId=?",[$self->session->user->userId, $self->session->datetime->time(), $self->getId]); + $db->write("update asset set state='trash', stateChangedBy=?, stateChanged=? where assetId=?",[$session->user->userId, $session->datetime->time(), $self->getId]); $db->commit; # Update ourselves since we didn't use update() @@ -303,18 +326,28 @@ Moves list of assets to trash, returns www_manageAssets() method of self if canE =cut sub www_deleteList { - my $self = shift; - foreach my $assetId ($self->session->form->param("assetId")) { - my $asset = WebGUI::Asset->newPending($self->session,$assetId); - if ($asset->canEdit && $asset->canEditIfLocked) { - $asset->trash; - } - } - if ($self->session->form->process("proceed") ne "") { - my $method = "www_".$self->session->form->process("proceed"); - return $self->$method(); + my $self = shift; + my $session = $self->session; + my $pb = WebGUI::ProgressBar->new($session); + my $i18n = WebGUI::International->new($session, 'Asset'); + my $form = $session->form; + my @assetIds = $form->param('assetId'); + $pb->start($i18n->get('Delete Assets'), $session->url->extras('adminConsole/assets.gif')); + ASSETID: foreach my $assetId (@assetIds) { + my $asset = eval { WebGUI::Asset->newPending($session,$assetId); }; + if ($@) { + $pb->update(sprintf $i18n->get('Error getting asset with assetId %s'), $assetId); + next ASSETID; } - return $self->www_manageAssets(); + if (! ($asset->canEdit && $asset->canEditIfLocked) ) { + $pb->update(sprintf $i18n->get('You cannot edit the asset %s, skipping'), $asset->getTitle); + } + else { + $asset->trash({outputSub => sub { $pb->update(@_); } }); + } + } + my $method = ($session->form->process("proceed")) ? $session->form->process('proceed') : 'manageTrash'; + $pb->finish($self->getUrl('func='.$method)); } @@ -410,7 +443,7 @@ sub www_purgeList { next ASSETID; } if (! $asset->canEdit) { - $pb->update(sprintf $i18n->get('You cannot edit the asset %s, skipping purge'), $asset->getTitle); + $pb->update(sprintf $i18n->get('You cannot edit the asset %s, skipping'), $asset->getTitle); } else { $asset->purge({outputSub => sub { $pb->update(@_); } }); diff --git a/lib/WebGUI/i18n/English/Asset.pm b/lib/WebGUI/i18n/English/Asset.pm index ed3a81b89..ec529ad72 100644 --- a/lib/WebGUI/i18n/English/Asset.pm +++ b/lib/WebGUI/i18n/English/Asset.pm @@ -1304,10 +1304,10 @@ Couldn't open %-s because %-s
context => q{Generic error when an asset cannot be looked up by assetId}, }, - 'You cannot edit the asset %s, skipping purge' => { - message => q{You cannot edit the asset %s, skipping purge}, + 'You cannot edit the asset %s, skipping' => { + message => q{You cannot edit the asset %s, skipping}, lastUpdated => 0, - context => q{Generic error when an asset cannot be deleted}, + context => q{Generic error when an asset cannot be edited}, }, 'Purging %s' => { @@ -1316,8 +1316,8 @@ Couldn't open %-s because %-s
context => q{}, }, - 'Trying to delete system page %s. Aborting purge' => { - message => q{Trying to delete system page %s. Aborting purge}, + 'Trying to delete system page %s. Aborting' => { + message => q{Trying to delete system page %s. Aborting}, lastUpdated => 0, context => q{}, },