<type>(scope): <description>

[body]

[footer(s)]
This commit is contained in:
ITQ
2025-03-03 12:38:10 +03:00
parent e719aa285d
commit dc979a1a95
6 changed files with 38 additions and 27 deletions
+1 -1
View File
@@ -32,7 +32,7 @@ class UserSchema(ModelSchema):
class Meta: class Meta:
model = User model = User
fields = ["id", "email", "username", "created_at"] fields = ["id", "avatar", "email", "username", "created_at"]
class StatSchema(Schema): class StatSchema(Schema):
+5 -2
View File
@@ -3,8 +3,8 @@ from django.contrib import admin
from apps.task.models import ( from apps.task.models import (
CompetitionTask, CompetitionTask,
CompetitionTaskAttachment, CompetitionTaskAttachment,
CompetitionTaskCriteria,
CompetitionTaskSubmission, CompetitionTaskSubmission,
CompetitionTaskCriteria
) )
@@ -23,7 +23,10 @@ class CompetitionTaskAdmin(admin.ModelAdmin):
list_display = ("title", "type", "points") list_display = ("title", "type", "points")
filter_horizontal = ("reviewers",) filter_horizontal = ("reviewers",)
list_filter = ("type",) list_filter = ("type",)
inlines = (CompletionAttachmentInline, CompetitionCriteriaInline,) inlines = (
CompletionAttachmentInline,
CompetitionCriteriaInline,
)
@admin.register(CompetitionTaskSubmission) @admin.register(CompetitionTaskSubmission)
+15 -14
View File
@@ -22,12 +22,16 @@ class CompetitionTask(BaseModel):
in_competition_position = models.PositiveSmallIntegerField( in_competition_position = models.PositiveSmallIntegerField(
verbose_name="позиция в соревновании" verbose_name="позиция в соревновании"
) )
competition = models.ForeignKey(Competition, on_delete=models.CASCADE, competition = models.ForeignKey(
verbose_name="привязанное соревнование") Competition,
on_delete=models.CASCADE,
verbose_name="привязанное соревнование",
)
title = models.CharField(verbose_name="заголовок", max_length=50) title = models.CharField(verbose_name="заголовок", max_length=50)
description = MDTextField(verbose_name="описание") description = MDTextField(verbose_name="описание")
max_attempts = models.PositiveSmallIntegerField(null=True, blank=True, max_attempts = models.PositiveSmallIntegerField(
verbose_name="максимальное кол-во попыток") null=True, blank=True, verbose_name="максимальное кол-во попыток"
)
type = models.CharField( type = models.CharField(
choices=CompetitionTaskType, max_length=8, verbose_name="тип проверки" choices=CompetitionTaskType, max_length=8, verbose_name="тип проверки"
) )
@@ -68,7 +72,10 @@ class CompetitionTask(BaseModel):
), ),
) )
submission_reviewers_count = models.PositiveSmallIntegerField( submission_reviewers_count = models.PositiveSmallIntegerField(
default=1, null=True, blank=True, verbose_name="кол-во проверяющих для зачета задачи" default=1,
null=True,
blank=True,
verbose_name="кол-во проверяющих для зачета задачи",
) )
def __str__(self): def __str__(self):
@@ -84,15 +91,9 @@ class CompetitionTaskCriteria(BaseModel):
CompetitionTask, on_delete=models.CASCADE, related_name="criteries" CompetitionTask, on_delete=models.CASCADE, related_name="criteries"
) )
name = models.TextField( name = models.TextField(verbose_name="название")
verbose_name="название" slug = models.SlugField(verbose_name="техническое название")
) description = models.TextField(verbose_name="описание критерии")
slug = models.SlugField(
verbose_name="техническое название"
)
description = models.TextField(
verbose_name="описание критерии"
)
max_value = models.PositiveSmallIntegerField( max_value = models.PositiveSmallIntegerField(
verbose_name="максимальное кол-во баллов" verbose_name="максимальное кол-во баллов"
) )
+2 -1
View File
@@ -1,8 +1,9 @@
import hashlib
import httpx import httpx
from celery import shared_task from celery import shared_task
from django.conf import settings from django.conf import settings
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
import hashlib
from apps.task.models import CompetitionTaskSubmission from apps.task.models import CompetitionTaskSubmission
+8 -3
View File
@@ -11,11 +11,14 @@ class UserRole(models.TextChoices):
class User(BaseModel): class User(BaseModel):
avatar = models.ImageField(verbose_name="аватар")
email = models.EmailField(unique=True, verbose_name="почта") email = models.EmailField(unique=True, verbose_name="почта")
username = models.SlugField(unique=True, verbose_name="юзернейм") username = models.SlugField(unique=True, verbose_name="юзернейм")
password = models.TextField(verbose_name="пароль") password = models.TextField(verbose_name="пароль")
created_at = models.DateTimeField(auto_now=True, verbose_name="дата создания") created_at = models.DateTimeField(
auto_now=True, verbose_name="дата создания"
)
achievements = models.ManyToManyField( achievements = models.ManyToManyField(
Achievement, blank=True, verbose_name="ачивки пользователя" Achievement, blank=True, verbose_name="ачивки пользователя"
@@ -29,8 +32,10 @@ class User(BaseModel):
return check_password(self.password, password) return check_password(self.password, password)
status = models.CharField( status = models.CharField(
max_length=10, choices=UserRole.choices, default="student", max_length=10,
verbose_name="роль участника" choices=UserRole.choices,
default="student",
verbose_name="роль участника",
) )
def __str__(self) -> str: def __str__(self) -> str:
+7 -6
View File
@@ -157,12 +157,12 @@ def run_container_safely(
"stderr": f"Container error: {str(e)}", "stderr": f"Container error: {str(e)}",
"status": -1, "status": -1,
} }
# finally: finally:
# if container: if container:
# try: try:
# container.remove(force=True) container.remove(force=True)
# except docker.errors.DockerException: except docker.errors.DockerException:
# pass pass
def validate_file_path(path: str) -> bool: def validate_file_path(path: str) -> bool:
@@ -202,6 +202,7 @@ async def execute_code(request: ExecutionRequest) -> ExecutionResponse:
) )
with tempfile.TemporaryDirectory() as tmp_dir: with tempfile.TemporaryDirectory() as tmp_dir:
print(tmp_dir)
bound_files = {} bound_files = {}
if request.files: if request.files:
async with aiohttp.ClientSession() as session: async with aiohttp.ClientSession() as session: