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
+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