From 99a9da626d863ce051b1c299e18782be58ffc561 Mon Sep 17 00:00:00 2001 From: Graham Knop Date: Wed, 22 Oct 2008 16:04:10 +0000 Subject: [PATCH] rfe #640: Refactored autocommit and autocomment Autocommit assets like CS posts or Calendar Events can now be added before the parent is committed. They will go into the same version tag as their parent. --- docs/changelog/7.x.x.txt | 3 + lib/WebGUI/Asset.pm | 41 ++++---------- lib/WebGUI/Asset/Event.pm | 56 ++++++++++++------- lib/WebGUI/Asset/File/GalleryFile.pm | 9 ++- lib/WebGUI/Asset/FilePile.pm | 26 +++------ lib/WebGUI/Asset/Post.pm | 10 +++- lib/WebGUI/Asset/Post/Thread.pm | 8 +++ lib/WebGUI/Asset/Template.pm | 5 +- lib/WebGUI/Asset/WikiPage.pm | 11 ++-- lib/WebGUI/Asset/Wobject/Calendar.pm | 22 +------- lib/WebGUI/Asset/Wobject/Collaboration.pm | 49 ---------------- lib/WebGUI/Asset/Wobject/GalleryAlbum.pm | 9 ++- lib/WebGUI/Asset/Wobject/Layout.pm | 4 +- lib/WebGUI/Asset/Wobject/Shelf.pm | 21 ++----- lib/WebGUI/Asset/Wobject/WikiMaster.pm | 20 ------- lib/WebGUI/AssetBranch.pm | 14 ++--- lib/WebGUI/AssetClipboard.pm | 35 +++++------- lib/WebGUI/AssetPackage.pm | 15 ++--- lib/WebGUI/Content/AssetManager.pm | 22 +++----- lib/WebGUI/Form/Attachments.pm | 4 +- lib/WebGUI/VersionTag.pm | 54 ++++++++++++++++++ .../Workflow/Activity/CalendarUpdateFeeds.pm | 39 ++++++++++--- 22 files changed, 218 insertions(+), 259 deletions(-) diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 092f610b9..96bfae10d 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -25,6 +25,9 @@ - rfe #746: use the menu title in asset manager - rfe #549: New macro for checking spectre status. VersionTag::RequestCommit and Operation::VestionTag::www_commitVertionTag now both check for spectre status before trying to commit. - rfe #637: Alphabetize wiki items under a keyword? + - Autocommit assets like CS posts or Calendar Events can now be added before the + parent is committed. They will go into the same version tag as their parent. + - rfe #640: Refactored autocommit and autocomment 7.6.1 diff --git a/lib/WebGUI/Asset.pm b/lib/WebGUI/Asset.pm index 58dfa78de..b10a7a1ea 100644 --- a/lib/WebGUI/Asset.pm +++ b/lib/WebGUI/Asset.pm @@ -2550,35 +2550,17 @@ sub www_editSave { $object->updateHistory("edited"); - # Handle Save & Commit button - if ($self->session->form->process("saveAndCommit") ne "") { - if ($self->session->setting->get("skipCommitComments")) { - $self->session->http->setRedirect( - $self->getUrl("op=commitVersionTagConfirm;tagId=".WebGUI::VersionTag->getWorking($self->session)->getId) - ); - } - else { - $self->session->http->setRedirect( - $self->getUrl("op=commitVersionTag;tagId=".WebGUI::VersionTag->getWorking($self->session)->getId) - ); - } - return undef; + # we handle auto commit assets here in case they didn't handle it themselves + if ($object->getAutoCommitWorkflowId && $self->hasBeenCommitted) { + $object->requestAutoCommit; } - - # Handle Auto Request Commit setting - if ($self->session->setting->get("autoRequestCommit")) { - # Make sure version tag hasn't already been committed by another process - my $versionTag = WebGUI::VersionTag->getWorking($self->session, "nocreate"); - - if ($versionTag && $self->session->setting->get("skipCommitComments")) { - $versionTag->requestCommit; - } - elsif ($versionTag) { - $self->session->http->setRedirect( - $self->getUrl("op=commitVersionTag;tagId=".WebGUI::VersionTag->getWorking($self->session)->getId) - ); - return undef; - } + # else, try to to auto commit + elsif(WebGUI::VersionTag->autoCommitWorkingIfEnabled($self->session, { + override => scalar $self->session->form->process('saveAndCommit'), + allowComments => 1, + returnUrl => $self->getUrl, + })) { + return undef; } # Handle "saveAndReturn" button @@ -2600,12 +2582,11 @@ sub www_editSave { $self->session->asset($object); return $self->session->asset->$method(); } - + $self->session->asset($object->getContainer); return $self->session->asset->www_view; } - #------------------------------------------------------------------- diff --git a/lib/WebGUI/Asset/Event.pm b/lib/WebGUI/Asset/Event.pm index 6d01f1de4..fc7a17b19 100644 --- a/lib/WebGUI/Asset/Event.pm +++ b/lib/WebGUI/Asset/Event.pm @@ -16,12 +16,12 @@ our $VERSION = "0.0.0"; use Tie::IxHash; use Carp qw(croak); -use Storable qw(nfreeze thaw); use WebGUI::International; use WebGUI::Asset::Template; use WebGUI::Form; use WebGUI::Storage::Image; +use Storable; use base 'WebGUI::Asset'; @@ -275,8 +275,7 @@ sub generateRecurringEvents { $properties->{startTime} = $startDate->toDatabaseTime; $properties->{endTime} = $endDate->toDatabaseTime; } - my $newEvent = $parent->addChild($properties); - $newEvent->requestAutoCommit; + my $newEvent = $parent->addChild($properties, undef, undef, { skipAutoCommitWorkflows => 1 }); } } @@ -298,8 +297,12 @@ By specifying this method, you activate this feature. sub getAutoCommitWorkflowId { my $self = shift; - return $self->getParent->get('workflowIdCommit') - || $self->session->setting->get('defaultVersionTagWorkflow'); + my $parent = $self->getParent; + if ($parent->hasBeenCommitted) { + return $parent->get('workflowIdCommit') + || $self->session->setting->get('defaultVersionTagWorkflow'); + } + return undef; } @@ -1469,7 +1472,7 @@ sub processPropertiesFromFormPost { my $self = shift; $self->SUPER::processPropertiesFromFormPost; # Updates the event my $session = $self->session; - my $form = $self->session->form; + my $form = $session->form; ### Verify the form was filled out correctly... my @errors; @@ -1489,6 +1492,17 @@ sub processPropertiesFromFormPost { return \@errors; } + # Since we may be adding more events, set out version tag to be active if needed + # Leave the original version tag available, we will need to reactivate it before returning + warn "trying to activate version tag\n"; + my $activeVersionTag = WebGUI::VersionTag->getWorking($session, 'nocreate'); + # if our version tag is active, we don't need a new one, and don't need to reactivate anything later + if ($activeVersionTag && $activeVersionTag->getId eq $self->get('tagId')) { + undef $activeVersionTag; + } + else { + WebGUI::VersionTag->new($session, $self->get('tagId'))->setWorking; + } ### Form is verified # Events are always hidden from navigation @@ -1518,16 +1532,16 @@ sub processPropertiesFromFormPost { my $dtStart = WebGUI::DateTime->new($session, mysql => $self->get("startDate") . " " . $self->get("startTime"), - time_zone => $tz, + time_zone => $tz, ); my $dtEnd = WebGUI::DateTime->new($session, mysql => $self->get("endDate") . " " . $self->get("endTime"), - time_zone => $tz, + time_zone => $tz, ); - $self->update({ + $self->update({ startDate => $dtStart->toDatabaseDate, startTime => $dtStart->toDatabaseTime, endDate => $dtEnd->toDatabaseDate, @@ -1603,7 +1617,6 @@ sub processPropertiesFromFormPost { $self->setRelatedLinks(\@rel_link_saves); - # Determine if the pattern has changed if ($form->param("recurType")) { # Create the new recurrence hash @@ -1617,16 +1630,19 @@ sub processPropertiesFromFormPost { # Pattern keys - if (nfreeze(\%recurrence_new) ne nfreeze(\%recurrence_old)) { + if (Storable::freeze(\%recurrence_new) ne Storable::freeze(\%recurrence_old)) { # Delete all old events and create new ones my $old_id = $self->get("recurId"); # Set the new recurrence pattern if (%recurrence_new) { my $new_id = $self->setRecurrence(\%recurrence_new); - return ["There is something wrong with your recurrence pattern."] - unless $new_id; - + if (! $new_id) { + $activeVersionTag->setWorking + if $activeVersionTag; + return ["There is something wrong with your recurrence pattern."]; + } + # Generate the new recurring events $self->generateRecurringEvents(); } @@ -1649,7 +1665,7 @@ sub processPropertiesFromFormPost { # TODO: Give users a form property to decide what events to update # TODO: Make a workflow activity to do this, so that updating # 1 million events doesn't kill the server. - # Just update related events + # Just update related events my %properties = %{ $self->get }; delete $properties{startDate}; delete $properties{endDate}; @@ -1663,23 +1679,21 @@ sub processPropertiesFromFormPost { }); for my $eventId (@{$events}) { - my $event = WebGUI::Asset->newByDynamicClass($session,$eventId); + my $event = WebGUI::Asset->newByDynamicClass($session, $eventId); # Add a revision $properties{ startDate } = $event->get("startDate"); $properties{ endDate } = $event->get("endDate"); # addRevision returns the new revision - $event = $event->addRevision(\%properties); - $event->requestAutoCommit(); + $event = $event->addRevision(\%properties, undef, { skipAutoCommitWorkflows => 1 }); } } } + $activeVersionTag->setWorking + if $activeVersionTag; - # Finally, commit this event delete $self->{_storageLocation}; - $self->requestAutoCommit; - return undef; } diff --git a/lib/WebGUI/Asset/File/GalleryFile.pm b/lib/WebGUI/Asset/File/GalleryFile.pm index e0ad40ae9..e6f8a470b 100644 --- a/lib/WebGUI/Asset/File/GalleryFile.pm +++ b/lib/WebGUI/Asset/File/GalleryFile.pm @@ -281,7 +281,12 @@ Returns the workflowId of the Gallery's approval workflow. sub getAutoCommitWorkflowId { my $self = shift; - return $self->getGallery->get("workflowIdCommit"); + my $gallery = $self->getGallery; + if ($gallery->hasBeenCommitted) { + return $gallery->get("workflowIdCommit") + || $self->session->setting->get('defaultVersionTagWorkflow'); + } + return undef; } #---------------------------------------------------------------------------- @@ -683,8 +688,6 @@ sub processPropertiesFromFormPost { } ); } - $self->requestAutoCommit; - return; } diff --git a/lib/WebGUI/Asset/FilePile.pm b/lib/WebGUI/Asset/FilePile.pm index 59cfa8373..d3e836cc7 100644 --- a/lib/WebGUI/Asset/FilePile.pm +++ b/lib/WebGUI/Asset/FilePile.pm @@ -195,25 +195,13 @@ sub editSave { } $tempStorage->delete; - # deal with special commit rules - if ($self->session->form->process("saveAndCommit") ne "") { - if ($self->session->setting->get("skipCommitComments")) { - $self->session->http->setRedirect($self->getUrl("op=commitVersionTagConfirm;tagId=".WebGUI::VersionTag->getWorking($self->session)->getId)); - } - else { - $self->session->http->setRedirect($self->getUrl("op=commitVersionTag;tagId=".WebGUI::VersionTag->getWorking($self->session)->getId)); - } - return undef; - } - if ($self->session->setting->get("autoRequestCommit")) { - if ($self->session->setting->get("skipCommitComments")) { - WebGUI::VersionTag->getWorking($self->session)->requestCommit; - } - else { - $self->session->http->setRedirect($self->getUrl("op=commitVersionTag;tagId=".WebGUI::VersionTag->getWorking($self->session)->getId)); - return undef; - } - } + if (WebGUI::VersionTag->autoCommitWorkingIfEnabled($self->session, { + override => scalar $self->session->form->process("saveAndCommit"), + allowComments => 1, + returnUrl => $self->getUrl, + })) { + return undef; + }; return $self->getParent->www_manageAssets if ($self->session->form->process("proceed") eq "manageAssets"); return $self->getParent->www_view; diff --git a/lib/WebGUI/Asset/Post.pm b/lib/WebGUI/Asset/Post.pm index 8b119e80e..ddb7d4531 100644 --- a/lib/WebGUI/Asset/Post.pm +++ b/lib/WebGUI/Asset/Post.pm @@ -332,8 +332,13 @@ sub getContentLastModified { #------------------------------------------------------------------- sub getAutoCommitWorkflowId { - my $self = shift; - return $self->getThread->getParent->get("approvalWorkflow"); + my $self = shift; + my $cs = $self->getThread->getParent; + if ($cs->hasBeenCommitted) { + return $cs->get('approvalWorkflow') + || $self->session->setting->get('defaultVersionTagWorkflow'); + } + return undef; } #------------------------------------------------------------------- @@ -879,7 +884,6 @@ sub postProcess { $size += $storage->getFileSize($file); } $self->setSize($size); - $self->requestAutoCommit; } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Asset/Post/Thread.pm b/lib/WebGUI/Asset/Post/Thread.pm index f8b131cb0..b26d57b23 100644 --- a/lib/WebGUI/Asset/Post/Thread.pm +++ b/lib/WebGUI/Asset/Post/Thread.pm @@ -582,6 +582,14 @@ sub postProcess { $self->SUPER::postProcess; } +sub processPropertiesFromFormPost { + my $self = shift; + if ($self->isNew && $self->getParent->getValue('useCaptcha')) { + my $captcha = $self->session->form->process("captcha","Captcha"); + return [ 'invalid captcha' ]; + } +} + #------------------------------------------------------------------- sub purge { diff --git a/lib/WebGUI/Asset/Template.pm b/lib/WebGUI/Asset/Template.pm index e24a5ac15..c2a3cb0c4 100644 --- a/lib/WebGUI/Asset/Template.pm +++ b/lib/WebGUI/Asset/Template.pm @@ -467,10 +467,7 @@ sub www_editDuplicate { # Auto-commit our revision if necessary # TODO: This needs to be handled automatically somehow... - if ($session->setting->get("autoRequestCommit")) { - my $tag = WebGUI::VersionTag->getWorking($session)->requestCommit; - } - + WebGUI::VersionTag->autoCommitWorkingIfEnabled($self->session); last DEF; } } diff --git a/lib/WebGUI/Asset/WikiPage.pm b/lib/WebGUI/Asset/WikiPage.pm index 906dd7a49..6772b3293 100644 --- a/lib/WebGUI/Asset/WikiPage.pm +++ b/lib/WebGUI/Asset/WikiPage.pm @@ -117,7 +117,12 @@ sub definition { #------------------------------------------------------------------- sub getAutoCommitWorkflowId { my $self = shift; - return $self->getWiki->get("approvalWorkflow"); + my $wiki = $self->getWiki; + if ($wiki->hasBeenCommitted) { + return $wiki->get('approvalWorkflow') + || $self->session->setting->get('defaultVersionTagWorkflow'); + } + return undef; } @@ -266,9 +271,7 @@ sub processPropertiesFromFormPost { } } - # wiki pages are auto committed - $self->requestAutoCommit; -} +} #------------------------------------------------------------------- diff --git a/lib/WebGUI/Asset/Wobject/Calendar.pm b/lib/WebGUI/Asset/Wobject/Calendar.pm index cf5c1a60a..191bb3e16 100644 --- a/lib/WebGUI/Asset/Wobject/Calendar.pm +++ b/lib/WebGUI/Asset/Wobject/Calendar.pm @@ -425,7 +425,7 @@ sub canAddEvent { : $self->session->user ; - return 1 if ( + return 1 if ( $user->isInGroup( $self->get("groupIdEventEdit") ) ); } @@ -1755,26 +1755,6 @@ sub wrapIcal { return join "\r\n ",@text; } -#------------------------------------------------------------------- - -=head2 www_add ( ) - -Returns an error message if the collaboration system has not yet been posted. - -=cut - -sub www_add { - my $self = shift; - - #Check to see if the asset has been committed - unless ($self->hasBeenCommitted ) { - my $i18n = WebGUI::International->new($self->session,"Asset_Calendar"); - return $self->processStyle($i18n->get("asset not committed")); - } - return $self->SUPER::www_add( @_ ); -} - - #---------------------------------------------------------------------------- =head2 www_edit ( ) diff --git a/lib/WebGUI/Asset/Wobject/Collaboration.pm b/lib/WebGUI/Asset/Wobject/Collaboration.pm index 02ccbc12d..c8fb0629b 100644 --- a/lib/WebGUI/Asset/Wobject/Collaboration.pm +++ b/lib/WebGUI/Asset/Wobject/Collaboration.pm @@ -1388,55 +1388,6 @@ sub view { #------------------------------------------------------------------- -=head2 www_add ( ) - -Returns an error message if the collaboration system has not yet been posted. - -=cut - -sub www_add { - my $self = shift; - - #Check to see if the asset has been committed - unless ( $self->hasBeenCommitted ) { - my $i18n = WebGUI::International->new($self->session,"Asset_Collaboration"); - return $self->processStyle($i18n->get("asset not committed")); - } - return $self->SUPER::www_add( @_ ); -} - - -#------------------------------------------------------------------- - -=head2 www_editSave ( ) - -We're extending www_editSave() here to deal with editing a post that has been denied by the approval process. Our change will reassign the old working tag of this post to the user so that they can edit it. - -=cut - -sub www_editSave { - my $self = shift; - my $session = $self->session; - - my $className = $session->form->param("class"); - - #my $assetId = $self->session->form->param("assetId"); - if($className eq "WebGUI::Asset::Post::Thread") { - my $assetId = $session->form->param("assetId"); - - if($assetId eq "new" && $self->getValue("useCaptcha")) { - my $captcha = $self->session->form->process("captcha","Captcha"); - unless ($captcha) { - return $self->www_add; - } - } - } - - return $self->SUPER::www_editSave(); -} - -#------------------------------------------------------------------- - =head2 www_search ( ) The web method to display and use the forum search interface. diff --git a/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm b/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm index 3e6d581cf..d0d8cbded 100644 --- a/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm +++ b/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm @@ -361,7 +361,12 @@ Returns the workflowId of the Gallery's approval workflow. sub getAutoCommitWorkflowId { my $self = shift; - return $self->getParent->get("workflowIdCommit"); + my $gallery = $self->getParent; + if ($gallery->hasBeenCommitted) { + return $gallery->get("workflowIdCommit") + || $self->session->setting->get('defaultVersionTagWorkflow'); + } + return undef; } #---------------------------------------------------------------------------- @@ -708,8 +713,6 @@ sub processPropertiesFromFormPost { return $errors if @$errors; ### Passes all checks - - $self->requestAutoCommit; } #---------------------------------------------------------------------------- diff --git a/lib/WebGUI/Asset/Wobject/Layout.pm b/lib/WebGUI/Asset/Wobject/Layout.pm index 3fcb50245..11fe71702 100644 --- a/lib/WebGUI/Asset/Wobject/Layout.pm +++ b/lib/WebGUI/Asset/Wobject/Layout.pm @@ -303,9 +303,7 @@ sub www_setContentPositions { $self->addRevision({ contentPositions=>$self->session->form->process("map") }); - if ($self->session->setting->get("autoRequestCommit")) { - WebGUI::VersionTag->getWorking($self->session)->requestCommit; - } + WebGUI::VersionTag->autoCommitWorkingIfEnabled($self->session); return "Map set: ".$self->session->form->process("map"); } diff --git a/lib/WebGUI/Asset/Wobject/Shelf.pm b/lib/WebGUI/Asset/Wobject/Shelf.pm index 22e088667..26f05a7a4 100644 --- a/lib/WebGUI/Asset/Wobject/Shelf.pm +++ b/lib/WebGUI/Asset/Wobject/Shelf.pm @@ -385,21 +385,12 @@ sub www_importProducts { } else { $status_message = $i18n->get('import successful'); - ##Copy and paste from WebGUI::Asset, www_editSave - if ($self->session->setting->get("autoRequestCommit")) { - # Make sure version tag hasn't already been committed by another process - my $versionTag = WebGUI::VersionTag->getWorking($self->session, "nocreate"); - - if ($versionTag && $self->session->setting->get("skipCommitComments")) { - $versionTag->requestCommit; - } - elsif ($versionTag) { - $self->session->http->setRedirect( - $self->getUrl("op=commitVersionTag;tagId=".WebGUI::VersionTag->getWorking($self->session)->getId) - ); - return undef; - } - } + if (WebGUI::VersionTag->autoCommitWorkingIfEnabled($self->session, { + allowComments => 1, + returnUrl => $self->getUrl, + })) { + return undef; + }; } } diff --git a/lib/WebGUI/Asset/Wobject/WikiMaster.pm b/lib/WebGUI/Asset/Wobject/WikiMaster.pm index ce6676e18..9847a079e 100644 --- a/lib/WebGUI/Asset/Wobject/WikiMaster.pm +++ b/lib/WebGUI/Asset/Wobject/WikiMaster.pm @@ -392,26 +392,6 @@ sub view { return $self->processTemplate($var, undef, $template); } -#------------------------------------------------------------------- - -=head2 www_add ( ) - -Returns an error message if the collaboration system has not yet been posted. - -=cut - -sub www_add { - my $self = shift; - - #Check to see if the asset has been committed - unless ($self->hasBeenCommitted ) { - my $i18n = WebGUI::International->new($self->session,"Asset_WikiMaster"); - return $self->processStyle($i18n->get("asset not committed")); - } - return $self->SUPER::www_add( @_ ); -} - - #------------------------------------------------------------------- sub www_byKeyword { diff --git a/lib/WebGUI/AssetBranch.pm b/lib/WebGUI/AssetBranch.pm index ca08fef84..f20cb8c94 100644 --- a/lib/WebGUI/AssetBranch.pm +++ b/lib/WebGUI/AssetBranch.pm @@ -304,14 +304,12 @@ sub www_editBranchSave { } } } - if ($self->session->setting->get("autoRequestCommit")) { - if ($self->session->setting->get("skipCommitComments")) { - WebGUI::VersionTag->getWorking($self->session)->requestCommit; - } else { - $self->session->http->setRedirect($self->getUrl("op=commitVersionTag;tagId=".WebGUI::VersionTag->getWorking($self->session)->getId)); - return undef; - } - } + if (WebGUI::VersionTag->autoCommitWorkingIfEnabled($self->session, { + allowComments => 1, + returnUrl => $self->getUrl, + })) { + return undef; + }; delete $self->{_parent}; $self->session->asset($self->getParent); return $self->getParent->www_manageAssets; diff --git a/lib/WebGUI/AssetClipboard.pm b/lib/WebGUI/AssetClipboard.pm index 2315fef7f..fb90faf6c 100644 --- a/lib/WebGUI/AssetClipboard.pm +++ b/lib/WebGUI/AssetClipboard.pm @@ -219,16 +219,12 @@ sub www_copy { my $i18n = WebGUI::International->new($self->session, 'Asset'); $newAsset->update({ title=>sprintf("%s (%s)",$self->getTitle,$i18n->get('copy'))}); $newAsset->cut; - if ($self->session->setting->get("autoRequestCommit")) { - if ($self->session->setting->get("skipCommitComments")) { - WebGUI::VersionTag->getWorking($self->session)->requestCommit; - } else { - $self->session->http->setRedirect($self->getUrl( - "op=commitVersionTag;tagId=".WebGUI::VersionTag->getWorking($self->session)->getId - )); - return undef; - } - } + if (WebGUI::VersionTag->autoCommitWorkingIfEnabled($self->session, { + allowComments => 1, + returnUrl => $self->getUrl, + })) { + return undef; + }; return $self->session->asset($self->getContainer)->www_view; } @@ -287,17 +283,14 @@ sub www_createShortcut { if (! $isOnDashboard) { $child->cut; } - if ($self->session->setting->get("autoRequestCommit")) { - if ($self->session->setting->get("skipCommitComments")) { - WebGUI::VersionTag->getWorking($self->session)->requestCommit; - } else { - $self->session->http->setRedirect($self->getUrl( - "op=commitVersionTag;tagId=".WebGUI::VersionTag->getWorking($self->session)->getId - )); - return 1; - } - } - if ($isOnDashboard) { + if (WebGUI::VersionTag->autoCommitWorkingIfEnabled($self->session, { + allowComments => 1, + returnUrl => $self->getUrl, + })) { + return undef; + }; + + if ($isOnDashboard) { return $self->getParent->www_view; } else { $self->session->asset($self->getContainer); diff --git a/lib/WebGUI/AssetPackage.pm b/lib/WebGUI/AssetPackage.pm index db20a3fd5..2d10d1b41 100644 --- a/lib/WebGUI/AssetPackage.pm +++ b/lib/WebGUI/AssetPackage.pm @@ -336,15 +336,12 @@ sub www_importPackage { } } # Handle autocommit workflows - if ($self->session->setting->get("autoRequestCommit")) { - if ($self->session->setting->get("skipCommitComments")) { - WebGUI::VersionTag->getWorking($self->session)->requestCommit; - } - else { - $self->session->http->setRedirect($self->getUrl("op=commitVersionTag;tagId=".WebGUI::VersionTag->getWorking($self->session)->getId)); - return undef; - } - } + if (WebGUI::VersionTag->autoCommitWorkingIfEnabled($self->session, { + allowComments => 1, + returnUrl => $self->getUrl, + })) { + return undef; + }; return $self->www_manageAssets(); } diff --git a/lib/WebGUI/Content/AssetManager.pm b/lib/WebGUI/Content/AssetManager.pm index c87a57ee8..16b6ed3a6 100644 --- a/lib/WebGUI/Content/AssetManager.pm +++ b/lib/WebGUI/Content/AssetManager.pm @@ -371,21 +371,13 @@ sub www_manage { } } - # Handle Auto Request Commit setting - if ($session->setting->get("autoRequestCommit")) { - # Make sure version tag hasn't already been committed by another process - my $versionTag = WebGUI::VersionTag->getWorking($session, "nocreate"); - - if ($versionTag && $session->setting->get("skipCommitComments")) { - $versionTag->requestCommit; - } - elsif ($versionTag) { - $session->http->setRedirect( - $currentAsset->getUrl("op=commitVersionTag;tagId=".WebGUI::VersionTag->getWorking($session)->getId) - ); - return undef; - } - } + # Handle autocommit workflows + if (WebGUI::VersionTag->autoCommitWorkingIfEnabled($session, { + allowComments => 1, + returnUrl => $currentAsset->getUrl, + })) { + return undef; + }; # Show the page # i18n we'll need later diff --git a/lib/WebGUI/Form/Attachments.pm b/lib/WebGUI/Form/Attachments.pm index fd62b7017..e4ce92241 100644 --- a/lib/WebGUI/Form/Attachments.pm +++ b/lib/WebGUI/Form/Attachments.pm @@ -315,9 +315,7 @@ sub www_upload { $asset->getStorageLocation->addFileFromFilesystem($storage->getPath($filename)); $asset->applyConstraints; push(@assetIds, $asset->getId); - if ($session->setting->get("autoRequestCommit")) { - WebGUI::VersionTag->getWorking($session)->requestCommit; - } + WebGUI::VersionTag->autoCommitWorkingIfEnabled($session); $storage->delete; return www_show($session, \@assetIds); } diff --git a/lib/WebGUI/VersionTag.pm b/lib/WebGUI/VersionTag.pm index ad942f90b..74f006007 100644 --- a/lib/WebGUI/VersionTag.pm +++ b/lib/WebGUI/VersionTag.pm @@ -37,6 +37,60 @@ These methods are available from this class: =cut +#------------------------------------------------------------------- + +=head2 autoCommitWorkingIfEnabled ( $session, $options ) + +A class method that automatically commits the working version tag if auto commit is +enabled. Returns true if the version tag was committed. + +=head3 $options + +Hashref with options for how to do auto commit + +=head4 override + +Do autocommit even if not enabled for the site + +=head4 allowComments + +Whether to allow comments to be added. If enabled, instead of +committing directly, will set a redirect for the user to enter +a comment. + +=head4 returnUrl + +If allowComments is enabled, the URL to return to after committing + +=cut + +sub autoCommitWorkingIfEnabled { + my $class = shift; + my $session = shift; + my $options = shift || {}; + # need a version tag to do any auto commit + my $versionTag = $class->getWorking($session, "nocreate"); + return + unless $versionTag; + # auto commit assets + # save and commit button and site wide auto commit work the same + if ( + $options->{override} + || $session->setting->get("autoRequestCommit") + ) { + if ($session->setting->get("skipCommitComments") || !$options->{allowComments}) { + $versionTag->requestCommit; + return 1; + } + else { + my $url = $options->{returnUrl} || $session->url->page; + $url = $session->url->append($url, "op=commitVersionTag;tagId=" . $versionTag->getId); + $session->http->setRedirect($url); + return 1; + } + } +} + #------------------------------------------------------------------- =head2 clearWorking ( ) diff --git a/lib/WebGUI/Workflow/Activity/CalendarUpdateFeeds.pm b/lib/WebGUI/Workflow/Activity/CalendarUpdateFeeds.pm index c401d9d0a..e50127bb9 100755 --- a/lib/WebGUI/Workflow/Activity/CalendarUpdateFeeds.pm +++ b/lib/WebGUI/Workflow/Activity/CalendarUpdateFeeds.pm @@ -25,7 +25,7 @@ use WebGUI::DateTime; use DateTime::TimeZone; use LWP::UserAgent; -use JSON qw(encode_json decode_json); +use JSON (); =head1 NAME @@ -91,8 +91,8 @@ sub execute { my $eventList = []; my $feedList; if ($instance->getScratch('events')) { - $eventList = decode_json($instance->getScratch('events')); - $feedList = decode_json($instance->getScratch('feeds')); + $eventList = JSON::from_json($instance->getScratch('events')); + $feedList = JSON::from_json($instance->getScratch('feeds')); } else { my $ua = LWP::UserAgent->new(agent => "WebGUI"); @@ -353,11 +353,22 @@ sub execute { } } } + my $currentVersionTag = WebGUI::VersionTag->getWorking($self->session, 1); + if ($currentVersionTag) { + $currentVersionTag->clearWorking; + } my $ttl = $self->getTTL; while (@$eventList) { if ($startTime + $ttl < time()) { - $instance->setScratch('events', encode_json($eventList)); - $instance->setScratch('feeds', encode_json($feedList)); + $instance->setScratch('events', JSON::to_json($eventList)); + $instance->setScratch('feeds', JSON::to_json($feedList)); + my $newVersionTag = WebGUI::VersionTag->getWorking($self->session, 1); + if ($newVersionTag) { + $newVersionTag->requestCommit; + } + if ($currentVersionTag) { + $currentVersionTag->setWorking; + } return $self->WAITING; } my $eventData = shift @$eventList; @@ -376,7 +387,6 @@ sub execute { if ($event) { $event->update($properties); - $event->requestAutoCommit; $feed->{updated}++; } } @@ -384,10 +394,16 @@ sub execute { my $calendar = WebGUI::Asset->newByDynamicClass($self->session,$feed->{assetId}); if (!defined $calendar) { $self->session->errorHandler->error("CalendarUpdateFeeds Activity: Calendar object failed to instanciate. Did you commit the calendar wobject?"); + my $newVersionTag = WebGUI::VersionTag->getWorking($self->session, 1); + if ($newVersionTag) { + $newVersionTag->requestCommit; + } + if ($currentVersionTag) { + $currentVersionTag->setWorking; + } return $self->ERROR; } - my $event = $calendar->addChild($properties); - $event->requestAutoCommit; + my $event = $calendar->addChild($properties, { skipAutoCommitWorkflows => 1}); $feed->{added}++; if ($recur) { $event->setRecurrence($recur); @@ -398,6 +414,13 @@ sub execute { # TODO: Only update if last-updated field is # greater than the event's lastUpdated property } + my $newVersionTag = WebGUI::VersionTag->getWorking($self->session, 1); + if ($newVersionTag) { + $newVersionTag->requestCommit; + } + if ($currentVersionTag) { + $currentVersionTag->setWorking; + } for my $feedId (keys %$feedList) { my $feed = $feedList->{$feedId}; $self->session->db->write("update Calendar_feeds set lastResult=?,lastUpdated=? where feedId=?",