]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Fix for bug 179334: updates the setter consistently. also fixes numerous other bugs...
authormyk%mozilla.org <>
Mon, 11 Nov 2002 20:36:22 +0000 (20:36 +0000)
committermyk%mozilla.org <>
Mon, 11 Nov 2002 20:36:22 +0000 (20:36 +0000)
r=bbaetz
a=myk

Bugzilla/Flag.pm
Bugzilla/User.pm
attachment.cgi
process_bug.cgi
template/en/default/flag/list.html.tmpl

index 7395be09de974d7ca3144d0b7e053a955c7e0251..914251968f2e735f442934dd5aa0e4586885a84b 100644 (file)
@@ -183,6 +183,7 @@ sub process {
     my @old_summaries;
     foreach my $flag (@$flags) {
         my $summary = $flag->{'type'}->{'name'} . $flag->{'status'};
+        $summary .= "($flag->{'requestee'}->{'nick'})" if $flag->{'requestee'};
         push(@old_summaries, $summary);
     }
     
@@ -221,6 +222,7 @@ sub process {
     my @new_summaries;
     foreach my $flag (@$flags) {
         my $summary = $flag->{'type'}->{'name'} . $flag->{'status'};
+        $summary .= "($flag->{'requestee'}->{'nick'})" if $flag->{'requestee'};
         push(@new_summaries, $summary);
     }
 
@@ -268,8 +270,10 @@ sub create {
                         $timestamp)");
     
     # Send an email notifying the relevant parties about the flag creation.
-    if ($flag->{'requestee'} && $flag->{'requestee'}->email_prefs->{'FlagRequestee'} 
-        || $flag->{'type'}->{'cc_list'}) {
+    if ($flag->{'requestee'} 
+        && ($flag->{'requestee'}->email_prefs->{'FlagRequestee'} 
+            || $flag->{'type'}->{'cc_list'}))
+    {
         notify($flag, "request/created-email.txt.tmpl");
     }
 }
@@ -299,15 +303,21 @@ sub modify {
     # Extract a list of flags from the form data.
     my @ids = map(/^flag-(\d+)$/ ? $1 : (), keys %$data);
     
-    # Loop over flags and update their record in the database.
+    # Loop over flags and update their record in the database if necessary.
+    # Two kinds of changes can happen to a flag: it can be set to a different
+    # state, and someone else can be asked to set it.  We take care of both
+    # those changes.
     my @flags;
     foreach my $id (@ids) {
         my $flag = get($id);
+
         my $status = $data->{"flag-$id"};
-        
+        my $requestee_email = $data->{"requestee-$id"};
+
         # Ignore flags the user didn't change.
-        next if $status eq $flag->{'status'};
-        
+        next if ($status eq $flag->{'status'} && $flag->{'requestee'}
+                 && $requestee_email eq $flag->{'requestee'}->{'email'});
+
         # Since the status is validated, we know it's safe, but it's still
         # tainted, so we have to detaint it before using it in a query.
         &::trick_taint($status);
@@ -315,6 +325,7 @@ sub modify {
         if ($status eq '+' || $status eq '-') {
             &::SendSQL("UPDATE flags 
                         SET    setter_id = $::userid , 
+                               requestee_id = NULL , 
                                status = '$status' , 
                                modification_date = $timestamp
                         WHERE  id = $flag->{'id'}");
@@ -328,10 +339,28 @@ sub modify {
             }
         }
         elsif ($status eq '?') {
+            # Get the requestee, if any.
+            my $requestee_id = "NULL";
+            if ($requestee_email) {
+                $requestee_id = &::DBname_to_id($requestee_email);
+                $flag->{'requestee'} = new Bugzilla::User($requestee_id);
+            }
+
+            # Update the database with the changes.
             &::SendSQL("UPDATE flags 
-                        SET    status = '$status' , 
+                        SET    setter_id = $::userid , 
+                               requestee_id = $requestee_id , 
+                               status = '$status' , 
                                modification_date = $timestamp
                         WHERE  id = $flag->{'id'}");
+            
+            # Send an email notifying the relevant parties about the request.
+            if ($flag->{'requestee'} 
+                && ($flag->{'requestee'}->email_prefs->{'FlagRequestee'} 
+                    || $flag->{'type'}->{'cc_list'}))
+            {
+                notify($flag, "request/created-email.txt.tmpl");
+            }
         }
         # The user unset the flag, so delete it from the database.
         elsif ($status eq 'X') {
@@ -390,12 +419,12 @@ sub FormToNewFlags {
             status => $status 
         };
 
-        my $requestee_str = $data->{"requestee-$type_id"} || $data->{'requestee'};
-        if ($requestee_str) {
-            my $requestee_id = &::DBname_to_id($requestee_str);
-            $requestee_id 
-              || &::ThrowUserError("invalid_username", {name => $requestee_str});
-            $flag->{'requestee'} = new Bugzilla::User($requestee_id);
+        if ($status eq "?") {
+            my $requestee = $data->{"requestee_type-$type_id"};
+            if ($requestee) {
+                my $requestee_id = &::DBname_to_id($requestee);
+                $flag->{'requestee'} = new Bugzilla::User($requestee_id);
+            }
         }
         
         # Add the flag to the array of flags.
index 3bc02c723c9c9e3e422a819137b0517ba1beef90..7cf05d93585de3f7b8964ee2df89d49d066737fb 100644 (file)
@@ -234,10 +234,15 @@ sub match_field {
                 $expanded_fields->{$field_name} = 
                   { type => $fields->{$field_pattern}->{'type'} };
                 
-                # The field is a requestee field; in order for its name to show
-                # up correctly on the confirmation page, we need to find out
-                # the name of its flag type.
+                # The field is a requestee field; in order for its name 
+                # to show up correctly on the confirmation page, we need 
+                # to find out the name of its flag type.
                 if ($field_name =~ /^requestee-(\d+)$/) {
+                    my $flag = Bugzilla::Flag::get($1);
+                    $expanded_fields->{$field_name}->{'flag_type'} = 
+                      $flag->{'type'};
+                }
+                elsif ($field_name =~ /^requestee_type-(\d+)$/) {
                     $expanded_fields->{$field_name}->{'flag_type'} = 
                       Bugzilla::FlagType::get($1);
                 }
index 04b86dc33d57ae48502ab562142b9d2929dad558..4c573715647330e1b80a66cfba22f6d338dc34f0 100755 (executable)
@@ -110,7 +110,8 @@ elsif ($action eq "update")
   validateContentType() unless $::FORM{'ispatch'};
   validateIsObsolete();
   validatePrivate();
-  Bugzilla::User::match_field({ '^requestee-(\d+)$' => { 'type' => 'single' } });
+  Bugzilla::User::match_field({ '^requestee(_type)?-(\d+)$' => 
+                                    { 'type' => 'single' } });
   Bugzilla::Flag::validate(\%::FORM);
   Bugzilla::FlagType::validate(\%::FORM);
   update();
index a62320fd2243a51d66eac24358bf09096df5cdd9..a0ed799c346367b32f47bec80ef37b376296a84c 100755 (executable)
@@ -91,10 +91,10 @@ scalar(@idlist) || ThrowUserError("no_bugs_chosen");
 # do a match on the fields if applicable
 
 &Bugzilla::User::match_field({
-    'qa_contact'        => { 'type' => 'single' },
-    'newcc'             => { 'type' => 'multi'  },
-    'assigned_to'       => { 'type' => 'single' },
-    '^requestee-(\d+)$' => { 'type' => 'single' },
+    'qa_contact'                => { 'type' => 'single' },
+    'newcc'                     => { 'type' => 'multi'  },
+    'assigned_to'               => { 'type' => 'single' },
+    '^requestee(_type)?-(\d+)$' => { 'type' => 'single' },
 });
 
 # If we are duping bugs, let's also make sure that we can change 
index c3d760eed9447c407a401a4e4641fc57b8f0379d..67cb0b81523833b935be73305cf6570a16551931 100644 (file)
   #%]
 
 <script type="text/javascript">
-  // Enables or disables a requestee field depending on whether
-  // the user is requesting that flag type.
-  function toggleRequesteeField(selectField)
+  // Enables or disables a requestee field depending on whether or not
+  // the user is requesting the corresponding flag.
+  function toggleRequesteeField(flagField)
   {
-    var flagID = selectField.name.replace(/flag_type-(\d+)/, "$1");
-    var requesteeField = document.getElementById("requestee-" + flagID);
+    // Convert the ID of the flag field into the ID of its corresponding
+    // requestee field and then use the ID to get the field.
+    var id = flagField.name.replace(/flag(_type)?-(\d+)/, "requestee$1-$2");
+    var requesteeField = document.getElementById(id);
     if (!requesteeField) return;
-    if   (selectField.value == "?") requesteeField.disabled = false;
-    else                            requesteeField.disabled = true;
+    
+    // Enable or disable the requestee field based on the value
+    // of the flag field.
+    if (flagField.value == "?") requesteeField.disabled = false;
+    else                        requesteeField.disabled = true;
   }
   
-  // Disables requestee fields when the window is loaded since they
-  // shouldn't be enabled until the user requests that flag type.
+  // Disables requestee fields when the window is loaded since they shouldn't
+  // be enabled until the user requests that flag type.
   function disableRequesteeFields()
   {
     var inputElements = document.getElementsByTagName("input");
-    var inputElement;
+    var inputElement, id, flagField;
     for ( var i=0 ; i<inputElements.length ; i++ )
     {
       inputElement = inputElements.item(i);
-      if (inputElement.name.search(/^requestee-(\d+)$/) != -1)
-        inputElement.disabled = true;
+      if (inputElement.name.search(/^requestee(_type)?-(\d+)$/) != -1)
+      {
+        // Convert the ID of the requestee field into the ID of its corresponding
+        // flag field and then use the ID to get the field.
+        id = inputElement.name.replace(/requestee(_type)?-(\d+)/, "flag$1-$2");
+        flagField = document.getElementById(id);
+        if (flagField && flagField.value != "?")
+            inputElement.disabled = true;
+      }
     }
   }
   window.onload = disableRequesteeFields;
 </script>
 
+[%# We list flags by looping twice over the flag types relevant for the bug.
+  # In the first loop, we display existing flags and then, for active types,
+  # we display UI for adding new flags.  In the second loop, we display UI 
+  # for adding additional new flags for those types for which a flag already
+  # exists but which are multiplicable (can have multiple flags of the type
+  # on a single bug/attachment).
+  #%]
+
 <table id="flags">
 
   [% FOREACH type = flag_types %]
@@ -59,7 +79,8 @@
           [% type.name FILTER html %]
         </td>
         <td>
-          <select name="flag-[% flag.id %]" onchange="toggleRequesteeField(this);">
+          <select id="flag-[% flag.id %]" name="flag-[% flag.id %]" 
+                  onchange="toggleRequesteeField(this);">
             <option value="X"></option>
             [% IF type.is_active %]
               <option value="+" [% "selected" IF flag.status == "+" %]>+</option>
           </select>
         </td>
         <td>
-          [% IF flag.status == "?" %]
-            [% IF flag.requestee %]([% flag.requestee.nick FILTER html %])[% END %]
-          [% ELSIF type.is_requestable && type.is_active %]
+          [% IF type.is_active && type.is_requestable %]
             <span style="white-space: nowrap;">
-              (<input type="text" id="requestee-[% type.id %]" 
-                      name="requestee-[% type.id %]" size="8" maxlength="255">)
+              (<input type="text" size="8" maxlength="255"
+                      id="requestee-[% flag.id %]" 
+                      name="requestee-[% flag.id %]"
+                      [% IF flag.status == "?" && flag.requestee %]
+                        value="[% flag.requestee.email FILTER html %]"
+                      [% END %]
+               >)
             </span>
           [% END %]
         </td>
         <td>&nbsp;</td>
         <td>[% type.name %]</td>
         <td>
-          <select name="flag_type-[% type.id %]" onchange="toggleRequesteeField(this);">
+          <select id="flag_type-[% type.id %]" name="flag_type-[% type.id %]" 
+                  onchange="toggleRequesteeField(this);">
             <option value="X"></option>
             <option value="+">+</option>
             <option value="-">-</option>
         </td>
         <td>
             <span style="white-space: nowrap;">
-              (<input type="text" id="requestee-[% type.id %]" 
-                      name="requestee-[% type.id %]" size="8" maxlength="255">)
+              (<input type="text" size="8" maxlength="255"
+                      id="requestee_type-[% type.id %]" 
+                      name="requestee_type-[% type.id %]">)
             </span>
         </td>
       </tr>
     <tr>
       <td colspan="2">addl. [% type.name %]</td>
       <td>
-        <select name="flag_type-[% type.id %]" onchange="toggleRequesteeField(this);">
+        <select id="flag_type-[% type.id %]" name="flag_type-[% type.id %]" 
+                onchange="toggleRequesteeField(this);">
           <option value="X"></option>
           <option value="+">+</option>
           <option value="-">-</option>
       <td>
         [% IF type.is_requestable && type.is_requesteeble %]
             <span style="white-space: nowrap;">
-              (<input type="text" id="requestee-[% type.id %]" 
-                      name="requestee-[% type.id %]" size="8" maxlength="255">)
+              (<input type="text" size="8" maxlength="255"
+                      id="requestee_type-[% type.id %]" 
+                      name="requestee_type-[% type.id %]">)
             </span>
         [% END %]
       </td>