feat: added submissions history, formatted

This commit is contained in:
Андрей Сумин
2025-03-02 03:17:18 +03:00
parent cb541b3a2a
commit 696fc8e58b
18 changed files with 130 additions and 78 deletions
@@ -11,12 +11,17 @@ class CompetitionOut(ModelSchema):
state: Literal["not_started", "started", "finished"]
@staticmethod
def resolve_state(self, context) -> Literal["not_started", "started", "finished"]:
if not (state := State.objects.filter(user=context.get("request").auth, competition=self).first()):
def resolve_state(
self, context
) -> Literal["not_started", "started", "finished"]:
if not (
state := State.objects.filter(
user=context.get("request").auth, competition=self
).first()
):
return "not_started"
return state.state
class Meta:
model = Competition
exclude = ("participants",)
+1 -1
View File
@@ -8,9 +8,9 @@ from api.v1.competition.views import router as competition_router
from api.v1.ping.views import router as ping_router
from api.v1.review.auth import ReviewerAuth
from api.v1.review.views import router as review_router
from api.v1.user.views import router as user_router
from api.v1.task.views import router as task_router
from api.v1.team.views import router as team_router
from api.v1.user.views import router as user_router
router = NinjaAPI(
title="DataRush API",
+17 -7
View File
@@ -3,19 +3,29 @@ from uuid import UUID
from ninja import ModelSchema, Schema
from apps.task.models import CompetitionTask
from apps.task.models import CompetitionTask, CompetitionTaskSubmission
class TaskOutSchema(ModelSchema):
class Meta:
model = CompetitionTask
fields = ["id", "competition", "title", "description", "type"]
class TaskSubmissionIn(Schema):
type: Literal["input", "file", "code"]
content: str
fields = [
"id",
"competition",
"title",
"description",
"type",
"in_competition_position",
]
class TaskSubmissionOut(Schema):
submission_id: UUID
class HistorySubmissionOut(ModelSchema):
status: Literal["sent", "checked", "checking"]
class Meta:
model = CompetitionTaskSubmission
fields = ("id", "earned_points", "timestamp")
+35 -11
View File
@@ -2,13 +2,13 @@ from http import HTTPStatus as status
from uuid import UUID
from django.shortcuts import get_object_or_404
from ninja import Router
from ninja import File, Router, UploadedFile
from api.v1.ping.schemas import PingOut
from api.v1.schemas import ForbiddenError, NotFoundError, UnauthorizedError
from api.v1.task.schemas import (
HistorySubmissionOut,
TaskOutSchema,
TaskSubmissionIn,
TaskSubmissionOut,
)
from apps.competition.models import State
@@ -87,32 +87,56 @@ def get_task(request, competition_id: str, task_id: str) -> TaskOutSchema: ...
},
)
def submit_task(
request, competition_id: str, task_id: str, submission: TaskSubmissionIn
) -> PingOut:
request,
competition_id: str,
task_id: str,
content: UploadedFile = File(...), # TODO: вот это надо переделать
) -> TaskSubmissionOut:
user = request.auth
competetion = get_object_or_404(Competition, id=competition_id)
competition = get_object_or_404(Competition, id=competition_id)
task = get_object_or_404(
CompetitionTask, competetion=competetion, id=task_id
CompetitionTask, competition=competition, id=task_id
)
if task.type == CompetitionTask.CompetitionTaskType.INPUT:
CompetitionTaskSubmission.objects.create(
submission = CompetitionTaskSubmission.objects.create(
user=user,
task=task,
status=CompetitionTaskSubmission.StatusChoices.CHECKED,
result={"correct": submission.content == task.answer_file_path},
result={"correct": content == task.answer_file_path},
content=content,
)
if task.type == CompetitionTask.CompetitionTaskType.REVIEW:
CompetitionTaskSubmission.objects.create(
submission = CompetitionTaskSubmission.objects.create(
user=user,
task=task,
status=CompetitionTaskSubmission.StatusChoices.SENT,
content=content,
)
if task.type == CompetitionTask.CompetitionTaskType.CHECKER:
CompetitionTaskSubmission.objects.create(
submission = CompetitionTaskSubmission.objects.create(
user=user,
task=task,
status=CompetitionTaskSubmission.StatusChoices.CHECKING,
content=content,
)
return TaskSubmissionOut(id=CompetitionTaskSubmission.id)
return TaskSubmissionOut(submission_id=submission.id)
@router.get(
"competitions/{competition_id}/tasks/{task_id}/history",
response={
status.OK: list[HistorySubmissionOut],
status.UNAUTHORIZED: UnauthorizedError,
},
)
def get_submissions_history(request, competition_id: UUID, task_id: UUID):
task = get_object_or_404(
CompetitionTask, competition_id=competition_id, id=task_id
)
submissions_history = CompetitionTaskSubmission.objects.filter(
task=task, user=request.auth
)
return status.OK, submissions_history
+11 -3
View File
@@ -1,4 +1,4 @@
from ninja import ModelSchema, Schema
from ninja import ModelSchema
from apps.team.models import Team
@@ -6,10 +6,18 @@ from apps.team.models import Team
class CreateTeamSchema(ModelSchema):
class Meta:
model = Team
fields = ("name", "members",)
fields = (
"name",
"members",
)
class TeamSchemaOut(ModelSchema):
class Meta:
model = Team
fields = ("id", "name", "owner", "members", )
fields = (
"id",
"name",
"owner",
"members",
)
+4 -5
View File
@@ -1,12 +1,11 @@
from http import HTTPStatus as status
from uuid import UUID
from django.shortcuts import get_object_or_404
from ninja import Router
from api.v1.schemas import BadRequestError, NotFoundError, UnauthorizedError
from api.v1.team.schemas import CreateTeamSchema, TeamSchemaOut
from apps.team.models import Team
from api.v1.team.schemas import TeamSchemaOut, CreateTeamSchema
from api.v1.schemas import UnauthorizedError, BadRequestError, NotFoundError
router = Router()
@@ -18,7 +17,7 @@ router = Router()
400: BadRequestError,
401: UnauthorizedError,
},
description="Create team. Note: members array must have team members uuid, default can be empty"
description="Create team. Note: members array must have team members uuid, default can be empty",
)
def create_team(request, team_data: CreateTeamSchema) -> (int, TeamSchemaOut):
team = Team(name=team_data.name, owner=request.auth)
@@ -33,7 +32,7 @@ def create_team(request, team_data: CreateTeamSchema) -> (int, TeamSchemaOut):
200: TeamSchemaOut,
401: UnauthorizedError,
404: NotFoundError,
}
},
)
def get_team(request, team_id: UUID) -> (int, TeamSchemaOut):
return get_object_or_404(Team, pk=team_id)