diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 5d53e4566..32b8a5a2e 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -1,6 +1,7 @@ 7.9.7 - fixed #11596: Calendar: all day events leaking - fixed #11604: scheduled workflows getting deleted + - added API method commitAsUser allowing developers to commit version tags as other users 7.9.6 - new checkbox in the asset manager for clearing the package flag on import diff --git a/lib/WebGUI/VersionTag.pm b/lib/WebGUI/VersionTag.pm index 0367f1bc2..cc5b8afb5 100644 --- a/lib/WebGUI/VersionTag.pm +++ b/lib/WebGUI/VersionTag.pm @@ -186,6 +186,64 @@ sub commit { return 2; } +#------------------------------------------------------------------- + +=head2 commitAsUser ( userId , options ) + +Commits the working tab. If userId is passed in, commit will be done as that user + +=head3 userId + +User to commit tag as + +=head3 options + +hash ref of options to pass in + +=head4 comments + +optional comments to set in the version tag + +=head4 commitNow + +optional boolean which, if set, will perform an immediate. + +=cut + +sub commitAsUser { + my $self = shift; + my $session = $self->session; + my $config = $session->config; + my $userId = shift; + my $options = shift; + my $commitNow = $options->{commitNow}; + my $comments = $options->{comments}; + + return 0 unless (defined $userId); + + #Open a new session + my $new_session = WebGUI::Session->open( $config->getWebguiRoot, $config->getFilename ); + #Set the userId in the new session + $new_session->user( { userId => $userId } ); + + #Clone the tag into a new version tag in the new session + my $new_tag = __PACKAGE__->new( $new_session, $self->getId ); + + if ( defined $new_tag ) { + $new_tag->set( { comments => $comments } ); + if ($commitNow) { + $new_tag->commit; + } + else { + $new_tag->requestCommit; + } + } + #End the new session + $new_session->var->end; + $new_session->close; + return 1; +} + #------------------------------------------------------------------- diff --git a/t/VersionTag.t b/t/VersionTag.t index 0a981e896..606700543 100644 --- a/t/VersionTag.t +++ b/t/VersionTag.t @@ -14,7 +14,7 @@ use lib "$FindBin::Bin/lib"; use WebGUI::Test; use WebGUI::Session; use WebGUI::VersionTag; -use Test::More tests => 81; # increment this value for each test you create +use Test::More tests => 85; # increment this value for each test you create my $session = WebGUI::Test->session; @@ -184,8 +184,31 @@ is($tag3->getRevisionCount, 5, 'original tag still with five revisions'); $tag4->clearWorking; $tag3->rollback; $tag4->rollback; -($asset1, $asset2, $asset3, $tag3, $tag4) = (); +#Test commitAsUser +my $tag5 = WebGUI::VersionTag->create($session, {}); +$tag5->setWorking; +my $asset5 = WebGUI::Asset->getRoot($session)->addChild({ className => 'WebGUI::Asset::Snippet' }); +is($tag5->get("createdBy"),1,'tag created by visitor'); +$tag5->commitAsUser(3); +$tag5 = WebGUI::VersionTag->new($session, $tag5->getId); #Get the tag again - properties have changed +is($tag5->get("committedBy"),3,'tag committed by admin'); +$tag5->clearWorking; +$tag5->rollback; + +#Test commitAsUser with options +my $tag6 = WebGUI::VersionTag->create($session, {}); +$tag6->setWorking; +my $asset6 = WebGUI::Asset->getRoot($session)->addChild({ className => 'WebGUI::Asset::Snippet' }); +$tag6->commitAsUser(3, { commitNow => "yes" }); +$tag6 = WebGUI::VersionTag->new($session, $tag6->getId); #Get the tag again - properties have changed +is($tag6->get("committedBy"),3,'tag committed by admin again'); +$asset6 = WebGUI::Asset->newByDynamicClass($session,$asset6->getId); #Get the asset again - properties have changed +is($asset6->get("status"),"approved","asset status approved"); +$tag6->clearWorking; +$tag6->rollback; + +($asset1, $asset2, $asset3, $asset5, $asset6, $tag3, $tag4, $tag5, $tag6) = (); #additional tests for versionTagMode #