Merge remote-tracking branch 'origin/master'

# Conflicts:
#	services/backend/apps/task/models.py
This commit is contained in:
Андрей Сумин
2025-03-02 12:11:33 +03:00
16 changed files with 180 additions and 106 deletions
+24 -22
View File
@@ -1,12 +1,10 @@
from uuid import uuid4
from django.db import models
from django.db.models import Count, Q
from tinymce.models import HTMLField
from apps.competition.models import Competition
from apps.core.models import BaseModel
from apps.review.models import Review, Reviewer, ReviewStatusChoices
from apps.task.validators import ContestTaskCriteriesValidator
from apps.user.models import User
@@ -14,7 +12,7 @@ from apps.user.models import User
class CompetitionTask(BaseModel):
class CompetitionTaskType(models.TextChoices):
INPUT = "input", "Ввод правильного ответа"
CHECKER = "checker", "Вывод кода"
CHECKER = "checker", "Ввод кода"
REVIEW = "review", "Ручная"
def answer_file_upload_to(instance, filename) -> str:
@@ -46,23 +44,13 @@ class CompetitionTask(BaseModel):
answer_file_path = models.TextField(
null=True,
blank=True,
verbose_name="куда сохранять решения",
verbose_name="куда сделать вывод программы участнику",
help_text="Путь до файла в котором ожидается результат. Пример: stdout или ./output.txt",
default="stdout",
)
# only when "review" type
# TODO make it more humanize
criteries = models.JSONField(
blank=True,
null=True,
verbose_name="критерии",
)
# only when "review" type
reviewers = models.ManyToManyField(Reviewer, blank=True)
def clean(self):
ContestTaskCriteriesValidator()(self)
attachments = models.ManyToManyField("CompetitionTaskAttachment", blank=True,
related_name="tasks_attachments")
def __str__(self):
return self.title
@@ -72,14 +60,27 @@ class CompetitionTask(BaseModel):
verbose_name_plural = "задания"
class CompetitionTaskCriteria(BaseModel):
task = models.ForeignKey(
CompetitionTask, on_delete=models.CASCADE, related_name="criteries"
)
name = models.TextField()
slug = models.SlugField()
description = models.TextField()
max_value = models.PositiveSmallIntegerField()
class CompetitionTaskAttachment(BaseModel):
def file_upload_at(instance, filename):
return f"/attachment/{instance.id}/file"
task = models.ForeignKey(CompetitionTask, on_delete=models.CASCADE)
file = models.FileField(upload_to=file_upload_at)
bind_at = models.FilePathField()
public = models.BooleanField(default=False)
task = models.ForeignKey(CompetitionTask, on_delete=models.CASCADE,
verbose_name="задание")
file = models.FileField(upload_to=file_upload_at,
verbose_name="файл")
bind_at = models.FilePathField(verbose_name="путь сохранения")
public = models.BooleanField(default=False, verbose_name="публичный")
class CompetitionTaskSubmission(BaseModel):
@@ -119,7 +120,8 @@ class CompetitionTaskSubmission(BaseModel):
# just more readable result representation, maybe will be calcuated somehow more complex depends on criteria
earned_points = models.IntegerField(null=True, blank=True)
reviewed_at = models.DateTimeField(null=True, blank=True)
checked_at = models.DateTimeField(null=True, blank=True)
plagiarism_checked = models.BooleanField(default=False)
timestamp = models.DateTimeField(auto_now_add=True)
def send_on_review(self):