%# BEGIN BPS TAGGED BLOCK {{{ %# %# COPYRIGHT: %# %# This software is Copyright (c) 1996-2021 Best Practical Solutions, LLC %# %# %# (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 }}} <& /RTIR/Elements/Header, Title => loc('Abandon Incidents') &> <& /Elements/Tabs &> <& /Elements/ListActions, actions => \@results &>
" method="post"> % foreach my $arg (qw(Query Format Rows Page OrderBy Order) ) { % next unless defined $ARGS{ $arg } && length $ARGS{ $arg }; % } <%PERL> my $found = $m->comp('/RTIR/Search/Elements/ShowResults', Lifecycle => RT::IR->lifecycle_incident, BaseURL => RT::IR->HREFTo('Incident/BulkAbandon.html'), BaseQuery => RT::IR->ActiveQuery( Lifecycle => RT::IR->lifecycle_incident ), Query => $Query, DisplayFormat => "__CheckBox__, $Format", Format => $Format, Rows => $Rows, OrderBy => $OrderBy, Order => $Order, Page => $Page, EmptyLabel => loc("no incidents"), ShowNavigation => 1, UpdateSession => 1, InlineEdit => 0, ); % if ( $found ) { <&| /Widgets/TitleBox, title => loc("Select recipients") &> % foreach my $box( @CheckBox ) { % my $checked = (scalar grep $_ && $box->{'Value'}, @ReplyToAll )? ' checked' : ''; " /> <% $box->{'Title'} %>
% }
<& Elements/ReplyForm, QueueObj => $queue &> <& /Elements/Submit, Name => "BulkAbandon", Caption => loc("Abandon selected incidents"), Label => loc("Abandon"), CheckAll => 1, ClearAll => 1, CheckboxName => 'SelectedTickets', &> % }
<%INIT> my @CheckBox = ( { Value => 'Incident Reports', Title => loc("Reply to all reports") }, { Value => 'Investigations', Title => loc("Reply to all investigations") }, ); my $Status = 'abandoned'; my ( @results ); ProcessAttachments( ARGSRef => \%ARGS ); if ( $ARGS{'BulkAbandon'} ) { my @tempresults; foreach my $id ( @SelectedTickets ) { my $t = RT::Ticket->new( $session{'CurrentUser'} ); $t->Load( $id ); unless( $t->id ) { push @tempresults, [ $id, loc("Couldn't load ticket.") ]; next; } $id = $t->id; unless( RT::IR->IsIncidentQueue($t->QueueObj) ) { push @tempresults, [ $id, loc("Is not incident.") ]; next; } # process replies if ( @ReplyToAll ) { my $children = RT::IR->IncidentChildren( $t, Lifecycle => \@ReplyToAll, Initial => 1, Active => 1, ); while ( my $child = $children->Next ) { push @tempresults, ProcessUpdateMessage( TicketObj => $child, ARGSRef => \%ARGS, KeepAttachments => 1 ); } } # manually clear this out since we told ProcessUpdateMessage to KeepAttachments delete $session{'Attachments'}{ $ARGS{'Token'} }; # process status updates { my $children = RT::IR->IncidentChildren( $t, Initial => 1, Active => 1, ); while ( my $child = $children->Next ) { next if RT::IR->IsLinkedToActiveIncidents( $child, $t ); push @tempresults, ProcessTicketBasics( TicketObj => $child, ARGSRef => { %ARGS, Status => RT::IR->MapStatus( $Status, $t => $child ), }, ); } } unless ( RT::IR->IncidentHasActiveChildren( $t ) ) { push @tempresults, ProcessTicketBasics( TicketObj => $t, ARGSRef => { %ARGS, Status => $Status }, ); } else { push @tempresults, [$t->id, loc("Status of the Incident left unchanged; not all children were updated")]; } } push @results, map { ref($_)? loc( "Ticket [_1]: [_2]", $_->[0], $_->[1] ): $_ } @tempresults; MaybeRedirectForResults( Actions => \@results, Arguments => { map { $_ => $ARGS{ $_ } } grep defined $ARGS{ $_ } && length $ARGS{ $_ }, qw(Query Format Rows Page OrderBy Order) }, ); } # XXX TODO Don't make this assumption my $queue = RT::Queue->new( $session{'CurrentUser'} ); $queue->Load('Incidents'); <%ARGS> $Query => '' $Format => RT->Config->Get('RTIRSearchResultFormats')->{'AbandonIncidents'} $Rows => 50 $Page => 1 $OrderBy => RT->Config->Get('DefaultSearchResultOrderBy') $Order => RT->Config->Get('DefaultSearchResultOrder') @SelectedTickets => () @ReplyToAll => ()