From 8cb6f0fa771a8c3c2374c8b2fcb7d4f2e5048ed5 Mon Sep 17 00:00:00 2001 From: "lpsolit%gmail.com" <> Date: Thu, 14 Jun 2007 21:35:54 +0000 Subject: Bug 101179: Fully implement support for customised bug statuses and workflow (final checkin!) - 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 --- editvalues.cgi | 44 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 6 deletions(-) (limited to 'editvalues.cgi') diff --git a/editvalues.cgi b/editvalues.cgi index c42e0d142..3974d45dc 100755 --- a/editvalues.cgi +++ b/editvalues.cgi @@ -28,14 +28,14 @@ use Bugzilla::Constants; use Bugzilla::Config qw(:admin); use Bugzilla::Token; use Bugzilla::Field; +use Bugzilla::Bug; # List of different tables that contain the changeable field values # (the old "enums.") Keep them in alphabetical order by their # English name from field-descs.html.tmpl. # Format: Array of valid field names. -# Admins may add bug_status to this list, but they do so at their own risk. our @valid_fields = ('op_sys', 'rep_platform', 'priority', 'bug_severity', - 'resolution'); + 'bug_status', 'resolution'); # Add custom select fields. my @custom_fields = Bugzilla->get_fields({custom => 1, @@ -136,6 +136,7 @@ $defaults{'bug_severity'} = 'defaultseverity'; # Alternatively, a list of non-editable values can be specified. # In this case, only the sortkey can be altered. my %static; +$static{'bug_status'} = ['UNCONFIRMED']; $static{'resolution'} = ['', 'FIXED', 'MOVED', 'DUPLICATE']; $static{$_->name} = ['---'] foreach (@custom_fields); @@ -219,13 +220,24 @@ if ($action eq 'new') { {'field' => $field, 'value' => $value}); } + if ($field eq 'bug_status' + && (grep { lc($value) eq $_ } SPECIAL_STATUS_WORKFLOW_ACTIONS)) + { + $vars->{'value'} = $value; + ThrowUserError('fieldvalue_reserved_word', $vars); + } + # Value is only used in a SELECT placeholder and through the HTML filter. trick_taint($value); # Add the new field value. - my $sth = $dbh->prepare("INSERT INTO $field ( value, sortkey ) - VALUES ( ?, ? )"); - $sth->execute($value, $sortkey); + $dbh->do("INSERT INTO $field (value, sortkey) VALUES (?, ?)", + undef, ($value, $sortkey)); + + if ($field eq 'bug_status' && !$cgi->param('is_open')) { + # The bug status is a closed state, but they are open by default. + $dbh->do('UPDATE bug_status SET is_open = 0 WHERE value = ?', undef, $value); + } delete_token($token); @@ -292,7 +304,9 @@ if ($action eq 'delete') { trick_taint($value); - $dbh->bz_lock_tables('bugs READ', "$field WRITE"); + my @lock_tables = ('bugs READ', "$field WRITE"); + push(@lock_tables, 'status_workflow WRITE') if ($field eq 'bug_status'); + $dbh->bz_lock_tables(@lock_tables); # Check if there are any bugs that still have this value. my $bug_ids = $dbh->selectcol_arrayref( @@ -306,6 +320,14 @@ if ($action eq 'delete') { count => scalar(@$bug_ids) }); } + if ($field eq 'bug_status') { + my $status_id = $dbh->selectrow_arrayref('SELECT id FROM bug_status + WHERE value = ?', undef, $value); + $dbh->do('DELETE FROM status_workflow + WHERE old_status = ? OR new_status = ?', + undef, ($status_id, $status_id)); + } + $dbh->do("DELETE FROM $field WHERE value = ?", undef, $value); $dbh->bz_unlock_tables(); @@ -332,6 +354,10 @@ if ($action eq 'edit') { $vars->{'value'} = $value; $vars->{'is_static'} = (lsearch($static{$field}, $value) >= 0) ? 1 : 0; $vars->{'token'} = issue_session_token('edit_field_value'); + if ($field eq 'bug_status') { + $vars->{'is_open'} = $dbh->selectrow_array('SELECT is_open FROM bug_status + WHERE value = ?', undef, $value); + } $template->process("admin/fieldvalues/edit.html.tmpl", $vars) || ThrowTemplateError($template->error()); @@ -391,6 +417,12 @@ if ($action eq 'update') { if (ValueExists($field, $value)) { ThrowUserError('fieldvalue_already_exists', $vars); } + if ($field eq 'bug_status' + && (grep { lc($value) eq $_ } SPECIAL_STATUS_WORKFLOW_ACTIONS)) + { + $vars->{'value'} = $value; + ThrowUserError('fieldvalue_reserved_word', $vars); + } trick_taint($value); $dbh->do("UPDATE bugs SET $field = ? WHERE $field = ?", -- cgit v1.2.3-24-g4f1b