X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=rt%2Fshare%2Fhtml%2FSearch%2FResults.tsv;h=b28ea481674247cae0172f7d87c948d62d06b3a4;hb=31f3763747b82764bb019cfab5b2a2945fc9a99d;hp=cdf1ebad0acaf9696049425203c6cdb844cb8fb1;hpb=b5c4237a34aef94976bc343c8d9e138664fc3984;p=freeside.git diff --git a/rt/share/html/Search/Results.tsv b/rt/share/html/Search/Results.tsv index cdf1ebad0..b28ea4816 100644 --- a/rt/share/html/Search/Results.tsv +++ b/rt/share/html/Search/Results.tsv @@ -2,7 +2,7 @@ %# %# COPYRIGHT: %# -%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# This software is Copyright (c) 1996-2015 Best Practical Solutions, LLC %# %# %# (Except where explicitly superseded by other copyright notices) @@ -46,12 +46,64 @@ %# %# END BPS TAGGED BLOCK }}} <%ARGS> +$Format => undef $Query => '' $OrderBy => 'id' $Order => 'ASC' +$PreserveNewLines => 0 <%INIT> +$r->content_type('text/tab-separated-values'); +$r->header_out('Content-Disposition' => 'attachment;filename="Results.tsv"'); + +my $DisplayFormat = $m->comp('/Elements/ScrubHTML', Content => $Format); + +my @Format = $m->comp('/Elements/CollectionAsTable/ParseFormat', Format => $DisplayFormat); + +my @columns; + +my $should_loc = { map { $_ => 1 } qw(Status) }; + +my $col_entry = sub { + my $col = shift; + # in tsv output, "#" is often a comment character but we use it for "id" + delete $col->{title} + if $col->{title} and $col->{title} =~ /^\s*#\s*$/; + return { + header => loc($col->{title} || $col->{attribute}), + map => $m->comp( + "/Elements/ColumnMap", + Name => $col->{attribute}, + Attr => 'value' + ), + should_loc => $should_loc->{$col->{attribute}}, + } +}; + +if ($PreserveNewLines) { + my $col = []; + push @columns, $col; + for (@Format) { + if ($_->{title} eq 'NEWLINE') { + $col = []; + push @columns, $col; + } + else { + push @$col, $col_entry->($_); + } + } +} +else { + push @columns, [map { $_->{attribute} + ? $col_entry->($_) + : () } @Format]; +} + +for (@columns) { + $m->out(join("\t", map { $_->{header} } @$_)."\n"); +} + my $Tickets = RT::Tickets->new( $session{'CurrentUser'} ); $Tickets->FromSQL( $Query ); if ( $OrderBy =~ /\|/ ) { @@ -67,97 +119,21 @@ else { $Tickets->OrderBy( FIELD => $OrderBy, ORDER => $Order ); } -my %cf_id_to_name; -my %cf_name_to_pos; -{ - my $cfs = RT::SQL::PossibleCustomFields( - Query => $Query, CurrentUser => $session{'CurrentUser'}, - ); - while ( my $cf = $cfs->Next ) { - my $name = $cf->Name; - $cf_id_to_name{ $cf->id } = $name; - next if $cf_name_to_pos{ $name }; - - $cf_name_to_pos{ $name } = - (sort { $b <=> $a } values %cf_name_to_pos)[0] + 1; - } -} - -my @attrs = qw( - id QueueObj->Name Subject Status - TimeEstimated TimeWorked TimeLeft - Priority FinalPriority - OwnerObj->Name - Requestors->MemberEmailAddressesAsString - Cc->MemberEmailAddressesAsString - AdminCc->MemberEmailAddressesAsString - DueObj->ISO ToldObj->ISO CreatedObj->ISO - ResolvedObj->ISO LastUpdatedObj->ISO LastUpdatedByObj->Name -); - -$r->content_type('text/tab-separated-values'); -$r->header_out('Content-Disposition' => 'attachment;filename="Results.tsv"'); -{ - my @header; - foreach my $attr (@attrs) { - my $label = $attr; - $label =~ s'Obj-.(?:AsString|Name|ISO)''g; - $label =~ s'-\>MemberEmailAddressesAsString''g; - push @header, $label; - } - - $_ += @header - 1 foreach values %cf_name_to_pos; - - foreach my $name ( sort { $cf_name_to_pos{$a} <=> $cf_name_to_pos{$b} } keys %cf_name_to_pos ) { - push @header, "CF-". $name; - } - $m->out(join("\t", @header)); - $m->out("\n"); - $m->flush_buffer; -} - my $i = 0; -while ( my $Ticket = $Tickets->Next()) { - my @row; - foreach my $attr (@attrs) { - my $value; - if ($attr =~ /(.*)->ISO$/ and $Ticket->$1->Unix <= 0) { - $value = ''; - } else { - my $method = '$Ticket->'.$attr.'()'; - $method =~ s/->ISO\(\)$/->ISO( Timezone => 'user' )/; - $value = eval $method; - if ($@) {die "Failed to find $attr - ". $@}; - } - push @row, $value; - } - - my $values = $Ticket->CustomFieldValues; - $values->OrderByCols; # don't sort them - while (my $value = $values->Next) { - my $pos = $cf_name_to_pos{ $cf_id_to_name{ $value->CustomField } }; - next unless $pos; - - $row[$pos] = '' unless defined $row[$pos]; - $row[$pos] .= ', ' if $row[$pos]; - $row[$pos] .= $value->Content; - } - - # remove tabs from all field values, they screw up the tsv - for (@row) { - $_ = '' unless defined; - $_ =~ s/(?:\n|\r)//g; - $_ =~ s{\t}{ }g; - } - - $m->out(join("\t",@row)); - $m->out("\n"); - - unless (++$i%10) { - $i = 0; - $m->flush_buffer; +my $ii = 0; +while (my $row = $Tickets->Next) { + for my $col (@columns) { + $m->out(join("\t", map { + my $val = ProcessColumnMapValue($_->{map}, Arguments => [$row, $ii++], Escape => 0); + $val = loc($val) if $_->{should_loc}; + # remove tabs from all field values, they screw up the tsv + $val = '' unless defined $val; + $val =~ s/(?:\n|\r)//g; $val =~ s{\t}{ }g; + $val; + } @$col)."\n"); } + $m->flush_buffer unless ++$i % 10; } - $m->abort(); +