]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
'Bug 1159057: change to create flags as part of bug creation process. r=gerv
authorMatt Tyson <mtyson@redhat.com>
Fri, 15 Jan 2016 14:44:09 +0000 (14:44 +0000)
committerGervase Markham <gerv@mozilla.org>
Fri, 15 Jan 2016 14:44:09 +0000 (14:44 +0000)
Bugzilla/API/1_0/Resource/Bug.pm
Bugzilla/API/1_0/Util.pm
Bugzilla/Bug.pm
Bugzilla/Flag.pm
Bugzilla/WebService/Bug.pm
Bugzilla/WebService/Util.pm
attachment.cgi
post_bug.cgi
process_bug.cgi

index c6ae6a19abdb2f9af5133833d4d74813e0c94462..a8565b7a0cf85a92657b84cbd32cd434a18777bd 100644 (file)
@@ -820,7 +820,7 @@ sub update {
     foreach my $bug (@bugs) {
         $bug->set_all(\%values);
         if ($flags) {
-            my ($old_flags, $new_flags) = extract_flags($flags, $bug);
+            my ($old_flags, $new_flags) = extract_flags($flags, $bug->flag_types, $bug->flags);
             $bug->set_flags($old_flags, $new_flags);
         }
     }
@@ -885,19 +885,29 @@ sub create {
 
     my $flags = delete $params->{flags};
 
+    if ($flags) {
+        my $product = Bugzilla::Product->check($params->{product});
+        my $component = Bugzilla::Component->check({
+            product => $product,
+            name => $params->{component}
+        });
+        my $flag_types = Bugzilla::FlagType::match({
+            product_id => $product->id,
+            component_id => $component->id,
+            is_active => 1,
+        });
+
+        my(undef, $new_flags) =  extract_flags($flags, $flag_types);
+
+        $params->{flags} = $new_flags;
+    }
+
     # We start a nested transaction in case flag setting fails
     # we want the bug creation to roll back as well.
     $dbh->bz_start_transaction();
 
     my $bug = Bugzilla::Bug->create($params);
 
-    # Set bug flags
-    if ($flags) {
-        my ($flags, $new_flags) = extract_flags($flags, $bug);
-        $bug->set_flags($flags, $new_flags);
-        $bug->update($bug->creation_ts);
-    }
-
     $dbh->bz_commit_transaction();
 
     $bug->send_changes();
@@ -989,7 +999,7 @@ sub add_attachment {
         });
 
         if ($flags) {
-            my ($old_flags, $new_flags) = extract_flags($flags, $bug, $attachment);
+            my ($old_flags, $new_flags) = extract_flags($flags, $attachment->flag_types, $attachment->flags);
             $attachment->set_flags($old_flags, $new_flags);
         }
 
@@ -1066,7 +1076,7 @@ sub update_attachment {
     # Update the values
     foreach my $attachment (@attachments) {
         my ($update_flags, $new_flags) = $flags
-            ? extract_flags($flags, $attachment->bug, $attachment)
+            ? extract_flags($flags, $attachment->flag_types, $attachment->flags)
             : ([], []);
         if ($attachment->validate_can_edit) {
             $attachment->set_all($params);
index d22935f6eb429545e34132c5b954cefff22382b0..afdde314e08951cfbd994273a9443ee7f045189f 100644 (file)
@@ -51,11 +51,10 @@ our @EXPORT = qw(
 );
 
 sub extract_flags {
-    my ($flags, $bug, $attachment) = @_;
+    my ($flags, $flag_types, $current_flags) = @_;
     my (@new_flags, @old_flags);
 
-    my $flag_types    = $attachment ? $attachment->flag_types : $bug->flag_types;
-    my $current_flags = $attachment ? $attachment->flags : $bug->flags;
+    $current_flags //= [];
 
     # Copy the user provided $flags as we may call extract_flags more than
     # once when editing multiple bugs or attachments.
index bd3bf587ca128d6440fd589c78d0cc1ad4fba40a..4f12c179f6d632bc81b5aa0a1d0e5622ffb36a52 100644 (file)
@@ -689,6 +689,7 @@ sub possible_duplicates {
 #                     user is not a member of the timetrackinggroup.
 # C<deadline>       - For time-tracking. Will be ignored for the same
 #                     reasons as C<estimated_time>.
+# C<flags>        - An array of flags that will be applied to the bug.
 sub create {
     my ($class, $params) = @_;
     my $dbh = Bugzilla->dbh;
@@ -724,6 +725,7 @@ sub create {
     my $is_markdown      = delete $params->{is_markdown};
     my $see_also         = delete $params->{see_also};
     my $comment_tags     = delete $params->{comment_tags};
+    my $flags            = delete $params->{flags};
 
     # We don't want the bug to appear in the system until it's correctly
     # protected by groups.
@@ -806,6 +808,14 @@ sub create {
         delete $bug->{_update_ref_bugs};
     }
 
+    # Apply any flags.
+    if (defined $flags) {
+        $bug->set_flags($flags);
+        foreach my $flag (@{$bug->flags}) {
+            Bugzilla::Flag->create($flag);
+        }
+    }
+
     # Comment #0 handling...
 
     # We now have a bug id so we can fill this out
index 6d056e7e6fe9d38c0d3291f13302204e43b1ab15..bf37f2a9aa43539c0949328c5c89eae33f229f5a 100644 (file)
@@ -795,19 +795,41 @@ sub _check_status {
 
 =over
 
-=item C<extract_flags_from_cgi($bug, $attachment, $hr_vars)>
+=item C<extract_flags_from_cgi($bug, $hr_vars, $skip, $args)>
 
-Checks whether or not there are new flags to create and returns an
-array of hashes. This array is then passed to Flag::create().
+Checks if are new flags to create and returns an array of hashes.
+This array is then passed to Flag::create().
+
+$args is a hash that can be one of two things.
+
+It can contain a bug object, and optionally an attachment object.
+
+OR
+
+It can contain both a product_id AND a component id.
 
 =back
 
 =cut
 
 sub extract_flags_from_cgi {
-    my ($class, $bug, $attachment, $vars, $skip) = @_;
+    my ($class, $vars, $skip, $args) = @_;
+
     my $cgi = Bugzilla->cgi;
 
+    my ($bug, $attachment, $component_id, $product_id);
+
+    if (defined($args->{bug})) {
+        $bug = $args->{bug};
+        $component_id = $bug->component_id;
+        $product_id = $bug->product_id;
+        $attachment = $args->{attachment} if defined $args->{attachment};
+    }
+    elsif (defined($args->{product_id})) {
+        $product_id = $args->{product_id};
+        $component_id = $args->{component_id};
+    }
+
     my $match_status = Bugzilla::User::match_field({
         '^requestee(_type)?-(\d+)$' => { 'type' => 'multi' },
     }, undef, $skip);
@@ -873,8 +895,8 @@ sub extract_flags_from_cgi {
 
     # Get a list of active flag types available for this product/component.
     my $flag_types = Bugzilla::FlagType::match(
-        { 'product_id'   => $bug->{'product_id'},
-          'component_id' => $bug->{'component_id'},
+        { 'product_id'   => $product_id,
+          'component_id' => $component_id,
           'is_active'    => 1 });
 
     foreach my $flagtype_id (@flagtype_ids) {
@@ -895,16 +917,20 @@ sub extract_flags_from_cgi {
         # We are only interested in flags the user tries to create.
         next unless scalar(grep { $_ == $type_id } @flagtype_ids);
 
-        # Get the number of flags of this type already set for this target.
-        my $has_flags = $class->count(
-            { 'type_id'     => $type_id,
-              'target_type' => $attachment ? 'attachment' : 'bug',
-              'bug_id'      => $bug->bug_id,
-              'attach_id'   => $attachment ? $attachment->id : undef });
-
-        # Do not create a new flag of this type if this flag type is
-        # not multiplicable and already has a flag set.
-        next if (!$flag_type->is_multiplicable && $has_flags);
+        # If $bug is not defined, then we are creating a flag for an as
+        # yet uncreated bug.
+        if (defined $bug) {
+            # Get the number of flags of this type already set for this target.
+            my $has_flags = $class->count({
+                'type_id'     => $type_id,
+                'target_type' => $attachment ? 'attachment' : 'bug',
+                'bug_id'      => $bug->bug_id,
+                'attach_id'   => $attachment ? $attachment->id : undef });
+
+            # Do not create a new flag of this type if this flag type is
+            # not multiplicable and already has a flag set.
+            next if (!$flag_type->is_multiplicable && $has_flags);
+        }
 
         my $status = $cgi->param("flag_type-$type_id");
         trick_taint($status);
index cc40259f86aad331de75e48880d0e94fb9d75a87..a922c2bf050a30cde15dc73bb15f524dcd96b219 100644 (file)
@@ -681,7 +681,7 @@ sub update {
     foreach my $bug (@bugs) {
         $bug->set_all(\%values);
         if ($flags) {
-            my ($old_flags, $new_flags) = extract_flags($flags, $bug);
+            my ($old_flags, $new_flags) = extract_flags($flags, $bug->flag_types, $bug->flags);
             $bug->set_flags($old_flags, $new_flags);
         }
     }
@@ -747,6 +747,23 @@ sub create {
     $params = Bugzilla::Bug::map_fields($params);
 
     my $flags = delete $params->{flags};
+    # Set bug flags
+    if ($flags) {
+        my $product = Bugzilla::Product->check($params->{product});
+        my $component = Bugzilla::Component->check({
+            product => $product,
+            name => $params->{component}
+        });
+        my $flag_types = Bugzilla::FlagType::match({
+            product_id => $product->id,
+            component_id => $component->id,
+            is_active => 1,
+        });
+
+        my(undef, $new_flags) = extract_flags($flags, $flag_types);
+
+        $params->{flags} = $new_flags;
+    }
 
     # We start a nested transaction in case flag setting fails
     # we want the bug creation to roll back as well.
@@ -754,13 +771,6 @@ sub create {
 
     my $bug = Bugzilla::Bug->create($params);
 
-    # Set bug flags
-    if ($flags) {
-        my ($flags, $new_flags) = extract_flags($flags, $bug);
-        $bug->set_flags($flags, $new_flags);
-        $bug->update($bug->creation_ts);
-    }
-
     $dbh->bz_commit_transaction();
 
     $bug->send_changes();
@@ -853,7 +863,10 @@ sub add_attachment {
         });
 
         if ($flags) {
-            my ($old_flags, $new_flags) = extract_flags($flags, $bug, $attachment);
+            my ($old_flags, $new_flags) = extract_flags($flags,
+                $attachment->flag_types,
+                $attachment->flags);
+
             $attachment->set_flags($old_flags, $new_flags);
         }
 
@@ -938,7 +951,7 @@ sub update_attachment {
     # Update the values
     foreach my $attachment (@attachments) {
         my ($update_flags, $new_flags) = $flags
-            ? extract_flags($flags, $attachment->bug, $attachment)
+            ? extract_flags($flags, $attachment->flag_types, $attachment->flags)
             : ([], []);
         if ($attachment->validate_can_edit) {
             $attachment->set_all($params);
index cbbc47921ad4e726b647f6c872687b7c70127a1f..052f7714d09794052341f7931155430e2ceb8a5e 100644 (file)
@@ -37,11 +37,10 @@ our @EXPORT_OK = qw(
 );
 
 sub extract_flags {
-    my ($flags, $bug, $attachment) = @_;
+    my ($flags, $flag_types, $current_flags) = @_;
     my (@new_flags, @old_flags);
 
-    my $flag_types    = $attachment ? $attachment->flag_types : $bug->flag_types;
-    my $current_flags = $attachment ? $attachment->flags : $bug->flags;
+    $current_flags //= [];
 
     # Copy the user provided $flags as we may call extract_flags more than
     # once when editing multiple bugs or attachments.
index ae9efef6aac6686d0072e4911109727db0cf4d13..8a6672ae4a70a2038c1641f8a7be5dd756a9921a 100755 (executable)
@@ -542,7 +542,8 @@ sub insert {
     }
 
     my ($flags, $new_flags) = Bugzilla::Flag->extract_flags_from_cgi(
-                                  $bug, $attachment, $vars, SKIP_REQUESTEE_ON_ERROR);
+                                  $vars, SKIP_REQUESTEE_ON_ERROR,
+                                  { bug => $bug, attachment => $attachment });
     $attachment->set_flags($flags, $new_flags);
 
     # Insert a comment about the new attachment into the database.
@@ -700,7 +701,7 @@ sub update {
     $bug->add_cc($user) if $cgi->param('addselfcc');
 
     my ($flags, $new_flags) =
-      Bugzilla::Flag->extract_flags_from_cgi($bug, $attachment, $vars);
+      Bugzilla::Flag->extract_flags_from_cgi($vars, undef, { bug => $bug, attachment => $attachment });
 
     if ($can_edit) {
         $attachment->set_flags($flags, $new_flags);
index 78a18e759754b4130b384ecd71ad086d8111f449..a01cd11fb3df3e5ddb1361c871c461d3134e5e4c 100755 (executable)
@@ -125,6 +125,18 @@ foreach my $field (@multi_selects) {
     $bug_params{$field->name} = [$cgi->param($field->name)];
 }
 
+
+my $product = Bugzilla::Product->check($bug_params{'product'});
+my $component_id = Bugzilla::Component->check({
+    product => $product,
+    name => $bug_params{'component'}})->id;
+
+# Set bug flags.
+my (undef, $flag_data) = Bugzilla::Flag->extract_flags_from_cgi($vars, SKIP_REQUESTEE_ON_ERROR,{
+                                                         product_id => $product->id,
+                                                         component_id => $component_id });
+$bug_params{flags} = $flag_data;
+
 my $bug = Bugzilla::Bug->create(\%bug_params);
 
 # Get the bug ID back and delete the token used to create this bug.
@@ -180,7 +192,8 @@ if ($data_fh || $attach_text) {
     if ($attachment) {
         # Set attachment flags.
         my ($flags, $new_flags) = Bugzilla::Flag->extract_flags_from_cgi(
-                                      $bug, $attachment, $vars, SKIP_REQUESTEE_ON_ERROR);
+                                       $vars, SKIP_REQUESTEE_ON_ERROR,
+                                       { bug => $bug, attachment => $attachment });
         $attachment->set_flags($flags, $new_flags);
         $attachment->update($timestamp);
         my $comment = $bug->comments->[0];
@@ -193,11 +206,6 @@ if ($data_fh || $attach_text) {
     }
 }
 
-# Set bug flags.
-my ($flags, $new_flags) = Bugzilla::Flag->extract_flags_from_cgi($bug, undef, $vars,
-                                                             SKIP_REQUESTEE_ON_ERROR);
-$bug->set_flags($flags, $new_flags);
-$bug->update($timestamp);
 
 $vars->{'id'} = $id;
 $vars->{'bug'} = $bug;
index 6ed15a0670cf455512a8e5dc638b895b18f0d359..f67050bd1cd83cfe8ab6c0978f4befc9aec3acd5 100755 (executable)
@@ -347,7 +347,7 @@ if (defined $cgi->param('id')) {
     # product/component. The structure of flags code doesn't currently
     # allow them to be set using set_all.
     my ($flags, $new_flags) = Bugzilla::Flag->extract_flags_from_cgi(
-        $first_bug, undef, $vars);
+        $vars, undef, { bug => $first_bug } );
     $first_bug->set_flags($flags, $new_flags);
 
     # Tags can only be set to one bug at once.