74 lines
2.9 KiB
Python
74 lines
2.9 KiB
Python
from os.path import join
|
|
from tempfile import TemporaryDirectory
|
|
from zipfile import ZipFile
|
|
|
|
from django.core.exceptions import ObjectDoesNotExist
|
|
from django.http import JsonResponse, HttpResponse
|
|
|
|
from django.utils import timezone
|
|
|
|
from Checker.models import Checker, generate_token
|
|
from FileStorage.sync import synchronized_method
|
|
from Main.models import Solution, SolutionFile, ExtraFile
|
|
|
|
|
|
def get_dynamic(request):
|
|
try:
|
|
checker = Checker.objects.get(token=request.GET['token'])
|
|
if checker.status == 'Active':
|
|
return JsonResponse({"status": "Another checker is working"}, status=403)
|
|
checker.dynamic_token = generate_token()
|
|
checker.save()
|
|
return JsonResponse({"token": checker.dynamic_token})
|
|
except ObjectDoesNotExist:
|
|
return JsonResponse({"status": "incorrect token"}, status=403)
|
|
|
|
|
|
def status(request):
|
|
try:
|
|
checker = Checker.objects.get(dynamic_token=request.GET['token'])
|
|
now = timezone.now()
|
|
checker.last_request = now
|
|
checker.save()
|
|
return JsonResponse({"status": "ok"})
|
|
except ObjectDoesNotExist:
|
|
return JsonResponse({"status": "incorrect token"}, status=403)
|
|
|
|
|
|
@synchronized_method
|
|
def available(request):
|
|
try:
|
|
checker = Checker.objects.get(dynamic_token=request.GET['token'])
|
|
solution = Solution.objects.filter(set=checker.set, result="In queue").order_by('time_sent').first()
|
|
if solution is None:
|
|
return JsonResponse({"id": None})
|
|
solution.result = "Testing"
|
|
solution.save()
|
|
with TemporaryDirectory() as tempdir:
|
|
with ZipFile(join(tempdir, "package.zip"), 'w') as zip_file:
|
|
for sf in SolutionFile.objects.filter(solution=solution):
|
|
zip_file.writestr(sf.path, sf.bytes)
|
|
for ef in ExtraFile.objects.filter(task=solution.task):
|
|
zip_file.writestr(ef.filename, ef.bytes)
|
|
response = HttpResponse(open(join(tempdir, 'package.zip'), 'rb').read(), content_type='application/octet-stream', status=201)
|
|
response.headers['language_id'] = solution.language_id
|
|
response.headers['solution_id'] = solution.id
|
|
response.headers['timeout'] = solution.task.time_limit
|
|
return response
|
|
except ObjectDoesNotExist:
|
|
return JsonResponse({"status": "incorrect token"}, status=403)
|
|
|
|
|
|
def set_result(request):
|
|
try:
|
|
checker = Checker.objects.get(dynamic_token=request.GET['token'])
|
|
solution = Solution.objects.get(id=request.GET['solution_id'])
|
|
result = request.GET['result']
|
|
if checker.set != solution.set:
|
|
return JsonResponse({"status": "incorrect solution"}, status=403)
|
|
solution.result = result
|
|
solution.save()
|
|
return JsonResponse({"status": True})
|
|
except ObjectDoesNotExist:
|
|
return JsonResponse({"status": "incorrect token"}, status=403)
|