Merge remote-tracking branch 'origin/master'

This commit is contained in:
Timur
2025-03-03 12:15:31 +03:00
4 changed files with 39 additions and 20 deletions
+1 -1
View File
@@ -87,6 +87,7 @@ deploy:
stage: deploy stage: deploy
rules: rules:
- if: '$CI_COMMIT_REF_NAME == "master"' - if: '$CI_COMMIT_REF_NAME == "master"'
when: manual
variables: variables:
SSH_HOST: "158.160.172.23" SSH_HOST: "158.160.172.23"
SSH_USER: "ubuntu" SSH_USER: "ubuntu"
@@ -109,7 +110,6 @@ deploy:
cd ~/deploy cd ~/deploy
docker system prune -a --force docker system prune -a --force
docker compose pull > deploy.log 2>&1 docker compose pull > deploy.log 2>&1
docker compose down >> deploy.log 2>&1
docker compose up -d --remove-orphans --force-recreate >> deploy.log 2>&1 docker compose up -d --remove-orphans --force-recreate >> deploy.log 2>&1
docker compose ps >> deploy.log 2>&1 docker compose ps >> deploy.log 2>&1
EOF EOF
+11 -3
View File
@@ -38,9 +38,10 @@ class CompetitionTask(BaseModel):
null=True, null=True,
blank=True, blank=True,
verbose_name="файл с правильным ответом", verbose_name="файл с правильным ответом",
help_text="Имеет смысл только при автоматической (ввод ответа или кода) проверке.",
) )
points = models.IntegerField( points = models.IntegerField(
null=True, blank=True, verbose_name="баллы за задание" null=True, blank=True, verbose_name="общий балл за задание"
) )
# only when "checker" type # only when "checker" type
@@ -48,7 +49,10 @@ class CompetitionTask(BaseModel):
null=True, null=True,
blank=True, blank=True,
verbose_name="куда сделать вывод программы участнику", verbose_name="куда сделать вывод программы участнику",
help_text="Путь до файла в котором ожидается результат. Пример: stdout или ./output.txt", help_text=(
"Путь до файла в котором ожидается результат. "
"Пример: stdout или ./output.txt. Имеет смысл только при автоматическом типе проверки."
),
default="stdout", default="stdout",
) )
@@ -57,7 +61,11 @@ class CompetitionTask(BaseModel):
Reviewer, Reviewer,
blank=True, blank=True,
verbose_name="ревьюверы", verbose_name="ревьюверы",
help_text="Справа отображаются действующие проверяющие, слева - доступные для выбора. Для перемещения можно кликнуть 2 раза по проверяющему", help_text=(
"Справа отображаются действующие проверяющие, слева - доступные для выбора. "
"Для перемещения можно кликнуть 2 раза по проверяющему. Имеет смысл только"
" при ручном типе проверки."
),
) )
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="кол-во проверяющих для зачета задачи"
+21 -10
View File
@@ -2,27 +2,38 @@ 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
@shared_task(bind=True, max_retries=3) @shared_task(bind=True, max_retries=3)
def analyze_data_task(self, submission_id): def analyze_data_task(self, submission_id):
from .models import CompetitionTaskSubmission
submission = CompetitionTaskSubmission.objects.get(id=submission_id) submission = CompetitionTaskSubmission.objects.get(id=submission_id)
try: try:
code = submission.content.read().decode() code_url = (
f"{settings.MINIO_DEFAULT_CUSTOM_ENDPOINT_URL}{submission.path}"
)
files = [ files = [
(f.name, f.file.open("rb")) {
for f in submission.task.attachments.filter(public=True) "url": f"{settings.MINIO_DEFAULT_CUSTOM_ENDPOINT_URL}{attachment.path}",
"bind_path": attachment.bind_at,
}
for attachment in submission.task.attachments.filter(
bind_path__isnull=False
)
] ]
response = httpx.post( response = httpx.post(
f"{settings.CHECKER_API_ENDPOINT}/execute", f"{settings.CHECKER_API_ENDPOINT}/execute",
files=[("files", (f.name, f)) for f in files] json={
+ [ "files": files,
("code", code), "code_url": code_url,
("expected_hash", submission.task.correct_answer_hash), "answer_file_path": submission.task.answer_file_path,
], "expected_hash": hashlib.sha256(
submission.task.correct_answer_file.read().encode()
).hexdigest(),
},
timeout=30, timeout=30,
) )
response.raise_for_status() response.raise_for_status()
+6 -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: