diff --git a/highscore/scores/api/views.py b/highscore/scores/api/views.py index f44ab15..5c89cfd 100644 --- a/highscore/scores/api/views.py +++ b/highscore/scores/api/views.py @@ -1,8 +1,6 @@ from typing import Annotated -from django.db.models import F, QuerySet -from django.db.models.expressions import Window -from django.db.models.functions import Rank +from django.db.models import QuerySet from django.http import HttpRequest from ninja import Header from ninja.pagination import PageNumberPagination, paginate @@ -26,14 +24,14 @@ def resolve_version(name: str | None) -> Version: return version -@router.post("", response=ScoreOut) +@router.post("", response=None) def submit_score( request: HttpRequest, payload: ScoreIn, x_game_version: GameVersionHeader = None, -) -> Score: +) -> None: version = resolve_version(x_game_version) - return Score.objects.create(username=payload.username, points=payload.points, version=version) + Score.objects.create(username=payload.username, points=payload.points, version=version) @router.get("", response=list[ScoreOut]) @@ -43,13 +41,4 @@ def list_scores( x_game_version: GameVersionHeader = None, ) -> QuerySet[Score]: version = resolve_version(x_game_version) - return ( - Score.objects.filter(version=version) - .select_related("version") - .annotate( - rank=Window( - expression=Rank(), - order_by=F("points").desc(), - ) - ) - ) + return Score.objects.filter(version=version) diff --git a/highscore/scores/models.py b/highscore/scores/models.py index dfa7342..61a5752 100644 --- a/highscore/scores/models.py +++ b/highscore/scores/models.py @@ -1,4 +1,7 @@ from django.db import models +from django.db.models import F +from django.db.models.expressions import Window +from django.db.models.functions import Rank class Version(models.Model): @@ -9,6 +12,21 @@ class Version(models.Model): return self.name +class ScoreManager(models.Manager): + def get_queryset(self) -> models.QuerySet["Score"]: + return ( + super() + .get_queryset() + .select_related("version") + .annotate( + rank=Window( + expression=Rank(), + order_by=F("points").desc(), + ) + ) + ) + + class Score(models.Model): username = models.CharField(max_length=100) points = models.IntegerField() @@ -17,6 +35,8 @@ class Score(models.Model): ) created_at = models.DateTimeField(auto_now_add=True) + objects = ScoreManager() + class Meta: ordering = ["-points"]