X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=rt%2Flib%2FRT%2FScrips.pm;h=3ec563b652cdcee8e36c400b017fbb4ec937d262;hb=de9d037528895f7151a9aead6724ce2df95f9586;hp=4649885f70e41a7a293baf06018740dba5affe64;hpb=919e930aa9279b3c5cd12b593889cd6de79d67bf;p=freeside.git diff --git a/rt/lib/RT/Scrips.pm b/rt/lib/RT/Scrips.pm index 4649885f7..3ec563b65 100755 --- a/rt/lib/RT/Scrips.pm +++ b/rt/lib/RT/Scrips.pm @@ -2,7 +2,7 @@ # # COPYRIGHT: # -# This software is Copyright (c) 1996-2015 Best Practical Solutions, LLC +# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC # # # (Except where explicitly superseded by other copyright notices) @@ -69,12 +69,20 @@ package RT::Scrips; use strict; use warnings; -use RT::Scrip; - use base 'RT::SearchBuilder'; +use RT::Scrip; +use RT::ObjectScrips; + sub Table { 'Scrips'} +sub _Init { + my $self = shift; + + $self->{'with_disabled_column'} = 1; + + return ( $self->SUPER::_Init(@_) ); +} =head2 LimitToQueue @@ -85,14 +93,17 @@ another call to this method =cut sub LimitToQueue { - my $self = shift; - my $queue = shift; - - $self->Limit (ENTRYAGGREGATOR => 'OR', - FIELD => 'Queue', - VALUE => "$queue") - if defined $queue; - + my $self = shift; + my $queue = shift; + return unless defined $queue; + + my $alias = RT::ObjectScrips->new( $self->CurrentUser ) + ->JoinTargetToThis( $self ); + $self->Limit( + ALIAS => $alias, + FIELD => 'ObjectId', + VALUE => int $queue, + ); } @@ -106,12 +117,125 @@ another call to this method or LimitToQueue sub LimitToGlobal { - my $self = shift; - - $self->Limit (ENTRYAGGREGATOR => 'OR', - FIELD => 'Queue', - VALUE => 0); - + my $self = shift; + return $self->LimitToQueue(0); +} + +sub LimitToAdded { + my $self = shift; + return RT::ObjectScrips->new( $self->CurrentUser ) + ->LimitTargetToAdded( $self => @_ ); +} + +sub LimitToNotAdded { + my $self = shift; + return RT::ObjectScrips->new( $self->CurrentUser ) + ->LimitTargetToNotAdded( $self => @_ ); +} + +sub LimitByStage { + my $self = shift; + my %args = @_%2? (Stage => @_) : @_; + return unless defined $args{'Stage'}; + + my $alias = RT::ObjectScrips->new( $self->CurrentUser ) + ->JoinTargetToThis( $self, %args ); + $self->Limit( + ALIAS => $alias, + FIELD => 'Stage', + VALUE => $args{'Stage'}, + ); +} + +=head2 LimitByTemplate + +Takes a L object and limits scrips to those that +use the template. + +=cut + +sub LimitByTemplate { + my $self = shift; + my $template = shift; + + $self->Limit( FIELD => 'Template', VALUE => $template->Name ); + + if ( $template->Queue ) { + # if template is local then we are interested in global and + # queue specific scrips + $self->LimitToQueue( $template->Queue ); + $self->LimitToGlobal; + } + else { # template is global + + # if every queue has a custom version then there + # is no scrip that uses the template + { + my $queues = RT::Queues->new( RT->SystemUser ); + my $alias = $queues->Join( + TYPE => 'LEFT', + ALIAS1 => 'main', + FIELD1 => 'id', + TABLE2 => 'Templates', + FIELD2 => 'Queue', + ); + $queues->Limit( + LEFTJOIN => $alias, + ALIAS => $alias, + FIELD => 'Name', + VALUE => $template->Name, + ); + $queues->Limit( + ALIAS => $alias, + FIELD => 'id', + OPERATOR => 'IS', + VALUE => 'NULL', + ); + return $self->Limit( FIELD => 'id', VALUE => 0 ) + unless $queues->Count; + } + + # otherwise it's either a global scrip or application to + # a queue with custom version of the template. + my $os_alias = RT::ObjectScrips->new( $self->CurrentUser ) + ->JoinTargetToThis( $self ); + my $tmpl_alias = $self->Join( + TYPE => 'LEFT', + ALIAS1 => $os_alias, + FIELD1 => 'ObjectId', + TABLE2 => 'Templates', + FIELD2 => 'Queue', + ); + $self->Limit( + LEFTJOIN => $tmpl_alias, ALIAS => $tmpl_alias, FIELD => 'Name', VALUE => $template->Name, + ); + $self->Limit( + LEFTJOIN => $tmpl_alias, ALIAS => $tmpl_alias, FIELD => 'Queue', OPERATOR => '!=', VALUE => 0, + ); + + $self->_OpenParen('UsedBy'); + $self->Limit( SUBCLAUSE => 'UsedBy', ALIAS => $os_alias, FIELD => 'ObjectId', VALUE => 0 ); + $self->Limit( + SUBCLAUSE => 'UsedBy', + ALIAS => $tmpl_alias, + FIELD => 'id', + OPERATOR => 'IS', + VALUE => 'NULL', + ); + $self->_CloseParen('UsedBy'); + } +} + +sub ApplySortOrder { + my $self = shift; + my $order = shift || 'ASC'; + $self->OrderByCols( { + ALIAS => RT::ObjectScrips->new( $self->CurrentUser ) + ->JoinTargetToThis( $self => @_ ) + , + FIELD => 'SortOrder', + ORDER => $order, + } ); } =head2 AddRecord @@ -299,10 +423,8 @@ sub _SetupSourceObjects { =head2 _FindScrips -Find only the apropriate scrips for whatever we're doing now. Order them -by their description. (Most common use case is to prepend a number to the -description, forcing the scrips to display and run in ascending alphanumerical -order.) +Find only the appropriate scrips for whatever we're doing now. Order +them by the SortOrder field from the ObjectScrips table. =cut @@ -314,32 +436,27 @@ sub _FindScrips { @_ ); - $self->LimitToQueue( $self->{'TicketObj'}->QueueObj->Id ) - ; #Limit it to $Ticket->QueueObj->Id - $self->LimitToGlobal(); - # or to "global" - - $self->Limit( FIELD => "Stage", VALUE => $args{'Stage'} ); + $self->LimitToQueue( $self->{'TicketObj'}->QueueObj->Id ); + $self->LimitToGlobal; + $self->LimitByStage( $args{'Stage'} ); - my $ConditionsAlias = $self->NewAlias('ScripConditions'); - - $self->Join( + my $ConditionsAlias = $self->Join( ALIAS1 => 'main', FIELD1 => 'ScripCondition', - ALIAS2 => $ConditionsAlias, - FIELD2 => 'id' + TABLE2 => 'ScripConditions', + FIELD2 => 'id', ); #We only want things where the scrip applies to this sort of transaction # TransactionBatch stage can define list of transaction foreach( split /\s*,\s*/, ($args{'Type'} || '') ) { - $self->Limit( - ALIAS => $ConditionsAlias, - FIELD => 'ApplicableTransTypes', - OPERATOR => 'LIKE', - VALUE => $_, - ENTRYAGGREGATOR => 'OR', - ) + $self->Limit( + ALIAS => $ConditionsAlias, + FIELD => 'ApplicableTransTypes', + OPERATOR => 'LIKE', + VALUE => $_, + ENTRYAGGREGATOR => 'OR', + ) } # Or where the scrip applies to any transaction @@ -351,8 +468,7 @@ sub _FindScrips { ENTRYAGGREGATOR => 'OR', ); - # Promise some kind of ordering - $self->OrderBy( FIELD => 'Description' ); + $self->ApplySortOrder; # we call Count below, but later we always do search # so just do search and get count from results @@ -366,19 +482,6 @@ sub _FindScrips { ); } - - - -=head2 NewItem - -Returns an empty new RT::Scrip item - -=cut - -sub NewItem { - my $self = shift; - return(RT::Scrip->new($self->CurrentUser)); -} RT::Base->_ImportOverlays(); 1;