summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xcollectstats.pl195
-rwxr-xr-xeditvalues.cgi68
-rwxr-xr-xreports.cgi6
-rw-r--r--t/008filter.t2
-rw-r--r--template/en/default/admin/fieldvalues/confirm-delete.html.tmpl4
-rw-r--r--template/en/default/admin/fieldvalues/edit.html.tmpl11
-rw-r--r--template/en/default/admin/fieldvalues/list.html.tmpl39
-rw-r--r--template/en/default/bug/activity/table.html.tmpl4
-rw-r--r--template/en/default/bug/edit.html.tmpl2
-rw-r--r--template/en/default/bug/knob.html.tmpl4
-rw-r--r--template/en/default/bug/show-multiple.html.tmpl2
-rw-r--r--template/en/default/email/whine.txt.tmpl2
-rw-r--r--template/en/default/global/field-descs.none.tmpl2
-rw-r--r--template/en/default/global/user-error.html.tmpl10
-rw-r--r--template/en/default/list/edit-multiple.html.tmpl4
-rw-r--r--template/en/default/list/table.html.tmpl2
-rw-r--r--template/en/default/pages/fields.html.tmpl12
-rw-r--r--template/en/default/reports/report-bar.png.tmpl4
-rw-r--r--template/en/default/reports/report-line.png.tmpl4
-rw-r--r--template/en/default/reports/report-pie.png.tmpl2
-rw-r--r--template/en/default/reports/report-table.csv.tmpl4
-rw-r--r--template/en/default/reports/report-table.html.tmpl4
-rw-r--r--template/en/default/search/form.html.tmpl7
-rw-r--r--template/en/default/whine/mail.html.tmpl2
-rw-r--r--template/en/default/whine/mail.txt.tmpl2
25 files changed, 268 insertions, 130 deletions
diff --git a/collectstats.pl b/collectstats.pl
index 0739d0312..5ba56fe4b 100755
--- a/collectstats.pl
+++ b/collectstats.pl
@@ -23,6 +23,7 @@
# Gervase Markham <gerv@gerv.net>
# Richard Walters <rwalters@qualcomm.com>
# Jean-Sebastien Guay <jean_seb@hybride.com>
+# Frédéric Buclin <LpSolit@gmail.com>
# Run me out of cron at midnight to collect Bugzilla statistics.
#
@@ -41,6 +42,7 @@ use Bugzilla::Util;
use Bugzilla::Search;
use Bugzilla::User;
use Bugzilla::Product;
+use Bugzilla::Field;
# Turn off output buffering (probably needed when displaying output feedback
# in the regenerate mode.)
@@ -55,7 +57,7 @@ if (chdir("graphs")) {
# Let Throw*Error() work correctly outside a web browser.
Bugzilla->batch(1);
-Bugzilla->switch_to_shadow_db();
+my $dbh = Bugzilla->switch_to_shadow_db();
# To recreate the daily statistics, run "collectstats.pl --regenerate" .
my $regenerate = 0;
@@ -69,6 +71,39 @@ my $datadir = bz_locations()->{'datadir'};
my @myproducts = map {$_->name} Bugzilla::Product::get_all_products();
unshift(@myproducts, "-All-");
+# As we can now customize the list of resolutions, looking at the actual list
+# of available resolutions only is not enough as some now removed resolutions
+# may have existed in the past, or have been renamed. We want them all.
+my @resolutions = @{get_legal_field_values('resolution')};
+my $old_resolutions =
+ $dbh->selectcol_arrayref('SELECT bugs_activity.added
+ FROM bugs_activity
+ INNER JOIN fielddefs
+ ON fielddefs.fieldid = bugs_activity.fieldid
+ LEFT JOIN resolution
+ ON resolution.value = bugs_activity.added
+ WHERE fielddefs.name = ?
+ AND resolution.id IS NULL
+
+ UNION
+
+ SELECT bugs_activity.removed
+ FROM bugs_activity
+ INNER JOIN fielddefs
+ ON fielddefs.fieldid = bugs_activity.fieldid
+ LEFT JOIN resolution
+ ON resolution.value = bugs_activity.removed
+ WHERE fielddefs.name = ?
+ AND resolution.id IS NULL',
+ undef, ('resolution', 'resolution'));
+
+push(@resolutions, @$old_resolutions);
+# Exclude "" from the resolution list.
+@resolutions = grep {$_} @resolutions;
+
+# Actually, the list of statuses is predefined. This will change in the near future.
+my @statuses = qw(NEW ASSIGNED REOPENED UNCONFIRMED RESOLVED VERIFIED CLOSED);
+
my $tstart = time;
foreach (@myproducts) {
my $dir = "$datadir/mining";
@@ -143,56 +178,108 @@ sub collect_stats {
my $file = join '/', $dir, $file_product;
my $exists = -f $file;
- if (open DATA, ">>$file") {
- push (my @row, &today);
- my $status_sql = q{SELECT COUNT(*)
- FROM bugs
- WHERE bug_status = ?};
-
- my $reso_sql = q{SELECT COUNT(*)
- FROM bugs
- WHERE resolution = ?};
-
- if ($product ne '-All-') {
- $status_sql .= q{ AND product_id = ?};
- $reso_sql .= q{ AND product_id = ?};
- }
-
- my $sth_status = $dbh->prepare($status_sql);
- my $sth_reso = $dbh->prepare($reso_sql);
-
- my @values ;
- foreach my $status ('NEW', 'ASSIGNED', 'REOPENED', 'UNCONFIRMED', 'RESOLVED', 'VERIFIED', 'CLOSED') {
- @values = ($status);
- push (@values, $product_id) if ($product ne '-All-');
- my $count = $dbh->selectrow_array($sth_status, undef, @values);
- push(@row, $count);
- }
- foreach my $resolution ('FIXED', 'INVALID', 'WONTFIX', 'LATER', 'REMIND', 'DUPLICATE', 'WORKSFORME', 'MOVED') {
- @values = ($resolution);
- push (@values, $product_id) if ($product ne '-All-');
- my $count = $dbh->selectrow_array($sth_reso, undef, @values);
- push(@row, $count);
- }
+ # if the file exists, get the old status and resolution list for that product.
+ my @data;
+ @data = get_old_data($file) if $exists;
+
+ # If @data is not empty, then we have to recreate the data file.
+ if (scalar(@data)) {
+ open(DATA, '>', $file)
+ || ThrowCodeError('chart_file_open_fail', {'filename' => $file});
+ }
+ else {
+ open(DATA, '>>', $file)
+ || ThrowCodeError('chart_file_open_fail', {'filename' => $file});
+ }
+
+ # Now collect current data.
+ my @row = (today());
+ my $status_sql = q{SELECT COUNT(*) FROM bugs WHERE bug_status = ?};
+ my $reso_sql = q{SELECT COUNT(*) FROM bugs WHERE resolution = ?};
+
+ if ($product ne '-All-') {
+ $status_sql .= q{ AND product_id = ?};
+ $reso_sql .= q{ AND product_id = ?};
+ }
+
+ my $sth_status = $dbh->prepare($status_sql);
+ my $sth_reso = $dbh->prepare($reso_sql);
+
+ my @values ;
+ foreach my $status (@statuses) {
+ @values = ($status);
+ push (@values, $product_id) if ($product ne '-All-');
+ my $count = $dbh->selectrow_array($sth_status, undef, @values);
+ push(@row, $count);
+ }
+ foreach my $resolution (@resolutions) {
+ @values = ($resolution);
+ push (@values, $product_id) if ($product ne '-All-');
+ my $count = $dbh->selectrow_array($sth_reso, undef, @values);
+ push(@row, $count);
+ }
- if (! $exists) {
- print DATA <<FIN;
+ if (!$exists || scalar(@data)) {
+ my $fields = join('|', ('DATE', @statuses, @resolutions));
+ print DATA <<FIN;
# Bugzilla Daily Bug Stats
#
# Do not edit me! This file is generated.
#
-# fields: DATE|NEW|ASSIGNED|REOPENED|UNCONFIRMED|RESOLVED|VERIFIED|CLOSED|FIXED|INVALID|WONTFIX|LATER|REMIND|DUPLICATE|WORKSFORME|MOVED
+# fields: $fields
# Product: $product
# Created: $when
FIN
- }
+ }
- print DATA (join '|', @row) . "\n";
- close DATA;
- chmod 0644, $file;
- } else {
- print "$0: $file, $!";
+ # Add existing data, if needed. Note that no count is not treated
+ # the same way as a count with 0 bug.
+ foreach my $data (@data) {
+ print DATA join('|', map {defined $data->{$_} ? $data->{$_} : ''}
+ ('DATE', @statuses, @resolutions)) . "\n";
+ }
+ print DATA (join '|', @row) . "\n";
+ close DATA;
+ chmod 0644, $file;
+}
+
+sub get_old_data {
+ my $file = shift;
+
+ open(DATA, '<', $file)
+ || ThrowCodeError('chart_file_open_fail', {'filename' => $file});
+
+ my @data;
+ my @columns;
+ my $recreate = 0;
+ while (<DATA>) {
+ chomp;
+ next unless $_;
+ if (/^# fields?:\s*(.+)\s*$/) {
+ @columns = split(/\|/, $1);
+ # Compare this list with @statuses and @resolutions.
+ # If they are identical, then we can safely append new data
+ # to the end of the file; else we have to recreate it.
+ $recreate = 1;
+ my @new_cols = ($columns[0], @statuses, @resolutions);
+ if (scalar(@columns) == scalar(@new_cols)) {
+ my ($removed, $added) = diff_arrays(\@columns, \@new_cols);
+ last if (!scalar(@$removed) && !scalar(@$added));
+ }
+ }
+ next unless $recreate;
+ next if (/^#/); # Ignore comments.
+ # If we have to recreate the file, we have to load all existing
+ # data first.
+ my @line = split /\|/;
+ my %data;
+ foreach my $column (@columns) {
+ $data{$column} = shift @line;
+ }
+ push(@data, \%data);
}
+ close(DATA);
+ return @data;
}
sub calculate_dupes {
@@ -317,12 +404,13 @@ sub regenerate_stats {
if (open DATA, ">$file") {
DATA->autoflush(1);
+ my $fields = join('|', ('DATE', @statuses, @resolutions));
print DATA <<FIN;
# Bugzilla Daily Bug Stats
#
# Do not edit me! This file is generated.
#
-# fields: DATE|NEW|ASSIGNED|REOPENED|UNCONFIRMED|RESOLVED|VERIFIED|CLOSED|FIXED|INVALID|WONTFIX|LATER|REMIND|DUPLICATE|WORKSFORME|MOVED
+# fields: $fields
# Product: $product
# Created: $when
FIN
@@ -355,17 +443,8 @@ FIN
# the bugs_activity table for that bug made on or after that
# day.
my %bugcount;
- my @logstates = qw(NEW ASSIGNED REOPENED UNCONFIRMED RESOLVED
- VERIFIED CLOSED);
- my @logresolutions = qw(FIXED INVALID WONTFIX LATER REMIND
- DUPLICATE WORKSFORME MOVED);
- foreach (@logstates) {
- $bugcount{$_} = 0;
- }
-
- foreach (@logresolutions) {
- $bugcount{$_} = 0;
- }
+ foreach (@statuses) { $bugcount{$_} = 0; }
+ foreach (@resolutions) { $bugcount{$_} = 0; }
# Get information on bug states and resolutions.
$query = qq{SELECT bugs_activity.removed
FROM bugs_activity
@@ -412,14 +491,8 @@ FIN
# of bugs in each state.
my $date = sqlday($day, $base);
print DATA "$date";
- foreach (@logstates) {
- print DATA "|$bugcount{$_}";
- }
-
- foreach (@logresolutions) {
- print DATA "|$bugcount{$_}";
- }
-
+ foreach (@statuses) { print DATA "|$bugcount{$_}"; }
+ foreach (@resolutions) { print DATA "|$bugcount{$_}"; }
print DATA "\n";
}
diff --git a/editvalues.cgi b/editvalues.cgi
index 013e82be7..109f8a29e 100755
--- a/editvalues.cgi
+++ b/editvalues.cgi
@@ -31,9 +31,9 @@ use Bugzilla::Config qw(:admin);
# (the old "enums.") Keep them in alphabetical order by their
# English name from field-descs.html.tmpl.
# Format: Array of valid field names.
-# Admins may add resolution and bug_status to this list, but they
-# do so at their own risk.
-our @valid_fields = ('op_sys', 'rep_platform', 'priority', 'bug_severity',);
+# Admins may add bug_status to this list, but they do so at their own risk.
+our @valid_fields = ('op_sys', 'rep_platform', 'priority', 'bug_severity',
+ 'resolution');
######################################################################
# Subroutines
@@ -124,6 +124,11 @@ $defaults{'rep_platform'} = 'defaultplatform';
$defaults{'priority'} = 'defaultpriority';
$defaults{'bug_severity'} = 'defaultseverity';
+# Alternatively, a list of non-editable values can be specified.
+# In this case, only the sortkey can be altered.
+my %static;
+$static{'resolution'} = ['', 'FIXED', 'MOVED', 'DUPLICATE'];
+
#
# field = '' -> Show nice list of fields
#
@@ -156,9 +161,9 @@ unless ($action) {
{Slice =>{}});
$vars->{'field'} = $field;
$vars->{'values'} = $fieldvalues;
- $vars->{'default'} = Bugzilla->params->{$defaults{$field}};
- $template->process("admin/fieldvalues/list.html.tmpl",
- $vars)
+ $vars->{'default'} = Bugzilla->params->{$defaults{$field}} if defined $defaults{$field};
+ $vars->{'static'} = $static{$field} if exists $static{$field};
+ $template->process("admin/fieldvalues/list.html.tmpl", $vars)
|| ThrowTemplateError($template->error());
exit;
@@ -245,6 +250,12 @@ if ($action eq 'del') {
$vars->{'value'} = $value;
$vars->{'field'} = $field;
$vars->{'param_name'} = $defaults{$field};
+
+ # If the value cannot be deleted, throw an error.
+ if (lsearch($static{$field}, $value) >= 0) {
+ ThrowUserError('fieldvalue_not_deletable', $vars);
+ }
+
$template->process("admin/fieldvalues/confirm-delete.html.tmpl",
$vars)
|| ThrowTemplateError($template->error());
@@ -258,11 +269,21 @@ if ($action eq 'del') {
#
if ($action eq 'delete') {
ValueMustExist($field, $value);
- if ($value eq Bugzilla->params->{$defaults{$field}}) {
- ThrowUserError('fieldvalue_is_default', {field => $field,
- value => $value,
- param_name => $defaults{$field}})
+
+ $vars->{'value'} = $value;
+ $vars->{'field'} = $field;
+ $vars->{'param_name'} = $defaults{$field};
+
+ if (defined $defaults{$field}
+ && ($value eq Bugzilla->params->{$defaults{$field}}))
+ {
+ ThrowUserError('fieldvalue_is_default', $vars);
+ }
+ # If the value cannot be deleted, throw an error.
+ if (lsearch($static{$field}, $value) >= 0) {
+ ThrowUserError('fieldvalue_not_deletable', $vars);
}
+
trick_taint($field);
trick_taint($value);
@@ -284,8 +305,6 @@ if ($action eq 'delete') {
$dbh->bz_unlock_tables();
- $vars->{'value'} = $value;
- $vars->{'field'} = $field;
$template->process("admin/fieldvalues/deleted.html.tmpl",
$vars)
|| ThrowTemplateError($template->error());
@@ -307,9 +326,9 @@ if ($action eq 'edit') {
$vars->{'value'} = $value;
$vars->{'field'} = $field;
+ $vars->{'is_static'} = (lsearch($static{$field}, $value) >= 0) ? 1 : 0;
- $template->process("admin/fieldvalues/edit.html.tmpl",
- $vars)
+ $template->process("admin/fieldvalues/edit.html.tmpl", $vars)
|| ThrowTemplateError($template->error());
exit;
@@ -327,9 +346,17 @@ if ($action eq 'update') {
trick_taint($field);
trick_taint($valueold);
+ $vars->{'value'} = $value;
+ $vars->{'field'} = $field;
+
+ # If the value cannot be renamed, throw an error.
+ if (lsearch($static{$field}, $valueold) >= 0 && $value ne $valueold) {
+ $vars->{'old_value'} = $valueold;
+ ThrowUserError('fieldvalue_not_editable', $vars);
+ }
+
if (length($value) > 60) {
- ThrowUserError('fieldvalue_name_too_long',
- {'value' => $value});
+ ThrowUserError('fieldvalue_name_too_long', $vars);
}
$dbh->bz_lock_tables('bugs WRITE', "$field WRITE");
@@ -359,9 +386,7 @@ if ($action eq 'update') {
ThrowUserError('fieldvalue_undefined');
}
if (ValueExists($field, $value)) {
- ThrowUserError('fieldvalue_already_exists',
- {'value' => $value,
- 'field' => $field});
+ ThrowUserError('fieldvalue_already_exists', $vars);
}
trick_taint($value);
@@ -380,7 +405,8 @@ if ($action eq 'update') {
# update data/params accordingly.
# This update is done while tables are unlocked due to the
# annoying calls in Bugzilla/Config/Common.pm.
- if ($value ne $valueold
+ if (defined $defaults{$field}
+ && $value ne $valueold
&& $valueold eq Bugzilla->params->{$defaults{$field}})
{
SetParam($defaults{$field}, $value);
@@ -388,8 +414,6 @@ if ($action eq 'update') {
$vars->{'default_value_updated'} = 1;
}
- $vars->{'value'} = $value;
- $vars->{'field'} = $field;
$template->process("admin/fieldvalues/updated.html.tmpl",
$vars)
|| ThrowTemplateError($template->error());
diff --git a/reports.cgi b/reports.cgi
index 9df5824d7..e0ef55daf 100755
--- a/reports.cgi
+++ b/reports.cgi
@@ -228,10 +228,10 @@ sub chart_image_name {
# is that we have to check the safety of doing this. We can't just require
# that the fields exist, because what stats were collected could change
# over time (eg by changing the resolutions available)
- # Instead, just require that each field name consists only of letters
- # and number
+ # Instead, just require that each field name consists only of letters,
+ # numbers, underscores and hyphens.
- if ($datasets !~ m/^[A-Za-z0-9:]+$/) {
+ if ($datasets !~ m/^[A-Za-z0-9:_-]+$/) {
$vars->{'datasets'} = $datasets;
ThrowUserError('invalid_datasets', $vars);
}
diff --git a/t/008filter.t b/t/008filter.t
index 1046218a8..02d4d4a7e 100644
--- a/t/008filter.t
+++ b/t/008filter.t
@@ -176,7 +176,7 @@ sub directive_ok {
return 1 if $directive =~ /^(IF|END|UNLESS|FOREACH|PROCESS|INCLUDE|
BLOCK|USE|ELSE|NEXT|LAST|DEFAULT|FLUSH|
ELSIF|SET|SWITCH|CASE|WHILE|RETURN|STOP|
- TRY|CATCH|FINAL|THROW|CLEAR)/x;
+ TRY|CATCH|FINAL|THROW|CLEAR|MACRO)/x;
# ? :
if ($directive =~ /.+\?(.+):(.+)/) {
diff --git a/template/en/default/admin/fieldvalues/confirm-delete.html.tmpl b/template/en/default/admin/fieldvalues/confirm-delete.html.tmpl
index 317f1f4b3..d29c124d6 100644
--- a/template/en/default/admin/fieldvalues/confirm-delete.html.tmpl
+++ b/template/en/default/admin/fieldvalues/confirm-delete.html.tmpl
@@ -61,13 +61,13 @@
<h2>Confirmation</h2>
-[% IF (Param(param_name) == value) || bug_count || (value_count == 1) %]
+[% IF (param_name.defined && Param(param_name) == value) || bug_count || (value_count == 1) %]
<p>Sorry, but the '[% value FILTER html %]' value cannot be deleted
from the '[% field FILTER html %]' field for the following reason(s):</p>
<ul class="warningmessages">
- [% IF Param(param_name) == value %]
+ [% IF param_name.defined && Param(param_name) == value %]
<li>'[% value FILTER html %]' is the default value for
the '[% field FILTER html %]' field.
[% IF user.groups.tweakparams %]
diff --git a/template/en/default/admin/fieldvalues/edit.html.tmpl b/template/en/default/admin/fieldvalues/edit.html.tmpl
index c798bb3a9..362ed4753 100644
--- a/template/en/default/admin/fieldvalues/edit.html.tmpl
+++ b/template/en/default/admin/fieldvalues/edit.html.tmpl
@@ -33,8 +33,15 @@
<tr>
<th valign="top"><label for="value">Field Value:</label></th>
- <td><input id="value" size="20" maxlength="60" name="value" value="
- [%- value FILTER html %]"></td>
+ <td>
+ [% IF is_static %]
+ <input type="hidden" name="value" value="[% value FILTER html %]">
+ [% value FILTER html %]
+ [% ELSE %]
+ <input id="value" size="20" maxlength="60" name="value" value="
+ [%- value FILTER html %]">
+ [% END %]
+ </td>
</tr>
<tr>
<th align="right"><label for="sortkey">Sortkey:</label></th>
diff --git a/template/en/default/admin/fieldvalues/list.html.tmpl b/template/en/default/admin/fieldvalues/list.html.tmpl
index d25adf2b1..f446d0f96 100644
--- a/template/en/default/admin/fieldvalues/list.html.tmpl
+++ b/template/en/default/admin/fieldvalues/list.html.tmpl
@@ -21,6 +21,7 @@
# displayed to the user in a list.
#
# field: string; the name of the field we are editing values for.
+ # static: array; list of values which cannot be renamed nor deleted.
#%]
[% USE Bugzilla %]
@@ -58,15 +59,35 @@
} ]
%]
-[% overrides.action = [ {
- match_value => "$default"
- match_field => 'name'
- override_content => 1
- content => "(Default value)"
- override_contentlink => 1
- contentlink => undef
- } ]
-%]
+[% IF default.defined %]
+ [% overrides.action = [ {
+ match_value => "$default"
+ match_field => 'name'
+ override_content => 1
+ content => "(Default value)"
+ override_contentlink => 1
+ contentlink => undef
+ } ]
+ %]
+[% END %]
+
+[% IF static.size %]
+ [% UNLESS overrides.action.size %]
+ [% overrides.action = [] %]
+ [% END %]
+
+ [% FOREACH static_value = static %]
+ [% overrides.action.push({
+ match_value => "$static_value"
+ match_field => 'name'
+ override_content => 1
+ content => "(Non deletable value)"
+ override_contentlink => 1
+ contentlink => undef
+ })
+ %]
+ [% END %]
+[% END %]
[% PROCESS admin/table.html.tmpl
columns = columns
diff --git a/template/en/default/bug/activity/table.html.tmpl b/template/en/default/bug/activity/table.html.tmpl
index 31556623d..5bfb79f37 100644
--- a/template/en/default/bug/activity/table.html.tmpl
+++ b/template/en/default/bug/activity/table.html.tmpl
@@ -85,7 +85,7 @@
[% ELSIF change.fieldname == 'bug_status' %]
[% status_descs.${change.removed} FILTER html %]
[% ELSIF change.fieldname == 'resolution' %]
- [% resolution_descs.${change.removed} FILTER html %]
+ [% get_resolution(change.removed) FILTER html %]
[% ELSIF change.fieldname == 'blocked' ||
change.fieldname == 'dependson' %]
[% change.removed FILTER bug_list_link FILTER none %]
@@ -105,7 +105,7 @@
[% ELSIF change.fieldname == 'bug_status' %]
[% status_descs.${change.added} FILTER html %]
[% ELSIF change.fieldname == 'resolution' %]
- [% resolution_descs.${change.added} FILTER html %]
+ [% get_resolution(change.added) FILTER html %]
[% ELSIF change.fieldname == 'blocked' ||
change.fieldname == 'dependson' %]
[% change.added FILTER bug_list_link FILTER none %]
diff --git a/template/en/default/bug/edit.html.tmpl b/template/en/default/bug/edit.html.tmpl
index adbccd141..2ea8d0db6 100644
--- a/template/en/default/bug/edit.html.tmpl
+++ b/template/en/default/bug/edit.html.tmpl
@@ -198,7 +198,7 @@
</b>
</td>
<td>
- [% resolution_descs.${bug.resolution} FILTER html %]
+ [% get_resolution(bug.resolution) FILTER html %]
[% IF bug.resolution == "DUPLICATE" %]
of [% terms.bug %] [%+ "${bug.dup_id}" FILTER bug_link(bug.dup_id) %]
[% END %]
diff --git a/template/en/default/bug/knob.html.tmpl b/template/en/default/bug/knob.html.tmpl
index 38a4898fe..36712911e 100644
--- a/template/en/default/bug/knob.html.tmpl
+++ b/template/en/default/bug/knob.html.tmpl
@@ -28,7 +28,7 @@
<input type="radio" id="knob-leave" name="knob" value="none" checked="checked">
<label for="knob-leave">
Leave as <b>[% status_descs.${bug.bug_status} FILTER html %]&nbsp;
- [% resolution_descs.${bug.resolution} FILTER html %]</b>
+ [% get_resolution(bug.resolution) FILTER html %]</b>
</label>
<br>
@@ -185,7 +185,7 @@
<select name="resolution"
onchange="document.changeform.knob[[% knum %]].checked=true">
[% FOREACH r = bug.choices.resolution %]
- <option value="[% r FILTER html %]">[% resolution_descs.${r} FILTER html %]</option>
+ <option value="[% r FILTER html %]">[% get_resolution(r) FILTER html %]</option>
[% END %]
</select>
<br>
diff --git a/template/en/default/bug/show-multiple.html.tmpl b/template/en/default/bug/show-multiple.html.tmpl
index 023cb9573..22bc3db69 100644
--- a/template/en/default/bug/show-multiple.html.tmpl
+++ b/template/en/default/bug/show-multiple.html.tmpl
@@ -117,7 +117,7 @@
<th>[% field_descs.bug_status FILTER html %]:</th>
<td>
[% status_descs.${bug.bug_status} FILTER html %]
- [%+ resolution_descs.${bug.resolution} FILTER html %]
+ [%+ get_resolution(bug.resolution) FILTER html %]
</td>
[% PROCESS rightcell %]
diff --git a/template/en/default/email/whine.txt.tmpl b/template/en/default/email/whine.txt.tmpl
index 2e1061709..214231394 100644
--- a/template/en/default/email/whine.txt.tmpl
+++ b/template/en/default/email/whine.txt.tmpl
@@ -37,7 +37,7 @@ You need to take a look at them, and decide on an initial action.
Generally, this means one of three things:
-(1) You decide this [% terms.bug %] is really quick to deal with (like, it's [% resolution_descs.INVALID %]),
+(1) You decide this [% terms.bug %] is really quick to deal with (like, it's [% get_resolution("INVALID") %]),
and so you get rid of it immediately.
(2) You decide the [% terms.bug %] doesn't belong to you, and you reassign it to
someone else. (Hint: if you don't know who to reassign it to, make
diff --git a/template/en/default/global/field-descs.none.tmpl b/template/en/default/global/field-descs.none.tmpl
index 8014fe255..7a2725121 100644
--- a/template/en/default/global/field-descs.none.tmpl
+++ b/template/en/default/global/field-descs.none.tmpl
@@ -88,4 +88,6 @@
"---" => "---",
" " => " " } %]
+[% MACRO get_resolution(res) GET resolution_descs.$res || res %]
+
[% Hook.process("end") %]
diff --git a/template/en/default/global/user-error.html.tmpl b/template/en/default/global/user-error.html.tmpl
index 3b901929f..c615598b9 100644
--- a/template/en/default/global/user-error.html.tmpl
+++ b/template/en/default/global/user-error.html.tmpl
@@ -396,6 +396,16 @@
The value of a field is limited to 60 characters.
'[% value FILTER html %]' is too long ([% value.length %] characters).
+ [% ELSIF error == "fieldvalue_not_editable" %]
+ [% title = "Field Value Not Editable" %]
+ The value '[% old_value FILTER html %]' cannot be renamed because
+ it plays some special role for the '[% field FILTER html %]' field.
+
+ [% ELSIF error == "fieldvalue_not_deletable" %]
+ [% title = "Field Value Not Deletable" %]
+ The value '[% value FILTER html %]' cannot be removed because
+ it plays some special role for the '[% field FILTER html %]' field.
+
[% ELSIF error == "fieldvalue_not_specified" %]
[% title = "Field Value Not Specified" %]
No field value specified when trying to edit a field value.
diff --git a/template/en/default/list/edit-multiple.html.tmpl b/template/en/default/list/edit-multiple.html.tmpl
index 687888b24..92a083a68 100644
--- a/template/en/default/list/edit-multiple.html.tmpl
+++ b/template/en/default/list/edit-multiple.html.tmpl
@@ -300,8 +300,8 @@
<select name="resolution" onchange="document.forms.changeform.knob[[% knum %]].checked=true">
[% FOREACH resolution = resolutions %]
[% NEXT IF !resolution %]
- <option value="[% resolution FILTER html %]" [% 'selected="selected"' IF resolution == "FIXED" %]>
- [% resolution_descs.$resolution FILTER html %]
+ <option value="[% resolution FILTER html %]">
+ [% get_resolution(resolution) FILTER html %]
</option>
[% END %]
</select><br>
diff --git a/template/en/default/list/table.html.tmpl b/template/en/default/list/table.html.tmpl
index 7ef53058a..0387adafb 100644
--- a/template/en/default/list/table.html.tmpl
+++ b/template/en/default/list/table.html.tmpl
@@ -193,7 +193,7 @@
[% ELSIF column == 'bug_status' %]
[%- status_descs.${bug.$column}.truncate(abbrev.$column.maxlength, abbrev.$column.ellipsis) FILTER html %]
[% ELSIF column == 'resolution' %]
- [%- resolution_descs.${bug.$column}.truncate(abbrev.$column.maxlength, abbrev.$column.ellipsis) FILTER html %]
+ [%- get_resolution(bug.$column).truncate(abbrev.$column.maxlength, abbrev.$column.ellipsis) FILTER html %]
[% ELSE %]
[%- bug.$column.truncate(abbrev.$column.maxlength, abbrev.$column.ellipsis) FILTER html -%]
[% END %]
diff --git a/template/en/default/pages/fields.html.tmpl b/template/en/default/pages/fields.html.tmpl
index a45fa0b87..7a41801f4 100644
--- a/template/en/default/pages/fields.html.tmpl
+++ b/template/en/default/pages/fields.html.tmpl
@@ -148,7 +148,7 @@ cycle of [% terms.abug %].
<td>
<dl>
<dt>
- <b>[% resolution_descs.FIXED FILTER html %]</b>
+ <b>[% get_resolution("FIXED") FILTER html %]</b>
</dt>
<dd>
A fix for this [% terms.bug %] is checked into the tree and
@@ -156,14 +156,14 @@ cycle of [% terms.abug %].
</dd>
<dt>
- <b>[% resolution_descs.INVALID FILTER html %]</b>
+ <b>[% get_resolution("INVALID") FILTER html %]</b>
</dt>
<dd>
The problem described is not [% terms.abug %].
</dd>
<dt>
- <b>[% resolution_descs.WONTFIX FILTER html %]</b>
+ <b>[% get_resolution("WONTFIX") FILTER html %]</b>
</dt>
<dd>
The problem described is [% terms.abug %] which will never be
@@ -171,7 +171,7 @@ cycle of [% terms.abug %].
</dd>
<dt>
- <b>[% resolution_descs.DUPLICATE FILTER html %]</b>
+ <b>[% get_resolution("DUPLICATE") FILTER html %]</b>
</dt>
<dd>
The problem is a duplicate of an existing [% terms.bug %].
@@ -181,7 +181,7 @@ cycle of [% terms.abug %].
</dd>
<dt>
- <b>[% resolution_descs.WORKSFORME FILTER html %]</b>
+ <b>[% get_resolution("WORKSFORME") FILTER html %]</b>
</dt>
<dd>
All attempts at reproducing this [% terms.bug %] were futile,
@@ -191,7 +191,7 @@ cycle of [% terms.abug %].
</dd>
<dt>
- <b>[% resolution_descs.MOVED FILTER html %]</b>
+ <b>[% get_resolution("MOVED") FILTER html %]</b>
</dt>
<dd>
The problem was specific to a related product
diff --git a/template/en/default/reports/report-bar.png.tmpl b/template/en/default/reports/report-bar.png.tmpl
index bb5dab7cd..2c29a3558 100644
--- a/template/en/default/reports/report-bar.png.tmpl
+++ b/template/en/default/reports/report-bar.png.tmpl
@@ -35,7 +35,7 @@
[% IF col_field == 'resolution' %]
[% FOR i IN [ 0 .. data.0.0.max ] %]
- [% data.0.0.$i = resolution_descs.${data.0.0.$i} %]
+ [% data.0.0.$i = get_resolution(data.0.0.$i) %]
[% END %]
[% END %]
@@ -47,7 +47,7 @@
[% IF row_field == 'resolution' %]
[% FOR i IN [ 0 .. row_names.max ] %]
- [% row_names.$i = resolution_descs.${row_names.$i} %]
+ [% row_names.$i = get_resolution(row_names.$i) %]
[% END %]
[% END %]
diff --git a/template/en/default/reports/report-line.png.tmpl b/template/en/default/reports/report-line.png.tmpl
index 60e9f261a..24215af98 100644
--- a/template/en/default/reports/report-line.png.tmpl
+++ b/template/en/default/reports/report-line.png.tmpl
@@ -35,7 +35,7 @@
[% IF col_field == 'resolution' %]
[% FOR i IN [ 0 .. data.0.0.max ] %]
- [% data.0.0.$i = resolution_descs.${data.0.0.$i} %]
+ [% data.0.0.$i = get_resolution(data.0.0.$i) %]
[% END %]
[% END %]
@@ -47,7 +47,7 @@
[% IF row_field == 'resolution' %]
[% FOR i IN [ 0 .. row_names.max ] %]
- [% row_names.$i = resolution_descs.${row_names.$i} %]
+ [% row_names.$i = get_resolution(row_names.$i) %]
[% END %]
[% END %]
diff --git a/template/en/default/reports/report-pie.png.tmpl b/template/en/default/reports/report-pie.png.tmpl
index c70b06bcf..3eb73b1b0 100644
--- a/template/en/default/reports/report-pie.png.tmpl
+++ b/template/en/default/reports/report-pie.png.tmpl
@@ -31,7 +31,7 @@
[% IF col_field == 'resolution' %]
[% FOR i IN [ 0 .. data.0.0.max ] %]
- [% data.0.0.$i = resolution_descs.${data.0.0.$i} %]
+ [% data.0.0.$i = get_resolution(data.0.0.$i) %]
[% END %]
[% END %]
diff --git a/template/en/default/reports/report-table.csv.tmpl b/template/en/default/reports/report-table.csv.tmpl
index 0abb68ece..2f7f867af 100644
--- a/template/en/default/reports/report-table.csv.tmpl
+++ b/template/en/default/reports/report-table.csv.tmpl
@@ -44,7 +44,7 @@
[% IF col_field == 'bug_status' %]
[% status_descs.$col FILTER csv -%]
[% ELSIF col_field == 'resolution' %]
- [% resolution_descs.$col FILTER csv -%]
+ [% get_resolution(col) FILTER csv -%]
[% ELSE %]
[% col FILTER csv -%]
[% END %]
@@ -57,7 +57,7 @@
[% IF row_field == 'bug_status' %]
[% status_descs.$row FILTER csv -%]
[% ELSIF row_field == 'resolution' %]
- [% resolution_descs.$row FILTER csv -%]
+ [% get_resolution(row) FILTER csv -%]
[% ELSE %]
[% row FILTER csv -%]
[% END %]
diff --git a/template/en/default/reports/report-table.html.tmpl b/template/en/default/reports/report-table.html.tmpl
index 0e2ae62c8..679eb1c1d 100644
--- a/template/en/default/reports/report-table.html.tmpl
+++ b/template/en/default/reports/report-table.html.tmpl
@@ -88,7 +88,7 @@
[% IF col_field == 'bug_status' %]
[% status_descs.$col FILTER html FILTER replace('^ $','&nbsp;') %]
[% ELSIF col_field == 'resolution' %]
- [% resolution_descs.$col FILTER html FILTER replace('^ $','&nbsp;') %]
+ [% get_resolution(col) FILTER html FILTER replace('^ $','&nbsp;') %]
[% ELSE %]
[% col FILTER html FILTER replace('^ $','&nbsp;') %]
[% END %]
@@ -109,7 +109,7 @@
[% IF row_field == 'bug_status' %]
[% status_descs.$row FILTER html FILTER replace('^ $','&nbsp;') %]
[% ELSIF row_field == 'resolution' %]
- [% resolution_descs.$row FILTER html FILTER replace('^ $','&nbsp;') %]
+ [% get_resolution(row) FILTER html FILTER replace('^ $','&nbsp;') %]
[% ELSE %]
[% row FILTER html FILTER replace('^ $','&nbsp;') %]
[% END %]
diff --git a/template/en/default/search/form.html.tmpl b/template/en/default/search/form.html.tmpl
index ee8567586..230a438c1 100644
--- a/template/en/default/search/form.html.tmpl
+++ b/template/en/default/search/form.html.tmpl
@@ -628,12 +628,13 @@ function doOnSelectProduct(selectmode) {
<option value="[% name FILTER html %]"
[% " selected" IF lsearch(default.${sel.name}, name) != -1 %]>
[% IF sel.name == "bug_status" %]
- [% status_descs.${name} FILTER html %]</option>
+ [% status_descs.${name} FILTER html %]
[% ELSIF sel.name == "resolution" %]
- [% resolution_descs.${name} FILTER html %]</option>
+ [% get_resolution(name) FILTER html %]
[% ELSE %]
- [% name FILTER html %]</option>
+ [% name FILTER html %]
[% END %]
+ </option>
[% END %]
</select>
</td>
diff --git a/template/en/default/whine/mail.html.tmpl b/template/en/default/whine/mail.html.tmpl
index d81043a36..8fe11d657 100644
--- a/template/en/default/whine/mail.html.tmpl
+++ b/template/en/default/whine/mail.html.tmpl
@@ -84,7 +84,7 @@
<td align="left">[% bug.rep_platform FILTER html %]</td>
<td align="left">[% bug.$assignee_login_string FILTER html %]</td>
<td align="left">[% status_descs.${bug.bug_status} FILTER html %]</td>
- <td align="left">[% resolution_descs.${bug.resolution} FILTER html %]</td>
+ <td align="left">[% get_resolution(bug.resolution) FILTER html %]</td>
<td align="left">[% bug.short_desc FILTER html %]</td>
</tr>
[% END %]
diff --git a/template/en/default/whine/mail.txt.tmpl b/template/en/default/whine/mail.txt.tmpl
index 962972197..c7dcef3dc 100644
--- a/template/en/default/whine/mail.txt.tmpl
+++ b/template/en/default/whine/mail.txt.tmpl
@@ -59,7 +59,7 @@
Platform: [%+ bug.rep_platform %]
Assignee: [%+ bug.$assignee_login_string %]
Status: [%+ status_descs.${bug.bug_status} %]
- [%- IF bug.resolution -%] Resolution: [% resolution_descs.${bug.resolution} -%]
+ [%- IF bug.resolution -%] Resolution: [% get_resolution(bug.resolution) -%]
[%- END %]
Summary: [% bug.short_desc %]