Allow to show estimated, actual and remaining times at once in reports
parent
b207a79b63
commit
36905704ea
19
report.cgi
19
report.cgi
|
@ -150,8 +150,10 @@ if (defined($height))
|
|||
# These shenanigans are necessary to make sure that both vertical and
|
||||
# horizontal 1D tables convert to the correct dimension when you ask to
|
||||
# display them as some sort of chart.
|
||||
if (defined $ARGS->{format} && $ARGS->{format} =~ /^(table|simple)$/)
|
||||
my $is_table;
|
||||
if ($ARGS->{format} eq 'table' || $ARGS->{format} eq 'simple')
|
||||
{
|
||||
$is_table = 1;
|
||||
if ($field->{x} && !$field->{y})
|
||||
{
|
||||
# 1D *tables* should be displayed vertically (with a row_field only)
|
||||
|
@ -185,14 +187,20 @@ my $measures = {
|
|||
Bugzilla::Search->COLUMNS->{_count}->{name} = '1';
|
||||
|
||||
my $measure = $ARGS->{measure};
|
||||
$measure = 'count' unless $measures->{$measure};
|
||||
if ($measure eq 'times' ? !$is_table : !$measures->{$measure})
|
||||
{
|
||||
$measure = 'count';
|
||||
}
|
||||
$vars->{measure} = $measure;
|
||||
|
||||
# Validate the values in the axis fields or throw an error.
|
||||
my %a;
|
||||
my @group_by = grep { !($a{$_}++) } values %$field;
|
||||
my @axis_fields = @group_by;
|
||||
push @axis_fields, $measures->{$measure} unless $a{$measures->{$measure}};
|
||||
for ($measure eq 'times' ? qw(etime rtime wtime) : $measure)
|
||||
{
|
||||
push @axis_fields, $measures->{$_} unless $a{$measures->{$_}};
|
||||
}
|
||||
|
||||
# Clone the params, so that Bugzilla::Search can modify them
|
||||
my $search = new Bugzilla::Search(
|
||||
|
@ -205,7 +213,8 @@ $query =
|
|||
($field->{x} || "''")." x, ".
|
||||
($field->{y} || "''")." y, ".
|
||||
($field->{z} || "''")." z, ".
|
||||
"SUM(".$measures->{$measure}.") r FROM ($query) _report_table GROUP BY ".join(", ", @group_by);
|
||||
join(', ', map { "SUM($measures->{$_}) $_" } $measure eq 'times' ? qw(etime rtime wtime) : $measure).
|
||||
" FROM ($query) _report_table GROUP BY ".join(", ", @group_by);
|
||||
|
||||
$::SIG{TERM} = 'DEFAULT';
|
||||
$::SIG{PIPE} = 'DEFAULT';
|
||||
|
@ -231,7 +240,7 @@ foreach my $group (@$results)
|
|||
$isnumeric{$_} &&= ($group->{$_} =~ /^-?\d+(\.\d+)?$/o);
|
||||
$names{$_}{$group->{$_}} = 1;
|
||||
}
|
||||
$data{$group->{z}}{$group->{x}}{$group->{y}} = $group->{r};
|
||||
$data{$group->{z}}{$group->{x}}{$group->{y}} = $is_table ? $group : $group->{$measure};
|
||||
}
|
||||
|
||||
my @tbl_names = @{get_names($names{z}, $isnumeric{z}, $field->{z})};
|
||||
|
|
|
@ -16,21 +16,21 @@
|
|||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Gervase Markham <gerv@gerv.net>
|
||||
#
|
||||
# TODO: Refactor this ugly trash. Table should be generated by code, not by TT.
|
||||
#%]
|
||||
[%# INTERFACE:
|
||||
# See report-table.html.tmpl.
|
||||
#%]
|
||||
[% colsepchar = user.settings.csv_colsepchar.value %]
|
||||
|
||||
[% num_bugs = BLOCK %]Number of [% terms.bugs %][% END %]
|
||||
[% tbl_field_disp = field_descs.$tbl_field || Bugzilla.get_field(tbl_field).description || tbl_field %]
|
||||
[% col_field_disp = field_descs.$col_field || Bugzilla.get_field(col_field).description || col_field %]
|
||||
[% row_field_disp = field_descs.$row_field || Bugzilla.get_field(row_field).description || row_field %]
|
||||
[% mlist = (measure == 'times' ? [ 'etime', 'wtime', 'rtime' ] : [ measure ]) %]
|
||||
|
||||
[% IF tbl_field %]
|
||||
[% IF tbl_field == 'assigned_to' OR tbl_field == 'reporter'
|
||||
OR tbl_field == 'qa_contact'
|
||||
%]
|
||||
[% IF tbl_field == 'assigned_to' OR tbl_field == 'reporter' OR tbl_field == 'qa_contact' %]
|
||||
[% tbl_disp = tbl FILTER email %]
|
||||
[% ELSE %]
|
||||
[% tbl_disp = tbl %]
|
||||
|
@ -45,20 +45,24 @@
|
|||
[% IF col_field -%]
|
||||
[% FOREACH col = col_names -%]
|
||||
[% colsepchar %]
|
||||
[% PROCESS value_display value = col field = col_field %]
|
||||
[% PROCESS value_display value=col field=col_field %]
|
||||
[% END -%]
|
||||
[% ELSE -%]
|
||||
[% colsepchar %][% num_bugs FILTER csv %]
|
||||
[% FOR m = mlist %]
|
||||
[% colsepchar %][% measure_descs.$m | csv %]
|
||||
[% END %]
|
||||
[% END %]
|
||||
|
||||
[% FOREACH row = row_names %]
|
||||
[% PROCESS value_display value = row field = row_field %]
|
||||
[% PROCESS value_display value=row field=row_field %]
|
||||
[% FOREACH col = col_names %]
|
||||
[% colsepchar %]
|
||||
[% IF data.$tbl AND data.$tbl.$col AND data.$tbl.$col.$row %]
|
||||
[% data.$tbl.$col.$row -%]
|
||||
[% ELSE %]
|
||||
[% -%]0
|
||||
[% FOREACH m = mlist %]
|
||||
[% colsepchar %]
|
||||
[% IF data.$tbl AND data.$tbl.$col AND data.$tbl.$col.$row.$m %]
|
||||
[% data.$tbl.$col.$row.$m -%]
|
||||
[% ELSE %]
|
||||
[% -%]0
|
||||
[% END %]
|
||||
[% END %]
|
||||
[% END %]
|
||||
|
||||
|
@ -66,9 +70,7 @@
|
|||
|
||||
[% BLOCK value_display %]
|
||||
[% SET disp_value = value %]
|
||||
[% IF field == 'assigned_to' OR field == 'reporter'
|
||||
OR field == 'qa_contact'
|
||||
%]
|
||||
[% IF field == 'assigned_to' OR field == 'reporter' OR field == 'qa_contact' %]
|
||||
[% disp_value = value FILTER email %]
|
||||
[% END %]
|
||||
[% disp_value FILTER csv %]
|
||||
|
|
|
@ -71,7 +71,7 @@ END; %]
|
|||
[% classes = [ [ "t1", "t2" ] , [ "t3", "t4" ] ] %]
|
||||
[% col_idx = 0 %]
|
||||
[% row_idx = 0 %]
|
||||
[% grand_total = 0 %]
|
||||
[% mlist = (measure == 'times' ? [ 'etime', 'wtime', 'rtime' ] : [ measure ]) %]
|
||||
|
||||
<table border="1" style="border-collapse: collapse">
|
||||
[% IF col_field %]
|
||||
|
@ -79,72 +79,77 @@ END; %]
|
|||
<td class="[% classes.$row_idx.$col_idx %]">
|
||||
</td>
|
||||
[% FOREACH col = col_names %]
|
||||
[% col_totals.$col = 0 %]
|
||||
[% col_idx = 1 - col_idx %]
|
||||
<td class="[% classes.$row_idx.$col_idx %]">
|
||||
<td class="[% classes.$row_idx.$col_idx %]"[% ' colspan="3"' IF measure == 'times' %]>
|
||||
[% PROCESS value_display value = col field = col_field %]
|
||||
</td>
|
||||
[% END %]
|
||||
<td class="ttotal">
|
||||
<td class="ttotal"[% ' colspan="3"' IF measure == 'times' %]>
|
||||
Total
|
||||
</td>
|
||||
</tr>
|
||||
[% END %]
|
||||
|
||||
[% FOREACH row = row_names %]
|
||||
[% row_total = 0 %]
|
||||
|
||||
[% row_total = {} %]
|
||||
[% row_idx = 1 - row_idx %]
|
||||
<tr>
|
||||
<td class="[% classes.$row_idx.$col_idx %]">
|
||||
[% PROCESS value_display value = row field = row_field %]
|
||||
</td>
|
||||
[% FOREACH col = col_names %]
|
||||
[% row_total = row_total + data.$tbl.$col.$row %]
|
||||
[% col_totals.$col = col_totals.$col + data.$tbl.$col.$row %]
|
||||
|
||||
[% col_idx = 1 - col_idx %]
|
||||
<td class="[% classes.$row_idx.$col_idx %]" align="center">
|
||||
[% IF data.$tbl.$col.$row AND data.$tbl.$col.$row > 0 %]
|
||||
<a href="[% urlbase %]&
|
||||
[% PROCESS value_url value=row field=row_field %]&
|
||||
[% PROCESS value_url value=col field=col_field %]">
|
||||
[% data.$tbl.$col.$row %]</a>
|
||||
[% ELSE %]
|
||||
.
|
||||
[% END %]
|
||||
</td>
|
||||
[% FOR m = mlist %]
|
||||
[% col_totals.$col.$m = col_totals.$col.$m + data.$tbl.$col.$row.$m %]
|
||||
[% row_total.$m = row_total.$m + data.$tbl.$col.$row.$m %]
|
||||
<td class="[% classes.$row_idx.$col_idx %]" align="center">
|
||||
[% IF data.$tbl.$col.$row.$m AND data.$tbl.$col.$row.$m > 0 %]
|
||||
<a href="[% urlbase %]&
|
||||
[% PROCESS value_url value=row field=row_field %]&
|
||||
[% PROCESS value_url value=col field=col_field %]">
|
||||
[% data.$tbl.$col.$row.$m %]</a>
|
||||
[% END %]
|
||||
</td>
|
||||
[% END %]
|
||||
[% END %]
|
||||
[% IF col_names.size > 1 %]
|
||||
[% FOR m = mlist %]
|
||||
<td class="ttotal" align="right">
|
||||
<a href="[% urlbase %]&
|
||||
[% PROCESS value_url value=row field=row_field %]
|
||||
[% "&$col_vals" IF col_vals %]">
|
||||
[% row_total.$m %]</a>
|
||||
[% grand_total.$m = grand_total.$m + row_total.$m %]
|
||||
</td>
|
||||
[% END %]
|
||||
[% END %]
|
||||
<td class="ttotal" align="right">
|
||||
<a href="[% urlbase %]&
|
||||
[% PROCESS value_url value=row field=row_field %]
|
||||
[% "&$col_vals" IF col_vals %]">
|
||||
[% row_total %]</a>
|
||||
[% grand_total = grand_total + row_total %]
|
||||
</td>
|
||||
</tr>
|
||||
[% END %]
|
||||
|
||||
<tr>
|
||||
[% row_idx = 1 - row_idx %]
|
||||
<td class="ttotal">
|
||||
Total
|
||||
</td>
|
||||
<td class="ttotal">Total</td>
|
||||
[% FOREACH col = col_names %]
|
||||
<td class="ttotal" align="center">
|
||||
<a href="[% urlbase %]&
|
||||
[% PROCESS value_url value=col field=col_field %]
|
||||
[% "&$row_vals" IF row_vals %]">
|
||||
[% col_totals.$col %]</a>
|
||||
</td>
|
||||
[% FOR m = mlist %]
|
||||
<td class="ttotal" align="center">
|
||||
<a href="[% urlbase %]&
|
||||
[% PROCESS value_url value=col field=col_field %]
|
||||
[% "&$row_vals" IF row_vals %]">
|
||||
[% col_totals.$col.$m %]</a>
|
||||
</td>
|
||||
[% END %]
|
||||
[% END %]
|
||||
[% IF col_names.size > 1 %]
|
||||
[% FOR m = mlist %]
|
||||
<td class="ttotal" align="right">
|
||||
<strong>
|
||||
<a href="[% urlbase %]
|
||||
[% "&$row_vals" IF row_vals %]
|
||||
[% "&$col_vals" IF col_vals %]">[% grand_total.$m %]</a>
|
||||
</strong>
|
||||
</td>
|
||||
[% END %]
|
||||
[% END %]
|
||||
<td class="ttotal" align="right">
|
||||
<strong>
|
||||
<a href="[% urlbase %]
|
||||
[% "&$row_vals" IF row_vals %]
|
||||
[% "&$col_vals" IF col_vals %]">[% grand_total %]</a>
|
||||
</strong>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
|
|
@ -18,6 +18,11 @@
|
|||
# Contributor(s): Gervase Markham <gerv@gerv.net>
|
||||
#%]
|
||||
[% FOREACH tbl = tbl_names %]
|
||||
[% PROCESS "reports/report-table.csv.tmpl" %]
|
||||
|
||||
[% END %]
|
||||
[% measure_descs = {
|
||||
rtime => 'Remaining time'
|
||||
etime => 'Estimated time'
|
||||
wtime => 'Actual time'
|
||||
count => "Number of $terms.bugs"
|
||||
} %]
|
||||
[% PROCESS "reports/report-table.csv.tmpl" %]
|
||||
[% END %]
|
||||
|
|
|
@ -136,7 +136,7 @@
|
|||
[% other_format.description FILTER html %]
|
||||
[% "</a>" UNLESS other_format.name == format %] |
|
||||
[% END %]
|
||||
<a href="[% formaturl %]&ctype=csv&format=table">CSV</a>
|
||||
<a href="[% formaturl %]&measure=[% measure %]&ctype=csv&format=table">CSV</a>
|
||||
</td>
|
||||
|
||||
[% IF format != "table" %]
|
||||
|
@ -165,14 +165,15 @@
|
|||
rtime => 'Remaining time'
|
||||
etime => 'Estimated time'
|
||||
wtime => 'Actual time'
|
||||
count => 'Bugs count'
|
||||
times => 'Estimated/Actual/Remaining'
|
||||
count => "Number of $terms.bugs"
|
||||
} %]
|
||||
[% FOR m = measure_descs.keys.sort %]
|
||||
[%+ IF measure != m %]<a href="[% formaturl %]&format=[% format %]&measure=[% m %]">[% END %]
|
||||
[% measure_descs.$m %]
|
||||
[% IF measure != m %]</a>[% END %]
|
||||
[% IF NOT loop.last %]
|
||||
|
|
||||
[% IF m != 'times' || format == 'table' %]
|
||||
[%+ IF measure != m %]<a href="[% formaturl %]&format=[% format %]&measure=[% m %]">[% END %]
|
||||
[% measure_descs.$m %]
|
||||
[% IF measure != m %]</a>[% END %]
|
||||
[% IF NOT loop.last %] | [% END %]
|
||||
[% END %]
|
||||
[% END %]
|
||||
</td></tr></table>
|
||||
|
|
Loading…
Reference in New Issue