mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2025-11-04 14:49:58 +08:00
添加submission status api
This commit is contained in:
parent
ce7161552f
commit
099b48497b
@ -3,6 +3,7 @@ import requests
|
|||||||
import hashlib
|
import hashlib
|
||||||
import logging
|
import logging
|
||||||
from urllib.parse import urljoin
|
from urllib.parse import urljoin
|
||||||
|
from functools import reduce
|
||||||
|
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
from django.db.models import F
|
from django.db.models import F
|
||||||
@ -82,6 +83,8 @@ class JudgeDispatcher(object):
|
|||||||
"test_case_id": self.problem_obj.test_case_id,
|
"test_case_id": self.problem_obj.test_case_id,
|
||||||
"output": output
|
"output": output
|
||||||
}
|
}
|
||||||
|
self.submission_obj.result = JudgeStatus.JUDGING
|
||||||
|
self.submission_obj.save()
|
||||||
# TODO: try catch
|
# TODO: try catch
|
||||||
resp = self._request(urljoin(server.service_url, "/judge"), data=data)
|
resp = self._request(urljoin(server.service_url, "/judge"), data=data)
|
||||||
self.submission_obj.info = resp
|
self.submission_obj.info = resp
|
||||||
@ -92,6 +95,7 @@ class JudgeDispatcher(object):
|
|||||||
# 多个测试点全部正确AC,否则ACM模式下取第一个测试点状态
|
# 多个测试点全部正确AC,否则ACM模式下取第一个测试点状态
|
||||||
if not error_test_case:
|
if not error_test_case:
|
||||||
self.submission_obj.result = JudgeStatus.ACCEPTED
|
self.submission_obj.result = JudgeStatus.ACCEPTED
|
||||||
|
self.submission_obj.accepted_time = reduce(lambda x, y: x + y["cpu_time"], resp["data"], 0)
|
||||||
elif self.problem_obj.rule_type == ProblemRuleType.ACM:
|
elif self.problem_obj.rule_type == ProblemRuleType.ACM:
|
||||||
self.submission_obj.result = error_test_case[0]["result"]
|
self.submission_obj.result = error_test_case[0]["result"]
|
||||||
else:
|
else:
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
from .models import Submission
|
||||||
from utils.api import serializers
|
from utils.api import serializers
|
||||||
from judge.languages import language_names
|
from judge.languages import language_names
|
||||||
|
|
||||||
@ -6,3 +7,11 @@ class CreateSubmissionSerializer(serializers.Serializer):
|
|||||||
problem_id = serializers.IntegerField()
|
problem_id = serializers.IntegerField()
|
||||||
language = serializers.ChoiceField(choices=language_names)
|
language = serializers.ChoiceField(choices=language_names)
|
||||||
code = serializers.CharField(max_length=20000)
|
code = serializers.CharField(max_length=20000)
|
||||||
|
|
||||||
|
|
||||||
|
class SubmissionModelSerializer(serializers.ModelSerializer):
|
||||||
|
info = serializers.JSONField()
|
||||||
|
accepted_info = serializers.JSONField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Submission
|
||||||
|
|||||||
@ -5,14 +5,15 @@ from account.decorators import login_required
|
|||||||
from account.models import AdminType, User
|
from account.models import AdminType, User
|
||||||
from problem.models import Problem
|
from problem.models import Problem
|
||||||
from submission.tasks import judge_task
|
from submission.tasks import judge_task
|
||||||
|
# from judge.dispatcher import JudgeDispatcher
|
||||||
from utils.api import APIView, validate_serializer
|
from utils.api import APIView, validate_serializer
|
||||||
from utils.shortcuts import build_query_string
|
from utils.shortcuts import build_query_string
|
||||||
from utils.throttling import TokenBucket, BucketController
|
from utils.throttling import TokenBucket, BucketController
|
||||||
from ..models import Submission, JudgeStatus
|
from ..models import Submission, JudgeStatus
|
||||||
from ..serializers import CreateSubmissionSerializer
|
from ..serializers import CreateSubmissionSerializer, SubmissionModelSerializer
|
||||||
|
|
||||||
|
|
||||||
def _submit(response, user, problem_id, language, code):
|
def _submit(response, user, problem_id, language, code, contest_id=None):
|
||||||
# TODO: 预设默认值,需修改
|
# TODO: 预设默认值,需修改
|
||||||
controller = BucketController(user_id=user.id,
|
controller = BucketController(user_id=user.id,
|
||||||
redis_conn=get_redis_connection("Throttling"),
|
redis_conn=get_redis_connection("Throttling"),
|
||||||
@ -34,34 +35,31 @@ def _submit(response, user, problem_id, language, code):
|
|||||||
submission = Submission.objects.create(user_id=user.id,
|
submission = Submission.objects.create(user_id=user.id,
|
||||||
language=language,
|
language=language,
|
||||||
code=code,
|
code=code,
|
||||||
problem_id=problem.id)
|
problem_id=problem.id,
|
||||||
|
contest_id=contest_id)
|
||||||
|
# 暂时保留 方便排错
|
||||||
|
# JudgeDispatcher(submission.id, problem.id).judge()
|
||||||
judge_task.delay(submission.id, problem.id)
|
judge_task.delay(submission.id, problem.id)
|
||||||
return response.success({"submission_id": submission.id})
|
return response.success({"submission_id": submission.id})
|
||||||
|
|
||||||
|
|
||||||
class SubmissionAPI(APIView):
|
class SubmissionAPI(APIView):
|
||||||
@validate_serializer(CreateSubmissionSerializer)
|
@validate_serializer(CreateSubmissionSerializer)
|
||||||
# TODO: login
|
@login_required
|
||||||
# @login_required
|
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
data = request.data
|
data = request.data
|
||||||
return _submit(self, request.user, data["problem_id"], data["language"], data["code"])
|
return _submit(self, request.user, data["problem_id"], data["language"], data["code"])
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
submission_id = request.GET.get("submission_id")
|
submission_id = request.GET.get("id")
|
||||||
if not submission_id:
|
if not submission_id:
|
||||||
return self.error("Parameter error")
|
return self.error("Parameter error")
|
||||||
try:
|
try:
|
||||||
submission = Submission.objects.get(id=submission_id, user_id=request.user.id)
|
submission = Submission.objects.get(id=submission_id, user_id=request.user.id)
|
||||||
except Submission.DoesNotExist:
|
except Submission.DoesNotExist:
|
||||||
return self.error("Submission not exist")
|
return self.error("Submission not exist")
|
||||||
|
return self.success(SubmissionModelSerializer(submission).data)
|
||||||
response_data = {"result": submission.result}
|
|
||||||
if submission.result == 0:
|
|
||||||
response_data["accepted_answer_time"] = submission.accepted_answer_time
|
|
||||||
return self.success(response_data)
|
|
||||||
|
|
||||||
|
|
||||||
class MyProblemSubmissionListAPI(APIView):
|
class MyProblemSubmissionListAPI(APIView):
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user