From a0cb5b08f1d4c9218d64d8e0471ce0fb5578939c Mon Sep 17 00:00:00 2001 From: "lpsolit%gmail.com" <> Date: Wed, 1 Jul 2009 11:02:20 +0000 Subject: Bug 500900: Confirming bugs requires NEW state to exist - Patch by Frédéric Buclin r/a=mkanat MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Bugzilla/Bug.pm | 48 +++++++++---------------- Bugzilla/Product.pm | 3 +- process_bug.cgi | 2 +- template/en/default/global/code-error.html.tmpl | 7 +++- votes.cgi | 2 +- 5 files changed, 26 insertions(+), 36 deletions(-) diff --git a/Bugzilla/Bug.pm b/Bugzilla/Bug.pm index 69f27ebac..a2db3572a 100644 --- a/Bugzilla/Bug.pm +++ b/Bugzilla/Bug.pm @@ -3355,45 +3355,31 @@ sub RemoveVotes { # If a user votes for a bug, or the number of votes required to # confirm a bug has been reduced, check if the bug is now confirmed. sub CheckIfVotedConfirmed { - my ($id, $who) = (@_); - my $dbh = Bugzilla->dbh; - - # XXX - Use bug methods to update the bug status and everconfirmed. + my $id = shift; my $bug = new Bugzilla::Bug($id); - my ($votes, $status, $everconfirmed, $votestoconfirm, $timestamp) = - $dbh->selectrow_array("SELECT votes, bug_status, everconfirmed, " . - " votestoconfirm, NOW() " . - "FROM bugs INNER JOIN products " . - " ON products.id = bugs.product_id " . - "WHERE bugs.bug_id = ?", - undef, $id); - my $ret = 0; - if ($votes >= $votestoconfirm && !$everconfirmed) { + if (!$bug->everconfirmed && $bug->votes >= $bug->product_obj->votes_to_confirm) { $bug->add_comment('', { type => CMT_POPULAR_VOTES }); - $bug->update(); - if ($status eq 'UNCONFIRMED') { - my $fieldid = get_field_id("bug_status"); - $dbh->do("UPDATE bugs SET bug_status = 'NEW', everconfirmed = 1, " . - "delta_ts = ? WHERE bug_id = ?", - undef, ($timestamp, $id)); - $dbh->do("INSERT INTO bugs_activity " . - "(bug_id, who, bug_when, fieldid, removed, added) " . - "VALUES (?, ?, ?, ?, ?, ?)", - undef, ($id, $who, $timestamp, $fieldid, 'UNCONFIRMED', 'NEW')); + if ($bug->bug_status eq 'UNCONFIRMED') { + # Get a valid open state. + my $new_status; + foreach my $state (@{$bug->status->can_change_to}) { + if ($state->is_open && $state->name ne 'UNCONFIRMED') { + $new_status = $state->name; + last; + } + } + ThrowCodeError('no_open_bug_status') unless $new_status; + + $bug->set_status($new_status); } else { - $dbh->do("UPDATE bugs SET everconfirmed = 1, delta_ts = ? " . - "WHERE bug_id = ?", undef, ($timestamp, $id)); + # If the bug is in a closed state, only set everconfirmed to 1. + $bug->_set_everconfirmed(1); } - - my $fieldid = get_field_id("everconfirmed"); - $dbh->do("INSERT INTO bugs_activity " . - "(bug_id, who, bug_when, fieldid, removed, added) " . - "VALUES (?, ?, ?, ?, ?, ?)", - undef, ($id, $who, $timestamp, $fieldid, '0', '1')); + $bug->update(); $ret = 1; } diff --git a/Bugzilla/Product.pm b/Bugzilla/Product.pm index 4d0082006..1db5e79b3 100644 --- a/Bugzilla/Product.pm +++ b/Bugzilla/Product.pm @@ -149,7 +149,6 @@ sub preload { sub update { my $self = shift; my $dbh = Bugzilla->dbh; - my $user = Bugzilla->user; # Don't update the DB if something goes wrong below -> transaction. $dbh->bz_start_transaction(); @@ -242,7 +241,7 @@ sub update { my @updated_bugs = (); foreach my $bug_id (@$bug_list) { - my $confirmed = CheckIfVotedConfirmed($bug_id, $user->id); + my $confirmed = CheckIfVotedConfirmed($bug_id); push (@updated_bugs, $bug_id) if $confirmed; } $changes->{'confirmed_bugs'} = \@updated_bugs; diff --git a/process_bug.cgi b/process_bug.cgi index 83041230b..9faaf7445 100755 --- a/process_bug.cgi +++ b/process_bug.cgi @@ -583,7 +583,7 @@ foreach my $bug (@bug_objects) { # a list of messages to send to voters. # We delay the sending of these messages till changes are committed. @msgs = RemoveVotes($bug->id, 0, 'votes_bug_moved'); - CheckIfVotedConfirmed($bug->id, Bugzilla->user->id); + CheckIfVotedConfirmed($bug->id); } # Set and update flags. diff --git a/template/en/default/global/code-error.html.tmpl b/template/en/default/global/code-error.html.tmpl index da71da30d..91207a20e 100644 --- a/template/en/default/global/code-error.html.tmpl +++ b/template/en/default/global/code-error.html.tmpl @@ -32,7 +32,7 @@ # in this file; if you do not wish to change it, use the "none" filter. #%] -[% PROCESS global/variables.none.tmpl %] +[% PROCESS "global/field-descs.none.tmpl" %] [% DEFAULT title = "Internal Error" %] @@ -338,6 +338,11 @@ You cannot set the resolution of [% terms.abug %] to MOVED without moving the [% terms.bug %]. + [% ELSIF error == "no_open_bug_status" %] + [% title = "$terms.Bug Cannot Be Confirmed" %] + There is no valid transition from + [%+ get_status("UNCONFIRMED") FILTER html %] to an open state. + [% ELSIF error == "param_must_be_numeric" %] [% title = "Invalid Parameter" %] Invalid parameter passed to [% function FILTER html %]. diff --git a/votes.cgi b/votes.cgi index 3e33d8fa9..1c72431c4 100755 --- a/votes.cgi +++ b/votes.cgi @@ -342,7 +342,7 @@ sub record_votes { my $v = $sth_getVotes->fetchrow_array || 0; $sth_updateVotes->execute($v, $id); - my $confirmed = CheckIfVotedConfirmed($id, $who); + my $confirmed = CheckIfVotedConfirmed($id); push (@updated_bugs, $id) if $confirmed; } $dbh->bz_commit_transaction(); -- cgit v1.2.3-24-g4f1b