diff options
author | Ivan Kohler <ivan@freeside.biz> | 2012-04-24 11:35:56 -0700 |
---|---|---|
committer | Ivan Kohler <ivan@freeside.biz> | 2012-04-24 11:35:56 -0700 |
commit | 6587f6ba7d047ddc1686c080090afe7d53365bd4 (patch) | |
tree | ec77342668e8865aca669c9b4736e84e3077b523 /rt/lib/RT/Action/SetStatus.pm | |
parent | 47153aae5c2fc00316654e7277fccd45f72ff611 (diff) |
first pass RT4 merge, RT#13852
Diffstat (limited to 'rt/lib/RT/Action/SetStatus.pm')
-rw-r--r-- | rt/lib/RT/Action/SetStatus.pm | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/rt/lib/RT/Action/SetStatus.pm b/rt/lib/RT/Action/SetStatus.pm new file mode 100644 index 000000000..f52d401cc --- /dev/null +++ b/rt/lib/RT/Action/SetStatus.pm @@ -0,0 +1,152 @@ +# BEGIN BPS TAGGED BLOCK {{{ +# +# COPYRIGHT: +# +# This software is Copyright (c) 1996-2012 Best Practical Solutions, LLC +# <sales@bestpractical.com> +# +# (Except where explicitly superseded by other copyright notices) +# +# +# LICENSE: +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 or visit their web page on the internet at +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +# +# +# CONTRIBUTION SUBMISSION POLICY: +# +# (The following paragraph is not intended to limit the rights granted +# to you to modify and distribute this software under the terms of +# the GNU General Public License and is only of importance to you if +# you choose to contribute your changes and enhancements to the +# community by submitting them to Best Practical Solutions, LLC.) +# +# By intentionally submitting any modifications, corrections or +# derivatives to this work, or any other work intended for use with +# Request Tracker, to Best Practical Solutions, LLC, you confirm that +# you are the copyright holder for those contributions and you grant +# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +# royalty-free, perpetual, license to use, copy, create derivative +# works based on those contributions, and sublicense and distribute +# those contributions and any derivatives thereof. +# +# END BPS TAGGED BLOCK }}} + +package RT::Action::SetStatus; + +use strict; +use warnings; +use base qw(RT::Action); + +=head1 NAME + +RT::Action::SetStatus - RT's scrip action to set status of a ticket + +=head1 DESCRIPTION + +This action changes status to a new value according to the rules in L</ARGUMENT>. +Status is not changed if the transition is invalid or another error occurs. All +issues are logged at apropriate levels. + +=head1 ARGUMENT + +Argument can be one of the following: + +=over 4 + +=item status literally + +Status is changed from the current value to a new defined by the argument, +but only if it's valid status and allowed by transitions of the current lifecycle, +for example: + + * The current status is 'stalled' + * Argument of this action is 'open' + * The only possible transition in the scheam from 'stalled' is 'open' + * Status is changed + +However, in the example above Status is not changed if argument is anything +else as it's just not allowed by the lifecycle. + +=item 'initial', 'active' or 'inactive' + +Status is changed from the current value to first possible 'initial', +'active' or 'inactive' correspondingly. First possible value is figured +according to transitions to the target set, for example: + + * The current status is 'open' + * Argument of this action is 'inactive' + * Possible transitions from 'open' are 'resolved', 'rejected' or 'deleted' + * Status is changed to 'resolved' + +=back + +=cut + +sub Prepare { + my $self = shift; + + my $ticket = $self->TicketObj; + my $lifecycle = $ticket->QueueObj->Lifecycle; + my $status = $ticket->Status; + + my $argument = $self->Argument; + unless ( $argument ) { + $RT::Logger->error("Argument is mandatory for SetStatus action"); + return 0; + } + + my $next = ''; + if ( $argument =~ /^(initial|active|inactive)$/i ) { + my $method = 'Is'. ucfirst lc $argument; + ($next) = grep $lifecycle->$method($_), $lifecycle->Transitions($status); + unless ( $next ) { + $RT::Logger->info("No transition from '$status' to $argument set"); + return 1; + } + } + elsif ( $lifecycle->IsValid( $argument ) ) { + unless ( $lifecycle->IsTransition( $status => $argument ) ) { + $RT::Logger->warning("Transition '$status -> $argument' is not valid"); + return 1; + } + $next = $argument; + } + else { + $RT::Logger->error("Argument for SetStatus action is not valid status or one of set"); + return 0; + } + + $self->{'set_status_to'} = $next; + + return 1; +} + +sub Commit { + my $self = shift; + + return 1 unless my $new_status = $self->{'set_status_to'}; + + my ($val, $msg) = $self->TicketObj->SetStatus( $new_status ); + unless ( $val ) { + $RT::Logger->error( "Couldn't set status: ". $msg ); + return 0; + } + return 1; +} + +1; |