]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 92515: Implement the ability to change the resolution of a bug without reopening...
authorlpsolit%gmail.com <>
Tue, 28 Mar 2006 06:25:38 +0000 (06:25 +0000)
committerlpsolit%gmail.com <>
Tue, 28 Mar 2006 06:25:38 +0000 (06:25 +0000)
process_bug.cgi
template/en/default/bug/knob.html.tmpl
template/en/default/global/user-error.html.tmpl

index d1efd38251a2750e0e7f0df3c4ed7c5a91181376..f19763c237d79ebd6d6c02ffb6a4f0f167ae7ab7 100755 (executable)
@@ -449,13 +449,6 @@ sub CheckCanChangeField {
     {
         return 1;
     }
-
-    # A resolution change is always accompanied by a status change. So, we 
-    # always OK resolution changes; if they really can't do this, we will 
-    # notice it when status is checked. 
-    if ($field eq "resolution") { 
-        return 1;             
-    }
     # END DO_NOT_CHANGE
 
     # Allow anyone to change comments.
@@ -1127,7 +1120,7 @@ SWITCH: for ($cgi->param('knob')) {
         ChangeResolution('');
         last SWITCH;
     };
-    /^resolve$/ && CheckonComment( "resolve" ) && do {
+    /^(resolve|change_resolution)$/ && CheckonComment( "resolve" ) && do {
         # Check here, because its the only place we require the resolution
         check_field('resolution', scalar $cgi->param('resolution'),
                     \@::settable_resolution);
@@ -1144,11 +1137,14 @@ SWITCH: for ($cgi->param('knob')) {
             }
         }
 
-        # RESOLVED bugs should have no time remaining;
-        # more time can be added for the VERIFY step, if needed.
-        _remove_remaining_time();
+        if ($cgi->param('knob') eq 'resolve') {
+            # RESOLVED bugs should have no time remaining;
+            # more time can be added for the VERIFY step, if needed.
+            _remove_remaining_time();
+
+            ChangeStatus('RESOLVED');
+        }
 
-        ChangeStatus('RESOLVED');
         ChangeResolution($cgi->param('resolution'));
         last SWITCH;
     };
@@ -1221,20 +1217,10 @@ SWITCH: for ($cgi->param('knob')) {
         ValidateBugID($duplicate, 'dup_id');
         $cgi->param('dup_id', $duplicate);
 
-        # Make sure the bug is not already marked as a dupe
-        # (may appear in race condition)
-        my $dupe_of =
-            $dbh->selectrow_array("SELECT dupe_of FROM duplicates
-                                   WHERE dupe = ?",
-                                   undef, $cgi->param('id'));
-        if ($dupe_of) {
-            ThrowUserError("dupe_entry_found", { dupe_of => $dupe_of });
-        }
-
         # Make sure a loop isn't created when marking this bug
         # as duplicate.
         my %dupes;
-        $dupe_of = $duplicate;
+        my $dupe_of = $duplicate;
         my $sth = $dbh->prepare('SELECT dupe_of FROM duplicates
                                  WHERE dupe = ?');
 
@@ -1699,13 +1685,13 @@ foreach my $id (@idlist) {
         SendSQL($query);
     }
 
-    # Check for duplicates if the bug is [re]open
+    # Check for duplicates if the bug is [re]open or its resolution is changed.
     SendSQL("SELECT resolution FROM bugs WHERE bug_id = $id");
     my $resolution = FetchOneColumn();
-    if ($resolution eq '') {
+    if ($resolution ne 'DUPLICATE') {
         SendSQL("DELETE FROM duplicates WHERE dupe = $id");
     }
-    
+
     my $newproduct_id = $oldhash{'product_id'};
     if ($cgi->param('product') ne $cgi->param('dontchange')) {
         my $newproduct_id = get_product_id($cgi->param('product'));
@@ -2068,6 +2054,11 @@ foreach my $id (@idlist) {
     }
 
     if ($duplicate) {
+        # If the bug was already marked as a duplicate, remove
+        # the existing entry.
+        $dbh->do('DELETE FROM duplicates WHERE dupe = ?',
+                  undef, $cgi->param('id'));
+
         # Check to see if Reporter of this bug is reporter of Dupe 
         SendSQL("SELECT reporter FROM bugs WHERE bug_id = " .
                 $cgi->param('id'));
index c76251ae97918cb6da74fb2c22624928fc1fd577..9f9e73f41a7136308f64b21b94a4e421bd0c9f59 100644 (file)
         Resolve [% terms.bug %], changing 
         <a href="page.cgi?id=fields.html#resolution">resolution</a> to
       </label>  
-      <select name="resolution"
-              onchange="document.changeform.knob[[% knum %]].checked=true">
-        [% FOREACH r = bug.choices.resolution %]
-          <option value="[% r FILTER html %]">[% resolution_descs.${r} FILTER html %]</option>
-        [% END %]
-      </select>
-      <br>
-      [% knum = knum + 1 %]
-
-      <input type="radio" id="knob-duplicate" name="knob" value="duplicate">
-      <label for="knob-duplicate">
-        Resolve [% terms.bug %], mark it as duplicate of [% terms.bug %] #
-      </label>
-      <input name="dup_id" size="6"
-             onchange="if (this.value != '')
-                       {document.changeform.knob[[% knum %]].checked=true}">
-      <br>
-      [% knum = knum + 1 %]
+      [% PROCESS select_resolution %]
+
+      [% PROCESS duplicate %]
 
       [% IF bug.user.canedit %]
         <input type="radio" id="knob-reassign" name="knob" value="reassign">
     [% ELSE %]
       [% IF bug.resolution != "MOVED" ||
            (bug.resolution == "MOVED" && bug.user.canmove) %]
+        <input type="radio" id="knob-change-resolution" name="knob" value="change_resolution">
+        <label for="knob-change-resolution">
+          Change <a href="page.cgi?id=fields.html#resolution">resolution</a> to
+        </label>
+        [% PROCESS select_resolution %]
+
+        [% PROCESS duplicate %]
+
         <input type="radio" id="knob-reopen" name="knob" value="reopen">
         <label for="knob-reopen">
           Reopen [% terms.bug %]
   [% END %]
 
   <input type="submit" value="Commit">
-  <input type="hidden" name="form_name" value="process_bug">
   <p>
     <font size="+1">
       <b>
     [% END %]
   </p>
 
+
+[%# Common actions %]
+
+[% BLOCK select_resolution %]
+  <select name="resolution"
+          onchange="document.changeform.knob[[% knum %]].checked=true">
+    [% FOREACH r = bug.choices.resolution %]
+      <option value="[% r FILTER html %]">[% resolution_descs.${r} FILTER html %]</option>
+    [% END %]
+  </select>
+  <br>
+  [% knum = knum + 1 %]
+[% END %]
+
+[% BLOCK duplicate %]
+  <input type="radio" id="knob-duplicate" name="knob" value="duplicate">
+  <label for="knob-duplicate">
+    Mark the [% terms.bug %] as duplicate of [% terms.bug %] #
+  </label>
+  <input name="dup_id" size="6"
+         onchange="if (this.value != '') {document.changeform.knob[[% knum %]].checked=true}">
+  <br>
+  [% knum = knum + 1 %]
+[% END %]
index c217b2347deeec2432493a287975d8251eea2c54..6e029e1f5879d2307670722c917e00b451e4b932 100644 (file)
     [% title = "Description Required" %]
     You must provide a description of the [% terms.bug %].
 
-  [% ELSIF error == "dupe_entry_found" %]
-    [% title = "Already marked as duplicate" %]
-    This [% terms.bug %] has already been marked as a duplicate
-    of [% terms.bug %] [%+ dupe_of FILTER html %].
-
   [% ELSIF error == "dupe_not_allowed" %]
     [% title = "Cannot mark $terms.bugs as duplicates" %]
     You cannot mark [% terms.bugs %] as duplicates when