mirror of
https://gitlab.com/megazordpobeda/DataRush.git
synced 2026-05-22 23:17:09 +00:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
+1
-1
@@ -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
|
||||
|
||||
@@ -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="кол-во проверяющих для зачета задачи"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user