Commit 8ceb72c2 authored by Frédéric Buclin's avatar Frédéric Buclin

Bug 731559: Preload all attachment submitters when viewing a bug report

a=LpSolit
parent 40e28180
...@@ -593,12 +593,12 @@ sub _check_is_private { ...@@ -593,12 +593,12 @@ sub _check_is_private {
=over =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 Description: retrieves and returns the attachments the currently logged in
user can view for the given bug. 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. to retrieve and return attachments.
Returns: a reference to an array of attachment objects. Returns: a reference to an array of attachment objects.
...@@ -606,14 +606,14 @@ Returns: a reference to an array of attachment objects. ...@@ -606,14 +606,14 @@ Returns: a reference to an array of attachment objects.
=cut =cut
sub get_attachments_by_bug { sub get_attachments_by_bug {
my ($class, $bug_id, $vars) = @_; my ($class, $bug, $vars) = @_;
my $user = Bugzilla->user; my $user = Bugzilla->user;
my $dbh = Bugzilla->dbh; my $dbh = Bugzilla->dbh;
# By default, private attachments are not accessible, unless the user # By default, private attachments are not accessible, unless the user
# is in the insider group or submitted the attachment. # is in the insider group or submitted the attachment.
my $and_restriction = ''; my $and_restriction = '';
my @values = ($bug_id); my @values = ($bug->id);
unless ($user->is_insider) { unless ($user->is_insider) {
$and_restriction = 'AND (isprivate = 0 OR submitter_id = ?)'; $and_restriction = 'AND (isprivate = 0 OR submitter_id = ?)';
...@@ -625,15 +625,18 @@ sub get_attachments_by_bug { ...@@ -625,15 +625,18 @@ sub get_attachments_by_bug {
undef, @values); undef, @values);
my $attachments = Bugzilla::Attachment->new_from_list($attach_ids); my $attachments = Bugzilla::Attachment->new_from_list($attach_ids);
$_->{bug} = $bug foreach @$attachments;
# To avoid $attachment->flags to run SQL queries itself for each # To avoid $attachment->flags to run SQL queries itself for each
# attachment listed here, we collect all the data at once and # attachment listed here, we collect all the data at once and
# populate $attachment->{flags} ourselves. # populate $attachment->{flags} ourselves.
# We also load all attachers at once for the same reason.
if ($vars->{preload}) { if ($vars->{preload}) {
# Preload flags.
$_->{flags} = [] foreach @$attachments; $_->{flags} = [] foreach @$attachments;
my %att = map { $_->id => $_ } @$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' }); target_type => 'attachment' });
# Exclude flags for private attachments you cannot see. # Exclude flags for private attachments you cannot see.
...@@ -641,6 +644,14 @@ sub get_attachments_by_bug { ...@@ -641,6 +644,14 @@ sub get_attachments_by_bug {
push(@{$att{$_->attach_id}->{flags}}, $_) foreach @$flags; push(@{$att{$_->attach_id}->{flags}}, $_) foreach @$flags;
$attachments = [sort {$a->id <=> $b->id} values %att]; $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; return $attachments;
} }
......
...@@ -3100,7 +3100,7 @@ sub attachments { ...@@ -3100,7 +3100,7 @@ sub attachments {
return [] if $self->{'error'}; return [] if $self->{'error'};
$self->{'attachments'} = $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'}; return $self->{'attachments'};
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment