ConciseSpreadsheetDisplay
Jump to navigation
Jump to search
To customize the display of the Spreadsheet function, one option is to install the perl module via CPAN:
perl -MCPAN -e 'install RT::View::ConciseSpreadsheet'
It may also install some dependencies such as Text::CSV_XS.
When prompted for location of your RT.pm, enter the path to your RT lib, such as /opt/rt3/lib. Restart apache.
You should see a new link at the bottom of your search results that says Spreadsheet(Concise). This will download a .tsv spreadsheet of the search. Some customization of this file may be necessary:
$RTHOME/share/html/ConciseSpreadsheet/Results.tsv:
<%INIT>
use Text::CSV_XS;
my $Tickets = RT::Tickets->new($session{'CurrentUser'});
$Tickets->FromSQL($ARGS{'Query'});
$Format ||= $RT::DefaultSearchResultFormat;
# Scrub the html of the format string to remove any potential nasties.
$Format = $m->comp('/Elements/ScrubHTML', Content => $Format);
my (@Format) = $m->comp('/Elements/CollectionAsTable/ParseFormat', Format => $Format);
$r->content_type('application/vnd.ms-excel');
my @header=();
# used to store m->comp output - prevents the output from being
# written to the output stream. That's because we are not interested in the
# output for these comp() calls, we are interested in the return value.
my $mason_output;
foreach my $column (@Format) {
next if ($column->{title} and $column->{title} eq 'NEWLINE');
my $retro = undef ;
# my $dump = Dumper($column);
# $RT::Logger->debug('my column dump is '.$dump);
# Determine the column titles
my $title = $column->{title};
unless ($title) {
$title = $column->{attribute};
}
$title =~ s/^__(.*)__$/$1/o if $title;
if ($title and $title =~ /CustomField\.\{(.*)\}/) {
$retro = $1;
}
my $ret = undef;
$ret =
$m->comp( { store => \$mason_output },
'/Elements/ColumnMap',
Name => $title,
Attr => 'title'
)
;
$title = $ret ? $ret : $title;
if ($title and $title =~ /^CODE\(/) {
# $RT::Logger->debug('I need to use dumper on this '.$title);
$title = $retro;
}
#$RT::Logger->debug('cvs header is '.$title);
push @header, $title;
}
my $csv = Text::CSV_XS->new( { sep_char => "\t", binary => 1, eol => "\012" } );
$csv->combine(@header);
$m->out( $csv->string() );
while ( my $Ticket = $Tickets->Next()) {
my @row;
foreach my $column (@Format) {
next if ($column->{title} and $column->{title} eq 'NEWLINE');
my $column_value = '';
foreach my $subcol ( @{ $column->{output} } ) {
if ( $subcol =~ /^__(.*?)__$/o ) {
my $col = $1;
my $value = $m->comp({ store => \$mason_output },
'/Elements/ColumnMap',
Name => $col, Attr => 'value');
if ( $value && ref($value)) {
my @x = &{ $value }( $Ticket, 0 );
$column_value .= join('', map { ref($_) ? $$_ : $_ } @x);
} else {
$column_value .= $value if($value); #we added if($value)
}
}
else {
$column_value .= $subcol;
}
}
$column_value =~ s{<br(\s+/)?>}{, }g;
$column_value = $scrubber->scrub( $column_value );
$column_value =~ s{, $}{}g; # ColumnMap is putting a trailing br
push @row, $column_value;
}
$csv->combine(@row);
$m->out( $csv->string() );
$m->flush_buffer();
}
$m->abort();
</%INIT>
<%ARGS>
$Query => undef
$Format => undef
$HideResults => 0
$Rows => 50
$Page => 1
$OrderBy => 'id'
$Order => 'ASC'
</%ARGS>
<%once>
my $scrubber = HTML::Scrubber->new();
$scrubber->deny(qw[*]);
</%once>