Bug 257767: Option to have fields in CSV files separated by semicolons instead of commas - Patch by Marc Schumann <wurblzap@gmail.com> r=LpSolit a=myk

This commit is contained in:
lpsolit%gmail.com 2005-07-20 02:14:34 +00:00
Родитель 67beedb2a0
Коммит 35e51a3eb9
10 изменённых файлов: 80 добавлений и 44 удалений

Просмотреть файл

@ -27,6 +27,7 @@ use base qw(Exporter);
add_setting); add_setting);
use Bugzilla::Error; use Bugzilla::Error;
use Bugzilla::Util qw{trick_taint};
############################### ###############################
### Module Initialization ### ### Module Initialization ###
@ -224,6 +225,19 @@ sub legal_values {
return $self->{'legal_values'}; return $self->{'legal_values'};
} }
sub validate_value {
my $self = shift;
if (grep(/^$_[0]$/, @{$self->legal_values()})) {
trick_taint($_[0]);
}
else {
ThrowCodeError('setting_value_invalid',
{'name' => $self->{'_setting_name'},
'value' => $_[0]});
}
}
sub reset_to_default { sub reset_to_default {
my ($self) = @_; my ($self) = @_;
@ -346,6 +360,15 @@ Description: Returns all legal values for this setting
Params: none Params: none
Returns: A reference to an array containing all legal values Returns: A reference to an array containing all legal values
=item C<validate_value>
Description: Determines whether a value is valid for the setting
by checking against the list of legal values.
Untaints the parameter if the value is indeed valid,
and throws a setting_value_invalid code error if not.
Params: An lvalue containing a candidate for a setting value
Returns: nothing
=item C<reset_to_default> =item C<reset_to_default>
Description: If a user chooses to use the global default for a given Description: If a user chooses to use the global default for a given

Просмотреть файл

@ -4053,6 +4053,9 @@ add_setting ("post_bug_submit_action", {"next_bug" => 1,
}, },
"next_bug" ); "next_bug" );
# 2005-06-29 wurblzap@gmail.com -- Bug 257767
add_setting ('csv_colsepchar', {',' => 1, ';' => 2 }, ',' );
########################################################################### ###########################################################################
# Create Administrator --ADMIN-- # Create Administrator --ADMIN--
########################################################################### ###########################################################################

Просмотреть файл

@ -54,11 +54,9 @@ sub SaveSettings{
my $old_value = $vars->{'settings'}->{$name}->{'default_value'}; my $old_value = $vars->{'settings'}->{$name}->{'default_value'};
my $enabled = defined $cgi->param("${name}-enabled") || 0; my $enabled = defined $cgi->param("${name}-enabled") || 0;
my $value = $cgi->param("${name}"); my $value = $cgi->param("${name}");
my $setting = new Bugzilla::User::Setting($name);
# remove taint $setting->validate_value($value);
if ($value =~ /^(\w+)$/ ) {
$value = $1;
}
if ( ($old_enabled != $enabled) || if ( ($old_enabled != $enabled) ||
($old_value ne $value) ) { ($old_value ne $value) ) {

Просмотреть файл

@ -135,7 +135,7 @@
'reports/report-table.csv.tmpl' => [ 'reports/report-table.csv.tmpl' => [
'num_bugs', 'num_bugs',
'data.$tbl.$col.$row', 'data.$tbl.$col.$row',
'title', 'colsepchar',
], ],
'reports/report-table.html.tmpl' => [ 'reports/report-table.html.tmpl' => [
@ -190,6 +190,7 @@
'reports/chart.csv.tmpl' => [ 'reports/chart.csv.tmpl' => [
'data.$j.$i', 'data.$j.$i',
'colsepchar',
], ],
'reports/create-chart.html.tmpl' => [ 'reports/create-chart.html.tmpl' => [
@ -231,6 +232,7 @@
'list/list.csv.tmpl' => [ 'list/list.csv.tmpl' => [
'bug.bug_id', 'bug.bug_id',
'colsepchar',
], ],
'list/list.js.tmpl' => [ 'list/list.js.tmpl' => [

Просмотреть файл

@ -260,6 +260,10 @@
option. Setting names must begin with a letter, and contain only option. Setting names must begin with a letter, and contain only
letters, digits, or the symbols '_', '-', '.', or ':'. letters, digits, or the symbols '_', '-', '.', or ':'.
[% ELSIF error == "setting_value_invalid" %]
The value "<code>[% value FILTER html %]</code>" is not in the list of
legal values for the <em>[% name FILTER html %]</em> setting.
[% ELSIF error == "token_generation_error" %] [% ELSIF error == "token_generation_error" %]
Something is seriously wrong with the token generation system. Something is seriously wrong with the token generation system.

Просмотреть файл

@ -21,6 +21,7 @@
[% setting_descs = { [% setting_descs = {
"comment_sort_order" => "When viewing $terms.abug, show comments in this order", "comment_sort_order" => "When viewing $terms.abug, show comments in this order",
"csv_colsepchar" => "Field separator character for CSV files",
"display_quips" => "Show a quip at the top of each bug list", "display_quips" => "Show a quip at the top of each bug list",
"newest_to_oldest" => "Newest to Oldest", "newest_to_oldest" => "Newest to Oldest",
"newest_to_oldest_desc_first" => "Newest to Oldest, but keep Description at the top", "newest_to_oldest_desc_first" => "Newest to Oldest, but keep Description at the top",

Просмотреть файл

@ -23,19 +23,22 @@
[% PROCESS global/variables.none.tmpl %] [% PROCESS global/variables.none.tmpl %]
[% USE date %] [% USE date %]
bug_id, [% colsepchar = user.settings.csv_colsepchar.value %]
bug_id
[% FOREACH column = displaycolumns %] [% FOREACH column = displaycolumns %]
[% column FILTER csv %], [% colsepchar %][% column FILTER csv %]
[% END %] [% END %]
[% FOREACH bug = bugs %] [% FOREACH bug = bugs %]
[% bug.bug_id %], [% bug.bug_id %]
[% FOREACH column = displaycolumns %] [% FOREACH column = displaycolumns %]
[% colsepchar %]
[% IF column == "opendate" OR column == "changeddate" %] [% IF column == "opendate" OR column == "changeddate" %]
[% rawcolumn = column.replace("date", "time") %] [% rawcolumn = column.replace("date", "time") %]
[% bug.$column = date.format(bug.$rawcolumn, "%Y-%m-%d %H:%M:%S") %] [% bug.$column = date.format(bug.$rawcolumn, "%Y-%m-%d %H:%M:%S") %]
[% END %] [% END %]
[% bug.$column FILTER csv %], [% bug.$column FILTER csv %]
[% END %] [% END %]
[% END %] [% END %]

Просмотреть файл

@ -19,10 +19,12 @@
# Contributor(s): Gervase Markham <gerv@gerv.net> # Contributor(s): Gervase Markham <gerv@gerv.net>
#%] #%]
[% colsepchar = user.settings.csv_colsepchar.value %]
[% data = chart.data %] [% data = chart.data %]
Date\Series, Date\Series
[% FOREACH label = chart.labels %] [% FOREACH label = chart.labels %]
[% label FILTER csv %][% "," UNLESS loop.last %] [% colsepchar %][% label FILTER csv %]
[% END %] [% END %]
[%# The data, which is in the correct format for GD, is conceptually the wrong [%# The data, which is in the correct format for GD, is conceptually the wrong
# way round for CSV output. So, we need to invert it here, which is why # way round for CSV output. So, we need to invert it here, which is why
@ -32,7 +34,10 @@ Date\Series,
[% WHILE i < data.0.size %] [% WHILE i < data.0.size %]
[% j = 0 %] [% j = 0 %]
[% WHILE j < data.size %] [% WHILE j < data.size %]
[% data.$j.$i %][% "," UNLESS (j == data.size - 1) %] [% IF j > 0 %]
[% colsepchar %]
[% END %]
[% data.$j.$i %]
[% j = j + 1 %] [% j = j + 1 %]
[% END %] [% END %]
[% i = i + 1 %] [% i = i + 1 %]

Просмотреть файл

@ -23,51 +23,50 @@
#%] #%]
[% PROCESS global/variables.none.tmpl %] [% PROCESS global/variables.none.tmpl %]
[% colsepchar = user.settings.csv_colsepchar.value %]
[% num_bugs = BLOCK %]Number of [% terms.bugs %][% END %] [% num_bugs = BLOCK %]Number of [% terms.bugs %][% END %]
[% tbl_field_disp = field_descs.$tbl_field || tbl_field %] [% tbl_field_disp = field_descs.$tbl_field || tbl_field %]
[% col_field_disp = field_descs.$col_field || col_field %] [% col_field_disp = field_descs.$col_field || col_field %]
[% row_field_disp = field_descs.$row_field || row_field %] [% row_field_disp = field_descs.$row_field || row_field %]
[% title = BLOCK %] [% IF tbl_field %]
[% IF tbl_field %] [% tbl_field_disp FILTER csv %]: [% tbl FILTER csv %]
[% tbl_field_disp FILTER csv %]: [% tbl FILTER csv %]
[% END %]
[% IF row_field %]
[% row_field_disp FILTER csv %]
[% END %]
[% " / " IF col_field AND row_field %]
[% col_field_disp FILTER csv %]
[% END %] [% END %]
[% IF row_field %]
[% title %], [% row_field_disp FILTER csv %]
[% END %]
[% " / " IF col_field AND row_field %]
[% col_field_disp FILTER csv %]
[% IF col_field -%] [% IF col_field -%]
[% FOREACH col = col_names -%] [% FOREACH col = col_names -%]
[% IF col_field == 'bug_status' %] [% colsepchar %]
[% status_descs.$col FILTER csv -%] [% IF col_field == 'bug_status' %]
[% ELSIF col_field == 'resolution' %] [% status_descs.$col FILTER csv -%]
[% resolution_descs.$col FILTER csv -%] [% ELSIF col_field == 'resolution' %]
[% ELSE %] [% resolution_descs.$col FILTER csv -%]
[% col FILTER csv -%], [% ELSE %]
[% END %] [% col FILTER csv -%]
[% END -%] [% END %]
[% END -%]
[% ELSE -%] [% ELSE -%]
[% num_bugs %], [% colsepchar %][% num_bugs %]
[% END %] [% END %]
[% FOREACH row = row_names %] [% FOREACH row = row_names %]
[% IF row_field == 'bug_status' %] [% IF row_field == 'bug_status' %]
[% status_descs.$row FILTER csv -%] [% status_descs.$row FILTER csv -%]
[% ELSIF row_field == 'resolution' %] [% ELSIF row_field == 'resolution' %]
[% resolution_descs.$row FILTER csv -%] [% resolution_descs.$row FILTER csv -%]
[% ELSE %] [% ELSE %]
[% row FILTER csv -%], [% row FILTER csv -%]
[% END %] [% END %]
[% FOREACH col = col_names %] [% FOREACH col = col_names %]
[% colsepchar %]
[% IF data.$tbl AND data.$tbl.$col AND data.$tbl.$col.$row %] [% IF data.$tbl AND data.$tbl.$col AND data.$tbl.$col.$row %]
[% data.$tbl.$col.$row -%], [% data.$tbl.$col.$row -%]
[% ELSE %] [% ELSE %]
[% -%]0, [% -%]0
[% END %] [% END %]
[% END %] [% END %]

Просмотреть файл

@ -152,18 +152,16 @@ sub SaveSettings {
foreach my $name (@setting_list) { foreach my $name (@setting_list) {
next if ! ($settings->{$name}->{'is_enabled'}); next if ! ($settings->{$name}->{'is_enabled'});
my $value = $cgi->param($name); my $value = $cgi->param($name);
my $setting = new Bugzilla::User::Setting($name);
# de-taint the value.
if ($value =~ /^([-\w]+)$/ ) {
$value = $1;
}
if ($value eq "${name}-isdefault" ) { if ($value eq "${name}-isdefault" ) {
if (! $settings->{$name}->{'is_default'}) { if (! $settings->{$name}->{'is_default'}) {
$settings->{$name}->reset_to_default; $settings->{$name}->reset_to_default;
} }
} }
else { else {
$settings->{$name}->set($value); $setting->validate_value($value);
$settings->{$name}->set($value);
} }
} }
$vars->{'settings'} = Bugzilla->user->settings(1); $vars->{'settings'} = Bugzilla->user->settings(1);