添加submission status api

This commit is contained in:
zemal 2017-05-15 16:42:15 +08:00
parent ce7161552f
commit 099b48497b
3 changed files with 23 additions and 12 deletions

View File

@ -3,6 +3,7 @@ import requests
import hashlib
import logging
from urllib.parse import urljoin
from functools import reduce
from django.db import transaction
from django.db.models import F
@ -82,6 +83,8 @@ class JudgeDispatcher(object):
"test_case_id": self.problem_obj.test_case_id,
"output": output
}
self.submission_obj.result = JudgeStatus.JUDGING
self.submission_obj.save()
# TODO: try catch
resp = self._request(urljoin(server.service_url, "/judge"), data=data)
self.submission_obj.info = resp
@ -92,6 +95,7 @@ class JudgeDispatcher(object):
# 多个测试点全部正确AC否则ACM模式下取第一个测试点状态
if not error_test_case:
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:
self.submission_obj.result = error_test_case[0]["result"]
else:

View File

@ -1,3 +1,4 @@
from .models import Submission
from utils.api import serializers
from judge.languages import language_names
@ -6,3 +7,11 @@ class CreateSubmissionSerializer(serializers.Serializer):
problem_id = serializers.IntegerField()
language = serializers.ChoiceField(choices=language_names)
code = serializers.CharField(max_length=20000)
class SubmissionModelSerializer(serializers.ModelSerializer):
info = serializers.JSONField()
accepted_info = serializers.JSONField()
class Meta:
model = Submission

View File

@ -5,14 +5,15 @@ from account.decorators import login_required
from account.models import AdminType, User
from problem.models import Problem
from submission.tasks import judge_task
# from judge.dispatcher import JudgeDispatcher
from utils.api import APIView, validate_serializer
from utils.shortcuts import build_query_string
from utils.throttling import TokenBucket, BucketController
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: 预设默认值,需修改
controller = BucketController(user_id=user.id,
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,
language=language,
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)
return response.success({"submission_id": submission.id})
class SubmissionAPI(APIView):
@validate_serializer(CreateSubmissionSerializer)
# TODO: login
# @login_required
@login_required
def post(self, request):
data = request.data
return _submit(self, request.user, data["problem_id"], data["language"], data["code"])
@login_required
def get(self, request):
submission_id = request.GET.get("submission_id")
submission_id = request.GET.get("id")
if not submission_id:
return self.error("Parameter error")
try:
submission = Submission.objects.get(id=submission_id, user_id=request.user.id)
except Submission.DoesNotExist:
return self.error("Submission not exist")
response_data = {"result": submission.result}
if submission.result == 0:
response_data["accepted_answer_time"] = submission.accepted_answer_time
return self.success(response_data)
return self.success(SubmissionModelSerializer(submission).data)
class MyProblemSubmissionListAPI(APIView):