super aboba

This commit is contained in:
ITQ
2025-03-01 12:40:10 +03:00
parent 077074d424
commit 688862ca78
+35 -3
View File
@@ -1,3 +1,4 @@
from random import choice
from uuid import uuid4 from uuid import uuid4
from django.db import models from django.db import models
@@ -5,6 +6,9 @@ from django.db import models
from apps.task.validators import ContestTaskCriteriesValidator from apps.task.validators import ContestTaskCriteriesValidator
from apps.competition.models import Competition from apps.competition.models import Competition
from apps.core.models import BaseModel from apps.core.models import BaseModel
from apps.user.models import User
from apps.task.models import CompetitionTask
class CompetitionTask(BaseModel): class CompetitionTask(BaseModel):
class CompetitionTaskType(models.TextChoices): class CompetitionTaskType(models.TextChoices):
@@ -13,7 +17,7 @@ class CompetitionTask(BaseModel):
REVIEW = "review" REVIEW = "review"
def answer_file_upload_to(instance, filename) -> str: 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) competition = models.ForeignKey(Competition, on_delete=models.CASCADE)
title = models.TextField(verbose_name="заголовок", max_length=50) title = models.TextField(verbose_name="заголовок", max_length=50)
@@ -21,13 +25,41 @@ class CompetitionTask(BaseModel):
type = models.CharField(choices=CompetitionTaskType, max_length=8) type = models.CharField(choices=CompetitionTaskType, max_length=8)
# only when "input" or "checker" type # 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 # only when "checker" type
answer_file_path = models.TextField() answer_file_path = models.TextField(null=True, blank=True)
# only when "review" type # only when "review" type
criteries = models.JSONField(blank=True, null=True) criteries = models.JSONField(blank=True, null=True)
def clean(self): def clean(self):
ContestTaskCriteriesValidator()(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)