From 1136f7abb9b0e1807ee36e52aaf4b62470ce672b Mon Sep 17 00:00:00 2001 From: Timur Date: Sun, 2 Mar 2025 21:58:43 +0300 Subject: [PATCH] add user stat endpoint --- services/backend/api/v1/user/schemas.py | 5 ++++ services/backend/api/v1/user/views.py | 32 ++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/services/backend/api/v1/user/schemas.py b/services/backend/api/v1/user/schemas.py index 832d91f..b97f6ac 100644 --- a/services/backend/api/v1/user/schemas.py +++ b/services/backend/api/v1/user/schemas.py @@ -23,3 +23,8 @@ class UserSchema(ModelSchema): class Meta: model = User fields = ["id", "email", "username", "created_at", "achievements"] + + +class StatSchema(Schema): + total_attempts: int + solved_tasks: int diff --git a/services/backend/api/v1/user/views.py b/services/backend/api/v1/user/views.py index 2b9cdbe..d7a3dfb 100644 --- a/services/backend/api/v1/user/views.py +++ b/services/backend/api/v1/user/views.py @@ -11,15 +11,17 @@ from api.v1.schemas import ( BadRequestError, ConflictError, ForbiddenError, - NotFoundError, + NotFoundError, UnauthorizedError, ) from api.v1.user.schemas import ( LoginSchema, RegisterSchema, TokenSchema, UserSchema, + StatSchema ) from apps.user.models import User +from apps.task.models import CompetitionTaskSubmission, ReviewStatusChoices router = Router(tags=["user"]) @@ -85,3 +87,31 @@ def get_me(request): def get_user(request, user_id: str): user = get_object_or_404(User, id=user_id) return status.OK, user + + +@router.get( + "/me/stat", + response={ + status.OK: StatSchema, + status.UNAUTHORIZED: UnauthorizedError + }, +) +def get_my_stat(request): + user_submissions = CompetitionTaskSubmission.objects.filter( + user=request.auth + ) + checked_attempts = user_submissions.filter(status=CompetitionTaskSubmission.StatusChoices.CHECKED).all() + success_attempts_cnt = 0 + + for attempt in checked_attempts: + is_correct = attempt.result.get("correct", None) + if is_correct is None: + is_correct = attempt.result.get("total_points", 0) > 0 + + if is_correct: + success_attempts_cnt += 1 + + return StatSchema( + total_attempts=len(user_submissions), + solved_tasks=success_attempts_cnt + )