fix(scores): submit rank handle

This commit is contained in:
Loïc Gremaud 2026-06-12 03:11:12 +02:00
parent 6c9152d8b0
commit 4a90cd9cbd
Signed by: Legrems
GPG Key ID: D4620E6DF3E0121D
2 changed files with 25 additions and 16 deletions

View File

@ -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)

View File

@ -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"]