mirror of
https://gitlab.com/megazordpobeda/DataRush.git
synced 2026-05-23 02:47:10 +00:00
feat: added submissions history, formatted
This commit is contained in:
@@ -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",)
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user