From 80c5b6fadda4e77e5a48cd50e55cbe710a31ca83 Mon Sep 17 00:00:00 2001 From: "lpsolit%gmail.com" <> Date: Thu, 14 Jun 2007 21:25:41 +0000 Subject: Bug 344964: enter_bug.cgi should look at the custom status workflow to get the valid initial bug statuses - Patch by Frédéric Buclin r=gerv a=justdave MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Bugzilla/Bug.pm | 44 ++++++++++++++++++-------------------------- Bugzilla/Status.pm | 19 +++++++++++++++---- 2 files changed, 33 insertions(+), 30 deletions(-) (limited to 'Bugzilla') diff --git a/Bugzilla/Bug.pm b/Bugzilla/Bug.pm index ce4423a27..5ca806092 100755 --- a/Bugzilla/Bug.pm +++ b/Bugzilla/Bug.pm @@ -170,14 +170,6 @@ use constant MAX_LINE_LENGTH => 254; # Used in ValidateComment(). Gives the max length allowed for a comment. use constant MAX_COMMENT_LENGTH => 65535; -# The statuses that are valid on enter_bug.cgi and post_bug.cgi. -# The order is important--see _check_bug_status -use constant VALID_ENTRY_STATUS => qw( - UNCONFIRMED - NEW - ASSIGNED -); - use constant SPECIAL_STATUS_WORKFLOW_ACTIONS => qw( none duplicate @@ -593,38 +585,38 @@ sub _check_bug_status { my ($invocant, $status, $product) = @_; my $user = Bugzilla->user; - my %valid_statuses; + my @valid_statuses; if (ref $invocant) { $invocant->{'prod_obj'} ||= new Bugzilla::Product({name => $invocant->product}); $product = $invocant->{'prod_obj'}; - my $field = new Bugzilla::Field({ name => 'bug_status' }); - %valid_statuses = map { $_ => 1 } @{$field->legal_values}; + @valid_statuses = map { $_->name } @{$invocant->status->can_change_to}; } else { - %valid_statuses = map { $_ => 1 } VALID_ENTRY_STATUS; + @valid_statuses = map { $_->name } @{Bugzilla::Status->can_change_to()}; + } + if (!$product->votes_to_confirm) { + # UNCONFIRMED becomes an invalid status if votes_to_confirm is 0, + # even if you are in editbugs. + @valid_statuses = grep {$_ ne 'UNCONFIRMED'} @valid_statuses; + } + + if (!ref($invocant)) { if ($user->in_group('editbugs', $product->id) || $user->in_group('canconfirm', $product->id)) { - # Default to NEW if the user with privs hasn't selected another - # status. - $status ||= 'NEW'; - } - elsif (!$product->votes_to_confirm) { - # Without privs, products that don't support UNCONFIRMED default - # to NEW. - $status = 'NEW'; + # If the user with privs hasn't selected another status, + # select the first one of the list. + $status ||= $valid_statuses[0]; } else { - $status = 'UNCONFIRMED'; + # A user with no privs cannot choose the initial status. + $status = $valid_statuses[0]; } } - # UNCONFIRMED becomes an invalid status if votes_to_confirm is 0, - # even if you are in editbugs. - delete $valid_statuses{'UNCONFIRMED'} if !$product->votes_to_confirm; - - check_field('bug_status', $status, [keys %valid_statuses]); + # This check already takes the workflow into account. + check_field('bug_status', $status, \@valid_statuses); return $status if ref $invocant; return ($status, $status eq 'UNCONFIRMED' ? 0 : 1); diff --git a/Bugzilla/Status.pm b/Bugzilla/Status.pm index e83fd3533..e91f83871 100644 --- a/Bugzilla/Status.pm +++ b/Bugzilla/Status.pm @@ -58,14 +58,25 @@ sub can_change_to { my $self = shift; my $dbh = Bugzilla->dbh; - if (!defined $self->{'can_change_to'}) { - my $new_status_ids = $dbh->selectcol_arrayref('SELECT new_status + if (!ref($self) || !defined $self->{'can_change_to'}) { + my ($cond, @args); + if (ref($self)) { + $cond = '= ?'; + push(@args, $self->id); + } + else { + $cond = 'IS NULL'; + # Let's do it so that the code below works in all cases. + $self = {}; + } + + my $new_status_ids = $dbh->selectcol_arrayref("SELECT new_status FROM status_workflow INNER JOIN bug_status ON id = new_status WHERE isactive = 1 - AND old_status = ?', - undef, $self->id); + AND old_status $cond", + undef, @args); $self->{'can_change_to'} = Bugzilla::Status->new_from_list($new_status_ids); } -- cgit v1.2.3-24-g4f1b