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
rules:
- if: '$CI_COMMIT_REF_NAME == "master"'
when: manual
variables:
SSH_HOST: "158.160.172.23"
SSH_USER: "ubuntu"
@@ -109,7 +110,6 @@ deploy:
cd ~/deploy
docker system prune -a --force
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 ps >> deploy.log 2>&1
EOF
+11 -3
View File
@@ -38,9 +38,10 @@ class CompetitionTask(BaseModel):
null=True,
blank=True,
verbose_name="файл с правильным ответом",
help_text="Имеет смысл только при автоматической (ввод ответа или кода) проверке.",
)
points = models.IntegerField(
null=True, blank=True, verbose_name="баллы за задание"
null=True, blank=True, verbose_name="общий балл за задание"
)
# only when "checker" type
@@ -48,7 +49,10 @@ class CompetitionTask(BaseModel):
null=True,
blank=True,
verbose_name="куда сделать вывод программы участнику",
help_text="Путь до файла в котором ожидается результат. Пример: stdout или ./output.txt",
help_text=(
"Путь до файла в котором ожидается результат. "
"Пример: stdout или ./output.txt. Имеет смысл только при автоматическом типе проверки."
),
default="stdout",
)
@@ -57,7 +61,11 @@ class CompetitionTask(BaseModel):
Reviewer,
blank=True,
verbose_name="ревьюверы",
help_text="Справа отображаются действующие проверяющие, слева - доступные для выбора. Для перемещения можно кликнуть 2 раза по проверяющему",
help_text=(
"Справа отображаются действующие проверяющие, слева - доступные для выбора. "
"Для перемещения можно кликнуть 2 раза по проверяющему. Имеет смысл только"
" при ручном типе проверки."
),
)
submission_reviewers_count = models.PositiveSmallIntegerField(
default=1, null=True, blank=True, verbose_name="кол-во проверяющих для зачета задачи"
+21 -10
View File
@@ -2,27 +2,38 @@ 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
@shared_task(bind=True, max_retries=3)
def analyze_data_task(self, submission_id):
from .models import CompetitionTaskSubmission
submission = CompetitionTaskSubmission.objects.get(id=submission_id)
try:
code = submission.content.read().decode()
code_url = (
f"{settings.MINIO_DEFAULT_CUSTOM_ENDPOINT_URL}{submission.path}"
)
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(
f"{settings.CHECKER_API_ENDPOINT}/execute",
files=[("files", (f.name, f)) for f in files]
+ [
("code", code),
("expected_hash", submission.task.correct_answer_hash),
],
json={
"files": files,
"code_url": code_url,
"answer_file_path": submission.task.answer_file_path,
"expected_hash": hashlib.sha256(
submission.task.correct_answer_file.read().encode()
).hexdigest(),
},
timeout=30,
)
response.raise_for_status()
+6 -6
View File
@@ -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: