Files
DataRush/services/backend/apps/task/tasks.py
T
2025-03-02 23:28:14 +03:00

51 lines
1.7 KiB
Python

import httpx
from celery import shared_task
from django.core.files.base import ContentFile
from django.conf import settings
@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()
files = [
(f.name, f.file.open("rb"))
for f in submission.task.attachments.filter(public=True)
]
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),
],
timeout=30,
)
response.raise_for_status()
result = response.json()
submission.stdout.save("output.txt", ContentFile(result["output"]))
submission.result = {
"correct": result["hash_match"],
"result_hash": result["result_hash"],
"error": result.get("error"),
}
submission.earned_points = (
submission.task.points if result["hash_match"] else 0
)
submission.status = CompetitionTaskSubmission.StatusChoices.CHECKED
except httpx.RequestError as e:
self.retry(countdown=2**self.request.retries)
except Exception as e:
submission.result = {"error": str(e), "success": False}
submission.status = CompetitionTaskSubmission.StatusChoices.CHECKED
submission.earned_points = 0
finally:
submission.save()