feat: leaderboard

This commit is contained in:
Андрей Сумин
2025-03-04 05:46:32 +03:00
parent 257885392f
commit d931cd0112
2 changed files with 21 additions and 2 deletions
-1
View File
@@ -34,7 +34,6 @@ class UserSchema(ModelSchema):
model = User model = User
fields = ["id", "avatar", "email", "username", "created_at"] fields = ["id", "avatar", "email", "username", "created_at"]
class StatSchema(Schema): class StatSchema(Schema):
total_attempts: int total_attempts: int
solved_tasks: int solved_tasks: int
+21 -1
View File
@@ -1,9 +1,11 @@
from datetime import datetime from datetime import datetime
from http import HTTPStatus as status from http import HTTPStatus as status
from django.db.models import Count, Q
from apps.user.models import User
from django.contrib.auth.hashers import check_password, make_password from django.contrib.auth.hashers import check_password, make_password
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from ninja import Router from ninja import Router, File
from ninja.errors import AuthenticationError from ninja.errors import AuthenticationError
from api.v1.auth import BearerAuth from api.v1.auth import BearerAuth
@@ -115,3 +117,21 @@ def get_my_stat(request):
return StatSchema( return StatSchema(
total_attempts=len(user_submissions), solved_tasks=success_attempts_cnt total_attempts=len(user_submissions), solved_tasks=success_attempts_cnt
) )
@router.get(
"leaderboard",
auth=None,
response={
status.OK: list[UserSchema],
}
)
def get_leaderboard(request):
leaderboard = User.objects.annotate(
checked_count=Count(
'competitiontasksubmission',
filter=Q(competitiontasksubmission__status='checked')
)
).order_by('-checked_count')
top_10 = leaderboard[:10]
return status.OK, top_10