Commit 80c5b6fa authored by lpsolit%gmail.com's avatar lpsolit%gmail.com

Bug 344964: enter_bug.cgi should look at the custom status workflow to get the…

Bug 344964: enter_bug.cgi should look at the custom status workflow to get the valid initial bug statuses - Patch by Fré©ric Buclin <LpSolit@gmail.com> r=gerv a=justdave
parent 836b976e
......@@ -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);
......
......@@ -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);
}
......
......@@ -49,6 +49,7 @@ use Bugzilla::Classification;
use Bugzilla::Keyword;
use Bugzilla::Token;
use Bugzilla::Field;
use Bugzilla::Status;
my $user = Bugzilla->login(LOGIN_REQUIRED);
......@@ -494,26 +495,21 @@ if ( Bugzilla->params->{'usetargetmilestone'} ) {
}
# Construct the list of allowable statuses.
#
# * If the product requires votes to confirm:
# users with privs : NEW + ASSI + UNCO
# users with no privs: UNCO
#
# * If the product doesn't require votes to confirm:
# users with privs : NEW + ASSI
# users with no privs: NEW (as these users cannot reassign
# bugs to them, it doesn't make sense
# to let them mark bugs as ASSIGNED)
my @status;
if ($has_editbugs || $has_canconfirm) {
@status = ('NEW', 'ASSIGNED');
}
elsif (!$product->votes_to_confirm) {
@status = ('NEW');
}
if ($product->votes_to_confirm) {
push(@status, 'UNCONFIRMED');
my $initial_statuses = Bugzilla::Status->can_change_to();
# Exclude closed states from the UI, even if the workflow allows them.
# The back-end code will still accept them, though.
@$initial_statuses = grep { $_->is_open } @$initial_statuses;
my @status = map { $_->name } @$initial_statuses;
# UNCONFIRMED is illegal if votes_to_confirm = 0.
@status = grep {$_ ne 'UNCONFIRMED'} @status unless $product->votes_to_confirm;
scalar(@status) || ThrowUserError('no_initial_bug_status');
# If the user has no privs...
unless ($has_editbugs || $has_canconfirm) {
# ... use UNCONFIRMED if available, else use the first status of the list.
my $bug_status = (grep {$_ eq 'UNCONFIRMED'} @status) ? 'UNCONFIRMED' : $status[0];
@status = ($bug_status);
}
$vars->{'bug_status'} = \@status;
......
......@@ -1084,6 +1084,11 @@
and an error
occurred opening yesterday's dupes file: [% error_msg FILTER html %].
[% ELSIF error == "no_initial_bug_status" %]
[% title = "No Initial $terms.Bug Status" %]
No [% terms.bug %] status is available on [% terms.bug %] creation.
Please report the problem to [% Param("maintainer") %].
[% ELSIF error == "no_new_quips" %]
[% title = "No New Quips" %]
[% admindocslinks = {'quips.html' => 'Controlling quip usage'} %]
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment