Skip to content

Commit

Permalink
leaderboard: Add total stats
Browse files Browse the repository at this point in the history
  • Loading branch information
Joe2k committed Oct 1, 2024
1 parent 73d7f34 commit d1e0ace
Show file tree
Hide file tree
Showing 2 changed files with 108 additions and 11 deletions.
73 changes: 70 additions & 3 deletions frontend/src/components/tournament/Leaderboard.js
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,19 @@ const TournamentStandings = () => {
data-tabs-toggle="#myTabContent"
role="tablist"
>
<li class="mr-2" role="presentation">
<button
class="inline-block rounded-t-lg border-b-2 p-4"
id={"tab-total"}
data-tabs-target={"#total"}
type="button"
role="tab"
aria-controls={"total"}
aria-selected="true"
>
Total
</button>
</li>
<li class="mr-2" role="presentation">
<button
class="inline-block rounded-t-lg border-b-2 p-4"
Expand All @@ -111,7 +124,7 @@ const TournamentStandings = () => {
type="button"
role="tab"
aria-controls={"scores"}
aria-selected="true"
aria-selected="false"
>
Scores
</button>
Expand Down Expand Up @@ -145,6 +158,60 @@ const TournamentStandings = () => {
</ul>
</div>
<div id="myTabContent">
<div
class="hidden rounded-lg"
id={"total"}
role="tabpanel"
aria-labelledby={"tab-total"}
>
<div class="relative overflow-x-auto rounded-lg shadow-lg">
<table class="w-full text-left text-sm text-gray-500 dark:text-gray-400">
<thead class="bg-gray-50 text-xs uppercase text-gray-700 dark:bg-gray-700 dark:text-gray-400">
<tr>
<th scope="col" class="px-4 py-3">
Player
</th>
<th scope="col" class="px-4 py-3">
Team
</th>
<th scope="col" class="px-4 py-3">
Total
</th>
</tr>
</thead>
<tbody>
<For
each={tournamentLeaderboardQuery.data?.total
?.filter(
player =>
player?.team_name === selectedTeam() ||
selectedTeam() === "all"
)
.filter(
player =>
player?.gender === selectedGender() ||
selectedGender() === "all"
)}
>
{player => (
<tr class="border-b bg-white dark:border-gray-700 dark:bg-gray-800">
<td class="px-4 py-3 font-semibold">{`${player?.first_name.trim()} ${player?.last_name.trim()} (${
player?.gender
})`}</td>
<td class="px-4 py-3">{player?.team_name}</td>
<td class="px-4 py-3">{player?.num_total}</td>
</tr>
)}
</For>
</tbody>
</table>
<Show when={tournamentLeaderboardQuery.data?.total?.length === 0}>
<div class="w-full py-2 text-center text-sm italic">
No Players To Show
</div>
</Show>
</div>
</div>
<div
class="hidden rounded-lg"
id={"scores"}
Expand Down Expand Up @@ -246,7 +313,7 @@ const TournamentStandings = () => {
</For>
</tbody>
</table>
<Show when={tournamentLeaderboardQuery.data?.scores?.length === 0}>
<Show when={tournamentLeaderboardQuery.data?.assists?.length === 0}>
<div class="w-full py-2 text-center text-sm italic">
No Players To Show
</div>
Expand Down Expand Up @@ -300,7 +367,7 @@ const TournamentStandings = () => {
</For>
</tbody>
</table>
<Show when={tournamentLeaderboardQuery.data?.scores?.length === 0}>
<Show when={tournamentLeaderboardQuery.data?.blocks?.length === 0}>
<div class="w-full py-2 text-center text-sm italic">
No Players To Show
</div>
Expand Down
46 changes: 38 additions & 8 deletions server/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -2306,7 +2306,7 @@ def match_stats_full_time(
response={200: dict[str, list[dict[str, Any]]], 400: Response},
)
def get_tournament_leaderboard(
request: AuthenticatedHttpRequest, tournament_slug: str
request: HttpRequest, tournament_slug: str
) -> tuple[int, Any | message_response]:
try:
event = Event.objects.get(slug=tournament_slug)
Expand All @@ -2321,43 +2321,73 @@ def get_tournament_leaderboard(
scores = (
MatchEvent.objects.filter(stats_id__in=match_stats, type=MatchEvent.EventType.SCORE)
.annotate(
player_id=F("scored_by_id"),
first_name=F("scored_by__user__first_name"),
last_name=F("scored_by__user__last_name"),
team_name=F("team__name"),
gender=F("scored_by__gender"),
)
.values("scored_by_id", "first_name", "last_name", "team_name", "gender")
.annotate(num_scores=Count("scored_by_id"))
.values("player_id", "first_name", "last_name", "team_name", "gender")
.annotate(num_scores=Count("player_id"))
.order_by("-num_scores")
)

assists = (
MatchEvent.objects.filter(stats_id__in=match_stats, type=MatchEvent.EventType.SCORE)
.annotate(
player_id=F("assisted_by_id"),
first_name=F("assisted_by__user__first_name"),
last_name=F("assisted_by__user__last_name"),
team_name=F("team__name"),
gender=F("assisted_by__gender"),
)
.values("assisted_by_id", "first_name", "last_name", "team_name", "gender")
.annotate(num_assists=Count("assisted_by_id"))
.values("player_id", "first_name", "last_name", "team_name", "gender")
.annotate(num_assists=Count("player_id"))
.order_by("-num_assists")
)

blocks = (
MatchEvent.objects.filter(stats_id__in=match_stats, type=MatchEvent.EventType.BLOCK)
.annotate(
player_id=F("block_by_id"),
first_name=F("block_by__user__first_name"),
last_name=F("block_by__user__last_name"),
team_name=F("team__name"),
gender=F("block_by__gender"),
)
.values("block_by_id", "first_name", "last_name", "team_name", "gender")
.annotate(num_blocks=Count("block_by_id"))
.values("player_id", "first_name", "last_name", "team_name", "gender")
.annotate(num_blocks=Count("player_id"))
.order_by("-num_blocks")
)

return 200, {"scores": list(scores), "assists": list(assists), "blocks": list(blocks)}
players_map = {}

for score in scores:
players_map[score["player_id"]] = score

for assist in assists:
player = players_map.setdefault(assist["player_id"], assist)
player["num_assists"] = assist["num_assists"]

for block in blocks:
player = players_map.setdefault(block["player_id"], block)
player["num_blocks"] = block["num_blocks"]

players = list(players_map.values())

for player in players:
player["num_total"] = (
player.get("num_scores", 0) + player.get("num_assists", 0) + player.get("num_blocks", 0)
)

players = sorted(players, key=lambda p: p["num_total"], reverse=True)

return 200, {
"scores": list(scores),
"assists": list(assists),
"blocks": list(blocks),
"total": players,
}


# Contact Form ##########
Expand Down

0 comments on commit d1e0ace

Please sign in to comment.