diff --git a/Bugzilla/Status.pm b/Bugzilla/Status.pm index d76b70030..cf874ec3a 100644 --- a/Bugzilla/Status.pm +++ b/Bugzilla/Status.pm @@ -1,5 +1,3 @@ -# -*- Mode: perl; indent-tabs-mode: nil -*- -# # The contents of this file are subject to the Mozilla Public # License Version 1.1 (the "License"); you may not use this file # except in compliance with the License. You may obtain a copy of @@ -29,7 +27,7 @@ use base qw(Bugzilla::Field::Choice Exporter); BUG_STATE_OPEN SPECIAL_STATUS_WORKFLOW_ACTIONS - is_open_state + is_open_state closed_bug_statuses ); @@ -48,11 +46,13 @@ use constant DB_TABLE => 'bug_status'; use constant FIELD_NAME => 'bug_status'; # This has all the standard Bugzilla::Field::Choice columns plus "is_open" -sub DB_COLUMNS { +sub DB_COLUMNS +{ return ($_[0]->SUPER::DB_COLUMNS, 'is_open'); } -sub VALIDATORS { +sub VALIDATORS +{ my $invocant = shift; my $validators = $invocant->SUPER::VALIDATORS; $validators->{is_open} = \&Bugzilla::Object::check_boolean; @@ -64,7 +64,8 @@ sub VALIDATORS { # Database Manipulation # ######################### -sub create { +sub create +{ my $class = shift; my $self = $class->SUPER::create(@_); delete Bugzilla->request_cache->{status_bug_state_open}; @@ -72,15 +73,14 @@ sub create { return $self; } -sub remove_from_db { +sub remove_from_db +{ my $self = shift; my $dbh = Bugzilla->dbh; my $id = $self->id; $dbh->bz_start_transaction(); $self->SUPER::remove_from_db(); - $dbh->do('DELETE FROM status_workflow - WHERE old_status = ? OR new_status = ?', - undef, $id, $id); + $dbh->do('DELETE FROM status_workflow WHERE old_status = ? OR new_status = ?', undef, $id, $id); $dbh->bz_commit_transaction(); delete Bugzilla->request_cache->{status_bug_state_open}; } @@ -89,13 +89,13 @@ sub remove_from_db { ##### Accessors #### ############################### -sub is_active { return $_[0]->{'isactive'}; } -sub is_open { return $_[0]->{'is_open'}; } +sub is_active { return $_[0]->{isactive}; } +sub is_open { return $_[0]->{is_open}; } -sub is_static { +sub is_static +{ my $self = shift; - if ($self->name eq 'UNCONFIRMED' - || $self->name eq Bugzilla->params->{'duplicate_or_move_bug_status'}) + if ($self->name eq 'UNCONFIRMED' || $self->name eq Bugzilla->params->{duplicate_or_move_bug_status}) { return 1; } @@ -106,96 +106,101 @@ sub is_static { # Validators # ############## -sub _check_value { +sub _check_value +{ my $invocant = shift; my $value = $invocant->SUPER::_check_value(@_); - if (grep { lc($value) eq lc($_) } SPECIAL_STATUS_WORKFLOW_ACTIONS) { - ThrowUserError('fieldvalue_reserved_word', - { field => $invocant->field, value => $value }); + if (grep { lc($value) eq lc($_) } SPECIAL_STATUS_WORKFLOW_ACTIONS) + { + ThrowUserError('fieldvalue_reserved_word', { field => $invocant->field, value => $value }); } return $value; } - ############################### ##### Methods #### ############################### -sub BUG_STATE_OPEN { +sub BUG_STATE_OPEN +{ my $dbh = Bugzilla->dbh; my $cache = Bugzilla->request_cache; - $cache->{status_bug_state_open} ||= - $dbh->selectcol_arrayref('SELECT value FROM bug_status - WHERE is_open = 1'); + $cache->{status_bug_state_open} ||= $dbh->selectcol_arrayref('SELECT value FROM bug_status WHERE is_open = 1'); return @{ $cache->{status_bug_state_open} }; } # Tells you whether or not the argument is a valid "open" state. # FIXME Remove is_open_state -sub is_open_state { +sub is_open_state +{ my ($state) = @_; return (grep($_ eq $state, BUG_STATE_OPEN) ? 1 : 0); } -sub closed_bug_statuses { +sub closed_bug_statuses +{ my @bug_statuses = Bugzilla::Status->get_all; @bug_statuses = grep { !$_->is_open } @bug_statuses; return @bug_statuses; } -sub can_change_to { +sub can_change_to +{ my $self = shift; my $dbh = Bugzilla->dbh; - if (!ref($self) || !defined $self->{'can_change_to'}) { + if (!ref($self) || !defined $self->{can_change_to}) + { my ($cond, @args, $self_exists); - if (ref($self)) { + if (ref($self)) + { $cond = '= ?'; push(@args, $self->id); $self_exists = 1; } - else { + 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 $cond - ORDER BY sortkey", - undef, @args); + 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 $cond". + " ORDER BY sortkey", undef, @args + ); # Allow the bug status to remain unchanged. push(@$new_status_ids, $self->id) if $self_exists; - $self->{'can_change_to'} = Bugzilla::Status->new_from_list($new_status_ids); + $self->{can_change_to} = Bugzilla::Status->new_from_list($new_status_ids); } - return $self->{'can_change_to'}; + return $self->{can_change_to}; } -sub comment_required_on_change_from { +sub comment_required_on_change_from +{ my ($self, $old_status) = @_; my ($cond, $values) = $self->_status_condition($old_status); - my ($require_comment) = Bugzilla->dbh->selectrow_array( - "SELECT require_comment FROM status_workflow - WHERE $cond", undef, @$values); + "SELECT require_comment FROM status_workflow WHERE $cond", undef, @$values + ); return $require_comment; } # Used as a helper for various functions that have to deal with old_status # sometimes being NULL and sometimes having a value. -sub _status_condition { +sub _status_condition +{ my ($self, $old_status) = @_; my @values; my $cond = 'old_status IS NULL'; # For newly-filed bugs - if ($old_status) { + if ($old_status) + { $cond = 'old_status = ?'; push(@values, $old_status->id); } @@ -204,25 +209,27 @@ sub _status_condition { return ($cond, \@values); } -sub add_missing_bug_status_transitions { - my $bug_status = shift || Bugzilla->params->{'duplicate_or_move_bug_status'}; +sub add_missing_bug_status_transitions +{ + my $bug_status = shift || Bugzilla->params->{duplicate_or_move_bug_status}; my $dbh = Bugzilla->dbh; - my $new_status = new Bugzilla::Status({name => $bug_status}); + my $new_status = new Bugzilla::Status({ name => $bug_status }); + # Silently discard invalid bug statuses. $new_status || return; - my $missing_statuses = $dbh->selectcol_arrayref('SELECT id - FROM bug_status - LEFT JOIN status_workflow - ON old_status = id - AND new_status = ? - WHERE old_status IS NULL', - undef, $new_status->id); + my $missing_statuses = $dbh->selectcol_arrayref( + 'SELECT id FROM bug_status'. + ' LEFT JOIN status_workflow ON old_status = id AND new_status = ?'. + ' WHERE old_status IS NULL', undef, $new_status->id + ); - my $sth = $dbh->prepare('INSERT INTO status_workflow - (old_status, new_status) VALUES (?, ?)'); + my $sth = $dbh->prepare( + 'INSERT INTO status_workflow (old_status, new_status) VALUES (?, ?)' + ); - foreach my $old_status_id (@$missing_statuses) { + foreach my $old_status_id (@$missing_statuses) + { next if ($old_status_id == $new_status->id); $sth->execute($old_status_id, $new_status->id); }