diff --git a/services/backend/api/v1/user/schemas.py b/services/backend/api/v1/user/schemas.py index 2788913..2109f8e 100644 --- a/services/backend/api/v1/user/schemas.py +++ b/services/backend/api/v1/user/schemas.py @@ -32,7 +32,7 @@ class UserSchema(ModelSchema): class Meta: model = User - fields = ["id", "email", "username", "created_at"] + fields = ["id", "avatar", "email", "username", "created_at"] class StatSchema(Schema): diff --git a/services/backend/apps/task/admin.py b/services/backend/apps/task/admin.py index 10f3c67..0602752 100644 --- a/services/backend/apps/task/admin.py +++ b/services/backend/apps/task/admin.py @@ -3,8 +3,8 @@ from django.contrib import admin from apps.task.models import ( CompetitionTask, CompetitionTaskAttachment, + CompetitionTaskCriteria, CompetitionTaskSubmission, - CompetitionTaskCriteria ) @@ -23,7 +23,10 @@ class CompetitionTaskAdmin(admin.ModelAdmin): list_display = ("title", "type", "points") filter_horizontal = ("reviewers",) list_filter = ("type",) - inlines = (CompletionAttachmentInline, CompetitionCriteriaInline,) + inlines = ( + CompletionAttachmentInline, + CompetitionCriteriaInline, + ) @admin.register(CompetitionTaskSubmission) diff --git a/services/backend/apps/task/models.py b/services/backend/apps/task/models.py index 6f37ea4..8f6936e 100644 --- a/services/backend/apps/task/models.py +++ b/services/backend/apps/task/models.py @@ -22,12 +22,16 @@ class CompetitionTask(BaseModel): in_competition_position = models.PositiveSmallIntegerField( verbose_name="позиция в соревновании" ) - competition = models.ForeignKey(Competition, on_delete=models.CASCADE, - verbose_name="привязанное соревнование") + competition = models.ForeignKey( + Competition, + on_delete=models.CASCADE, + verbose_name="привязанное соревнование", + ) title = models.CharField(verbose_name="заголовок", max_length=50) description = MDTextField(verbose_name="описание") - max_attempts = models.PositiveSmallIntegerField(null=True, blank=True, - verbose_name="максимальное кол-во попыток") + max_attempts = models.PositiveSmallIntegerField( + null=True, blank=True, verbose_name="максимальное кол-во попыток" + ) type = models.CharField( choices=CompetitionTaskType, max_length=8, verbose_name="тип проверки" ) @@ -68,7 +72,10 @@ class CompetitionTask(BaseModel): ), ) submission_reviewers_count = models.PositiveSmallIntegerField( - default=1, null=True, blank=True, verbose_name="кол-во проверяющих для зачета задачи" + default=1, + null=True, + blank=True, + verbose_name="кол-во проверяющих для зачета задачи", ) def __str__(self): @@ -84,15 +91,9 @@ class CompetitionTaskCriteria(BaseModel): CompetitionTask, on_delete=models.CASCADE, related_name="criteries" ) - name = models.TextField( - verbose_name="название" - ) - slug = models.SlugField( - verbose_name="техническое название" - ) - description = models.TextField( - verbose_name="описание критерии" - ) + name = models.TextField(verbose_name="название") + slug = models.SlugField(verbose_name="техническое название") + description = models.TextField(verbose_name="описание критерии") max_value = models.PositiveSmallIntegerField( verbose_name="максимальное кол-во баллов" ) diff --git a/services/backend/apps/task/tasks.py b/services/backend/apps/task/tasks.py index f9598dd..bb909c2 100644 --- a/services/backend/apps/task/tasks.py +++ b/services/backend/apps/task/tasks.py @@ -1,8 +1,9 @@ +import hashlib + import httpx from celery import shared_task from django.conf import settings from django.core.files.base import ContentFile -import hashlib from apps.task.models import CompetitionTaskSubmission diff --git a/services/backend/apps/user/models.py b/services/backend/apps/user/models.py index 598abb6..e324bcb 100644 --- a/services/backend/apps/user/models.py +++ b/services/backend/apps/user/models.py @@ -11,11 +11,14 @@ class UserRole(models.TextChoices): class User(BaseModel): + avatar = models.ImageField(verbose_name="аватар") email = models.EmailField(unique=True, verbose_name="почта") username = models.SlugField(unique=True, 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( Achievement, blank=True, verbose_name="ачивки пользователя" @@ -29,8 +32,10 @@ class User(BaseModel): return check_password(self.password, password) status = models.CharField( - max_length=10, choices=UserRole.choices, default="student", - verbose_name="роль участника" + max_length=10, + choices=UserRole.choices, + default="student", + verbose_name="роль участника", ) def __str__(self) -> str: diff --git a/services/checker/main.py b/services/checker/main.py index 64107cc..557fdba 100644 --- a/services/checker/main.py +++ b/services/checker/main.py @@ -157,12 +157,12 @@ def run_container_safely( "stderr": f"Container error: {str(e)}", "status": -1, } - # finally: - # if container: - # try: - # container.remove(force=True) - # except docker.errors.DockerException: - # pass + finally: + if container: + try: + container.remove(force=True) + except docker.errors.DockerException: + pass def validate_file_path(path: str) -> bool: @@ -202,6 +202,7 @@ async def execute_code(request: ExecutionRequest) -> ExecutionResponse: ) with tempfile.TemporaryDirectory() as tmp_dir: + print(tmp_dir) bound_files = {} if request.files: async with aiohttp.ClientSession() as session: