37 lines
1.2 KiB
Python
37 lines
1.2 KiB
Python
from django.http.request import HttpRequest
|
|
from ninja import Router
|
|
|
|
from collections import defaultdict
|
|
|
|
from accounts.models import CustomUser
|
|
from animations.schemas import RankingSchema
|
|
from submissions.models import PuzzleResponse, SteamCollectionItem
|
|
|
|
router = Router()
|
|
|
|
|
|
@router.get("results", response=RankingSchema)
|
|
def results(request: HttpRequest) -> dict:
|
|
responses_by_userid = defaultdict(list)
|
|
responses_by_puzzleid = defaultdict(list)
|
|
|
|
for response in list(
|
|
PuzzleResponse.objects.filter(needs_manual_validation=False)
|
|
.filter_user_best_response()
|
|
.prefetch_related("submission__user")
|
|
):
|
|
responses_by_userid[response.submission.user.id].append(response)
|
|
responses_by_puzzleid[response.puzzle.id].append(response)
|
|
|
|
ranking = {}
|
|
|
|
for puzzle_id, responses in responses_by_puzzleid.items():
|
|
ranking[puzzle_id] = sorted(responses, key=lambda x: x.rank_points)
|
|
|
|
return {
|
|
"users": CustomUser.objects.filter(pk__in=responses_by_userid.keys()),
|
|
"puzzles": SteamCollectionItem.objects.all(),
|
|
"responses_by_userid": responses_by_userid,
|
|
"ranking_by_puzzle": ranking,
|
|
}
|