From 099b48497bf8f25ee67d24c98640245848eb6e40 Mon Sep 17 00:00:00 2001 From: zemal Date: Mon, 15 May 2017 16:42:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0submission=20status=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- judge/dispatcher.py | 4 ++++ submission/serializers.py | 9 +++++++++ submission/views/oj.py | 22 ++++++++++------------ 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/judge/dispatcher.py b/judge/dispatcher.py index d3aea08..594213b 100644 --- a/judge/dispatcher.py +++ b/judge/dispatcher.py @@ -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: diff --git a/submission/serializers.py b/submission/serializers.py index 32fe167..da43945 100644 --- a/submission/serializers.py +++ b/submission/serializers.py @@ -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 diff --git a/submission/views/oj.py b/submission/views/oj.py index 1d4d937..0f2f516 100644 --- a/submission/views/oj.py +++ b/submission/views/oj.py @@ -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):