X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=rt%2Flib%2FRT%2FGraph%2FTickets.pm;h=cd1254eb6aabcca6a2ce6f919e484571fa1de5ab;hb=9ce482da3960ee43decee41fba53b78c12c3e52c;hp=77a0ce5c25244362b6ff7b62a56485bd1167a763;hpb=63a268637b2d51a8766412617724b9436439deb6;p=freeside.git diff --git a/rt/lib/RT/Graph/Tickets.pm b/rt/lib/RT/Graph/Tickets.pm index 77a0ce5c2..cd1254eb6 100644 --- a/rt/lib/RT/Graph/Tickets.pm +++ b/rt/lib/RT/Graph/Tickets.pm @@ -1,40 +1,40 @@ # BEGIN BPS TAGGED BLOCK {{{ -# +# # COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# -# +# +# This software is Copyright (c) 1996-2016 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 @@ -43,7 +43,7 @@ # 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::Graph::Tickets; @@ -58,10 +58,6 @@ RT::Graph::Tickets - view relations between tickets as graphs =cut unless ($RT::DisableGraphViz) { - require IPC::Run; - IPC::Run->import; - require IPC::Run::SafeHandles; - IPC::Run::SafeHandles->import; require GraphViz; GraphViz->import; } @@ -104,20 +100,23 @@ EOT sub gv_escape($) { my $value = shift; - $value =~ s{(?=")}{\\}g; + $value =~ s{(?=["\\])}{\\}g; return $value; } +sub loc { return HTML::Mason::Commands::loc(@_) }; + our (%fill_cache, @available_colors) = (); our %property_cb = ( - Queue => sub { return $_[0]->QueueObj->Name || $_[0]->Queue }, - CF => sub { + Queue => sub { return $_[0]->QueueObj->Name || $_[0]->Queue }, + Status => sub { return loc($_[0]->Status) }, + CF => sub { my $values = $_[0]->CustomFieldValues( $_[1] ); return join ', ', map $_->Content, @{ $values->ItemsArrayRef }; }, ); -foreach my $field (qw(Subject Status TimeLeft TimeWorked TimeEstimated)) { +foreach my $field (qw(Subject TimeLeft TimeWorked TimeEstimated)) { $property_cb{ $field } = sub { return $_[0]->$field }, } foreach my $field (qw(Creator LastUpdatedBy Owner)) { @@ -167,7 +166,8 @@ sub TicketProperties { next if $seen{ lc $cf->Name }++; next if $cf->Type eq 'Image'; if ( $first ) { - push @res, 'CustomFields', []; + push @res, 'Custom Fields', # loc + []; $first = 0; } push @{ $res[-1] }, 'CF.{'. $cf->Name .'}'; @@ -207,7 +207,8 @@ sub _PropertiesToFields { $RT::Logger->error("Couldn't find property handler for '$key' and '@subkeys' subkeys"); next; } - push @fields, ($subkeys[0] || $key) .': '. $property_cb{ $key }->( $args{'Ticket'}, @subkeys ); + my $label = $key eq 'CF' ? $subkeys[0] : loc($key); + push @fields, $label .': '. $property_cb{ $key }->( $args{'Ticket'}, @subkeys ); } return @fields; @@ -233,7 +234,7 @@ sub AddTicket { my @fields = $self->_PropertiesToFields( %args ); if ( @fields ) { unshift @fields, $args{'Ticket'}->id; - my $label = join ' | ', map { s/(?=[{}|])/\\/g; $_ } @fields; + my $label = join ' | ', map { s/(?=[{}|><])/\\/g; $_ } @fields; $label = "{ $label }" if ($args{'Direction'} || 'TB') =~ /^(?:TB|BT)$/; $node_style{'label'} = gv_escape( $label ); $node_style{'shape'} = 'record'; @@ -282,6 +283,14 @@ sub TicketLinks { ShowLinkDescriptions => 0, @_ ); + + my %valid_links = map { $_ => 1 } + qw(Members MemberOf RefersTo ReferredToBy DependsOn DependedOnBy); + + # Validate our link types + $args{ShowLinks} = [ grep { $valid_links{$_} } @{$args{ShowLinks}} ]; + $args{LeadingLink} = 'Members' unless $valid_links{ $args{LeadingLink} }; + unless ( $args{'Graph'} ) { $args{'Graph'} = GraphViz->new( name => 'ticket_links_'. $args{'Ticket'}->id, @@ -295,9 +304,12 @@ sub TicketLinks { } $args{'Seen'} ||= {}; - return $args{'Graph'} if $args{'Seen'}{ $args{'Ticket'}->id }++; - - $self->AddTicket( %args ); + if ( $args{'Seen'}{ $args{'Ticket'}->id } && $args{'Seen'}{ $args{'Ticket'}->id } <= $args{'CurrentDepth'} ) { + return $args{'Graph'}; + } elsif ( ! defined $args{'Seen'}{ $args{'Ticket'}->id } ) { + $self->AddTicket( %args ); + } + $args{'Seen'}{ $args{'Ticket'}->id } = $args{'CurrentDepth'}; return $args{'Graph'} if $args{'MaxDepth'} && $args{'CurrentDepth'} >= $args{'MaxDepth'}; @@ -345,14 +357,6 @@ sub TicketLinks { return $args{'Graph'}; } -eval "require RT::Graph::Tickets_Vendor"; -if ($@ && $@ !~ qr{^Can't locate RT/Graph/Tickets_Vendor.pm}) { - die $@; -}; - -eval "require RT::Graph::Tickets_Local"; -if ($@ && $@ !~ qr{^Can't locate RT/Graph/Tickets_Local.pm}) { - die $@; -}; +RT::Base->_ImportOverlays(); 1;