diff --git a/lib/WeBWorK/ContentGenerator/AchievementsLeaderboard.pm b/lib/WeBWorK/ContentGenerator/AchievementsLeaderboard.pm index 2c2ba971d4..371a66f57f 100644 --- a/lib/WeBWorK/ContentGenerator/AchievementsLeaderboard.pm +++ b/lib/WeBWorK/ContentGenerator/AchievementsLeaderboard.pm @@ -46,37 +46,40 @@ sub initialize ($c) { my %globalUserAchievements = map { $_->user_id => $_ } $db->getGlobalUserAchievementsWhere({ user_id => { not_like => 'set_id:%' } }); - my @allBadgeIDs = $db->listAchievements; - my @allBadges = @allBadgeIDs ? sortAchievements($db->getAchievements(@allBadgeIDs)) : (); - $c->{showUserNames} = $c->authz->hasPermissions($c->{userName}, 'view_leaderboard_usernames'); $c->{showLevels} = 0; # Hide level column unless at least one user has a level achievement. + my %allUserAchievements; + for ($db->getUserAchievementsWhere({ + user_id => { not_like => 'set_id:%' }, + achievement_id => [ map { $_->achievement_id } grep { $_->category ne 'level' } @achievements ], + })) + { + $allUserAchievements{ $_->user_id }{ $_->achievement_id } = $_; + } + my @rows; for my $user ($db->getUsersWhere({ user_id => { not_like => 'set_id:%' } })) { # Only include users who can be shown in stats. next unless $ce->status_abbrev_has_behavior($user->status, 'include_in_stats'); + my $globalData = $globalUserAchievements{ $user->user_id }; + my $userAchievements = $allUserAchievements{ $user->user_id }; + # Skip unless user has achievement data. - my $globalData = $globalUserAchievements{ $user->user_id }; - next unless $globalData; + next unless $globalData && $userAchievements; my $level = $globalData->level_achievement_id ? $achievementsById{ $globalData->level_achievement_id } : ''; - my %userAchievements = map { $_->achievement_id => $_ } $db->getUserAchievementsWhere({ - user_id => $user->user_id, - achievement_id => [ map { $_->achievement_id } grep { $_->category ne 'level' } @achievements ], - }); - my @badges; for my $achievement (@achievements) { # Skip level achievements and only show earned achievements. last if $achievement->category eq 'level'; push(@badges, $achievement) - if $userAchievements{ $achievement->achievement_id } + if $userAchievements->{ $achievement->achievement_id } && $achievement->enabled - && $userAchievements{ $achievement->achievement_id }->earned; + && $userAchievements->{ $achievement->achievement_id }->earned; } push(@rows, [ $globalData->achievement_points || 0, $level, $user, \@badges ]);