from typing import Literal from uuid import UUID from ninja import ModelSchema, Schema from pydantic import Field from apps.task.models import CompetitionTask, CompetitionTaskSubmission, CompetitionTaskAttachment class TaskOutSchema(ModelSchema): status: Literal["sent", "checked", "checking", "not_submitted"] = None @staticmethod def resolve_status(self, context) -> Literal["sent", "checked", "checking", "not_submitted"]: if submission := CompetitionTaskSubmission.objects.filter(task=self, user=context.get("request").auth).first(): return submission.status return "not_submitted" class Meta: model = CompetitionTask fields = [ "id", "competition", "title", "description", "type", "in_competition_position", "points", ] class TaskSubmissionOut(Schema): submission_id: UUID class HistorySubmissionOut(ModelSchema): status: Literal["sent", "checked", "checking"] class Meta: model = CompetitionTaskSubmission fields = ("id", "earned_points", "timestamp", "content",) class TaskAttachmentSchema(ModelSchema): class Meta: model = CompetitionTaskAttachment fields = ("id", "file", "public",)