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