from collections import defaultdict from django.http import HttpRequest from ninja import Router from django.core.cache import cache 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: cache_key = "api:results:results" cached_data = cache.get(cache_key) if cached_data is not None: return cached_data 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 is None, x.rank_points or 0) ) data = { "users": list(CustomUser.objects.filter(pk__in=responses_by_userid.keys())), "puzzles": list(SteamCollectionItem.objects.all()), "responses_by_userid": dict(responses_by_userid), "ranking_by_puzzle": ranking, } cache.set("api:results:results", data, 300) return data