]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 731559: Preload all attachment submitters when viewing a bug report
authorFrédéric Buclin <LpSolit@gmail.com>
Wed, 29 Feb 2012 13:37:42 +0000 (14:37 +0100)
committerFrédéric Buclin <LpSolit@gmail.com>
Wed, 29 Feb 2012 13:37:42 +0000 (14:37 +0100)
a=LpSolit

Bugzilla/Attachment.pm
Bugzilla/Bug.pm

index 2ab494eecf684335571466d3d3b77f565a7cb69a..eb64d1d0a18083d042612bd871251b895876e025 100644 (file)
@@ -593,12 +593,12 @@ sub _check_is_private {
 
 =over
 
-=item C<get_attachments_by_bug($bug_id)>
+=item C<get_attachments_by_bug($bug)>
 
 Description: retrieves and returns the attachments the currently logged in
              user can view for the given bug.
 
-Params:     C<$bug_id> - integer - the ID of the bug for which
+Params:     C<$bug> - Bugzilla::Bug object - the bug for which
             to retrieve and return attachments.
 
 Returns:    a reference to an array of attachment objects.
@@ -606,14 +606,14 @@ Returns:    a reference to an array of attachment objects.
 =cut
 
 sub get_attachments_by_bug {
-    my ($class, $bug_id, $vars) = @_;
+    my ($class, $bug, $vars) = @_;
     my $user = Bugzilla->user;
     my $dbh = Bugzilla->dbh;
 
     # By default, private attachments are not accessible, unless the user
     # is in the insider group or submitted the attachment.
     my $and_restriction = '';
-    my @values = ($bug_id);
+    my @values = ($bug->id);
 
     unless ($user->is_insider) {
         $and_restriction = 'AND (isprivate = 0 OR submitter_id = ?)';
@@ -625,15 +625,18 @@ sub get_attachments_by_bug {
                                                undef, @values);
 
     my $attachments = Bugzilla::Attachment->new_from_list($attach_ids);
+    $_->{bug} = $bug foreach @$attachments;
 
     # To avoid $attachment->flags to run SQL queries itself for each
     # attachment listed here, we collect all the data at once and
     # populate $attachment->{flags} ourselves.
+    # We also load all attachers at once for the same reason.
     if ($vars->{preload}) {
+        # Preload flags.
         $_->{flags} = [] foreach @$attachments;
         my %att = map { $_->id => $_ } @$attachments;
 
-        my $flags = Bugzilla::Flag->match({ bug_id      => $bug_id,
+        my $flags = Bugzilla::Flag->match({ bug_id      => $bug->id,
                                             target_type => 'attachment' });
 
         # Exclude flags for private attachments you cannot see.
@@ -641,6 +644,14 @@ sub get_attachments_by_bug {
 
         push(@{$att{$_->attach_id}->{flags}}, $_) foreach @$flags;
         $attachments = [sort {$a->id <=> $b->id} values %att];
+
+        # Preload attachers.
+        my %user_ids = map { $_->{submitter_id} => 1 } @$attachments;
+        my $users = Bugzilla::User->new_from_list([keys %user_ids]);
+        my %user_map = map { $_->id => $_ } @$users;
+        foreach my $attachment (@$attachments) {
+            $attachment->{attacher} = $user_map{$attachment->{submitter_id}};
+        }
     }
     return $attachments;
 }
index 4a00596b058bd17dd05270fad21b71659067f7b9..151e4ae9b05e518141a01a8b9287d212f44011c5 100644 (file)
@@ -3100,7 +3100,7 @@ sub attachments {
     return [] if $self->{'error'};
 
     $self->{'attachments'} =
-        Bugzilla::Attachment->get_attachments_by_bug($self->bug_id, {preload => 1});
+        Bugzilla::Attachment->get_attachments_by_bug($self, {preload => 1});
     return $self->{'attachments'};
 }