添加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 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:

View File

@ -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

View File

@ -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):