From 688862ca786879525f60a1656170b77cc4d4f5e0 Mon Sep 17 00:00:00 2001 From: ITQ Date: Sat, 1 Mar 2025 12:40:10 +0300 Subject: [PATCH] super aboba --- services/backend/apps/task/models.py | 38 +++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/services/backend/apps/task/models.py b/services/backend/apps/task/models.py index 3ff7ac4..1c4a3ae 100644 --- a/services/backend/apps/task/models.py +++ b/services/backend/apps/task/models.py @@ -1,3 +1,4 @@ +from random import choice from uuid import uuid4 from django.db import models @@ -5,6 +6,9 @@ from django.db import models from apps.task.validators import ContestTaskCriteriesValidator from apps.competition.models import Competition from apps.core.models import BaseModel +from apps.user.models import User +from apps.task.models import CompetitionTask + class CompetitionTask(BaseModel): class CompetitionTaskType(models.TextChoices): @@ -13,7 +17,7 @@ class CompetitionTask(BaseModel): REVIEW = "review" def answer_file_upload_to(instance, filename) -> str: - return f"/tasks/{instance.id}/answer/{uuid4}" + return f"/tasks/{instance.id}/answer/{uuid4()}/filename" competition = models.ForeignKey(Competition, on_delete=models.CASCADE) title = models.TextField(verbose_name="заголовок", max_length=50) @@ -21,13 +25,41 @@ class CompetitionTask(BaseModel): type = models.CharField(choices=CompetitionTaskType, max_length=8) # only when "input" or "checker" type - correct_answer_file = models.FileField(upload_to=answer_file_upload_to) + correct_answer_file = models.FileField( + upload_to=answer_file_upload_to, null=True, blank=True + ) + points = models.IntegerField(null=True, blank=True) # only when "checker" type - answer_file_path = models.TextField() + answer_file_path = models.TextField(null=True, blank=True) # only when "review" type criteries = models.JSONField(blank=True, null=True) def clean(self): ContestTaskCriteriesValidator()(self) + + +class CompetetionTaskSumbission(BaseModel): + class StatusChoices(models.TextChoices): + SENT = "sent" + CHECKING = "checking" + CHECKED = "checked" + + def submission_content_upload_to(instance, filename) -> str: + return f"/submissions/{instance.id}/content" + + def submission_stdout_upload_to(instance, filename) -> str: + return f"/submissions/{instance.id}/stdout" + + status = models.CharField( + choices=StatusChoices.choices, default=StatusChoices.SENT, max_length=2 + ) + user = models.ForeignKey(User, on_delete=models.CASCADE) + task = models.ForeignKey(CompetitionTask, on_delete=models.CASCADE) + content = models.FileField(upload_to=submission_content_upload_to) + stdout = models.FileField( + upload_to=submission_stdout_upload_to, null=True, blank=True + ) + result = models.JSONField(default=None, null=True, blank=True) + timestamp = models.DateTimeField(auto_now_add=True)