From 6ead1a2575509273484fd9c3a9186ebec2f338b8 Mon Sep 17 00:00:00 2001 From: "mkanat%bugzilla.org" <> Date: Mon, 9 Nov 2009 19:09:03 +0000 Subject: Bug 524669: Allow every simple field in fielddefs to be specified directly in search URLs. Patch by Max Kanat-Alexander r=gerv, a=mkanat --- Bugzilla/Constants.pm | 8 ++++++++ Bugzilla/Search.pm | 41 ++++++++++++++++++++--------------------- query.cgi | 6 ++---- 3 files changed, 30 insertions(+), 25 deletions(-) diff --git a/Bugzilla/Constants.pm b/Bugzilla/Constants.pm index 6c2e648bf..6e22eb793 100644 --- a/Bugzilla/Constants.pm +++ b/Bugzilla/Constants.pm @@ -126,6 +126,8 @@ use File::Basename; FIELD_TYPE_BUG_ID FIELD_TYPE_BUG_URLS + TIMETRACKING_FIELDS + USAGE_MODE_BROWSER USAGE_MODE_CMDLINE USAGE_MODE_XMLRPC @@ -358,6 +360,12 @@ use constant FIELD_TYPE_DATETIME => 5; use constant FIELD_TYPE_BUG_ID => 6; use constant FIELD_TYPE_BUG_URLS => 7; +# The fields from fielddefs that are blocked from non-timetracking users. +# work_time is sometimes called actual_time. +use constant TIMETRACKING_FIELDS => + qw(estimated_time remaining_time work_time actual_time + percentage_complete deadline); + # The maximum number of days a token will remain valid. use constant MAX_TOKEN_AGE => 3; # How many days a logincookie will remain valid if not used. diff --git a/Bugzilla/Search.pm b/Bugzilla/Search.pm index 9ba7a8c42..fa18a0e78 100644 --- a/Bugzilla/Search.pm +++ b/Bugzilla/Search.pm @@ -328,27 +328,30 @@ sub init { } } - my @legal_fields = ("product", "version", "assigned_to", "reporter", - "component", "classification", "target_milestone", - "bug_group"); - - # Include custom select fields. - push(@legal_fields, map { $_->name } @select_fields); - push(@legal_fields, map { $_->name } @multi_select_fields); - - foreach my $field ($params->param()) { - if (lsearch(\@legal_fields, $field) != -1) { - push(@specialchart, [$field, "anyexact", - join(',', $params->param($field))]); + # All fields that don't have a . in their name should be specifyable + # in the URL directly. + my @legal_fields = grep { $_->name !~ /\./ } Bugzilla->get_fields; + if (!$user->is_timetracker) { + foreach my $field (TIMETRACKING_FIELDS) { + @legal_fields = grep { $_->name ne $field } @legal_fields; } } - if ($params->param('keywords')) { - my $t = $params->param('keywords_type'); - if (!$t || $t eq "or") { - $t = "anywords"; + foreach my $field ($params->param()) { + if (grep { $_->name eq $field } @legal_fields) { + my $type = $params->param("${field}_type"); + if (!$type) { + if ($field eq 'keywords') { + $type = 'anywords'; + } + else { + $type = 'anyexact'; + } + } + $type = 'matches' if $field eq 'content'; + push(@specialchart, [$field, $type, + join(',', $params->param($field))]); } - push(@specialchart, ["keywords", $t, $params->param('keywords')]); } foreach my $id ("1", "2") { @@ -574,10 +577,6 @@ sub init { } } - if (defined $params->param('content')) { - push(@specialchart, ['content', 'matches', $params->param('content')]); - } - my $multi_fields = join('|', map($_->name, @multi_select_fields)); my $chartid; diff --git a/query.cgi b/query.cgi index d07773bde..fd18bab67 100755 --- a/query.cgi +++ b/query.cgi @@ -266,10 +266,8 @@ $vars->{'resolution'} = Bugzilla::Field->new({name => 'resolution'})->legal_valu my @fields = Bugzilla->get_fields({ obsolete => 0 }); # If we're not in the time-tracking group, exclude time-tracking fields. -if (!Bugzilla->user->in_group(Bugzilla->params->{'timetrackinggroup'})) { - foreach my $tt_field (qw(estimated_time remaining_time work_time - percentage_complete deadline)) - { +if (!Bugzilla->user->is_timetracker) { + foreach my $tt_field (TIMETRACKING_FIELDS) { @fields = grep($_->name ne $tt_field, @fields); } } -- cgit v1.2.3-24-g4f1b