summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrédéric Buclin <LpSolit@gmail.com>2012-02-29 14:37:42 +0100
committerFrédéric Buclin <LpSolit@gmail.com>2012-02-29 14:37:42 +0100
commit8ceb72c2709da6ec31f30671286445c4a110c8cd (patch)
tree1ae39271c95efb3bed9a0fdd6272567220ae1b1e
parent40e28180ebcc7996ff3c8e1a20439c019d6bd6b6 (diff)
downloadbugzilla-8ceb72c2709da6ec31f30671286445c4a110c8cd.tar.gz
bugzilla-8ceb72c2709da6ec31f30671286445c4a110c8cd.tar.xz
Bug 731559: Preload all attachment submitters when viewing a bug report
a=LpSolit
-rw-r--r--Bugzilla/Attachment.pm21
-rw-r--r--Bugzilla/Bug.pm2
2 files changed, 17 insertions, 6 deletions
diff --git a/Bugzilla/Attachment.pm b/Bugzilla/Attachment.pm
index 2ab494eec..eb64d1d0a 100644
--- a/Bugzilla/Attachment.pm
+++ b/Bugzilla/Attachment.pm
@@ -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;
}
diff --git a/Bugzilla/Bug.pm b/Bugzilla/Bug.pm
index 4a00596b0..151e4ae9b 100644
--- a/Bugzilla/Bug.pm
+++ b/Bugzilla/Bug.pm
@@ -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'};
}