From b4d31ed79b7fb6d5020e369369587d0dc853f1bb Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Wed, 17 Feb 2016 18:58:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=9B=E5=BB=BA=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E7=9A=84OpenAPI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oj/urls.py | 4 +- submission/serializers.py | 7 ++++ submission/views.py | 78 ++++++++++++++++++++++++--------------- 3 files changed, 58 insertions(+), 31 deletions(-) diff --git a/oj/urls.py b/oj/urls.py index bef0ace8..f8625825 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -22,7 +22,7 @@ from admin.views import AdminTemplateView from problem.views import TestCaseUploadAPIView, ProblemTagAdminAPIView, ProblemAdminAPIView, OpenAPIProblemAPI from submission.views import (SubmissionAPIView, SubmissionAdminAPIView, ContestSubmissionAPIView, - SubmissionShareAPIView, SubmissionRejudgeAdminAPIView) + SubmissionShareAPIView, SubmissionRejudgeAdminAPIView, OpenAPISubmitCodeAPI) from judge_dispatcher.views import AdminJudgeServerAPIView from utils.views import SimditorImageUploadAPIView @@ -100,6 +100,8 @@ urlpatterns = [ url(r'^problem/(?P\d+)/submissions/$', "submission.views.problem_my_submissions_list_page", name="problem_my_submissions_page"), + url(r'^api/open/submission/$', OpenAPISubmitCodeAPI.as_view(), name="openapi_submit_code"), + url(r'^submission/(?P\w+)/$', "submission.views.my_submission", name="my_submission_page"), url(r'^submissions/$', "submission.views.my_submission_list_page", name="my_submission_list_page"), url(r'^submissions/(?P\d+)/$', "submission.views.my_submission_list_page", name="my_submission_list_page"), diff --git a/submission/serializers.py b/submission/serializers.py index a0bc1094..59fbc4a5 100644 --- a/submission/serializers.py +++ b/submission/serializers.py @@ -11,6 +11,13 @@ class CreateSubmissionSerializer(serializers.Serializer): code = serializers.CharField(max_length=20000) +class OpenAPICreateSubmissionSerializer(serializers.Serializer): + appkey = serializers.CharField(max_length=35) + problem_id = serializers.IntegerField() + language = serializers.IntegerField() + code = serializers.CharField(max_length=20000) + + class SubmissionSerializer(serializers.ModelSerializer): user = serializers.SerializerMethodField("_get_submission_user") diff --git a/submission/views.py b/submission/views.py index deb749da..6a0fa846 100644 --- a/submission/views.py +++ b/submission/views.py @@ -20,11 +20,57 @@ from .tasks import _judge from .models import Submission from .serializers import (CreateSubmissionSerializer, SubmissionSerializer, SubmissionhareSerializer, SubmissionRejudgeSerializer, - CreateContestSubmissionSerializer) + CreateContestSubmissionSerializer, OpenAPICreateSubmissionSerializer) logger = logging.getLogger("app_info") +def _submit_code(user, problem_id, language, code): + controller = BucketController(user_id=user.id, + redis_conn=redis.Redis(host=settings.REDIS_CACHE["host"], + port=settings.REDIS_CACHE["port"], + db=settings.REDIS_CACHE["db"]), + default_capacity=settings.TOKEN_BUCKET_DEFAULT_CAPACITY) + bucket = TokenBucket(fill_rate=settings.TOKEN_BUCKET_FILL_RATE, + capacity=settings.TOKEN_BUCKET_DEFAULT_CAPACITY, + last_capacity=controller.last_capacity, + last_timestamp=controller.last_timestamp) + if bucket.consume(): + controller.last_capacity -= 1 + else: + return error_response(u"您提交的频率过快, 请等待%d秒" % int(bucket.expected_time() + 1)) + + try: + problem = Problem.objects.get(id=problem_id) + except Problem.DoesNotExist: + return error_response(u"题目不存在") + submission = Submission.objects.create(user_id=user.id, + language=language, + code=code, + problem_id=problem.id) + + try: + _judge.delay(submission, problem.time_limit, problem.memory_limit, problem.test_case_id) + except Exception as e: + logger.error(e) + return error_response(u"提交判题任务失败") + return success_response({"submission_id": submission.id}) + + +class OpenAPISubmitCodeAPI(APIView): + def post(self, request): + serializer = OpenAPICreateSubmissionSerializer(data=request.data) + if serializer.is_valid(): + data = serializer.data + try: + user = User.objects.get(openapi_appkey=data["appkey"]) + except User.DoesNotExist: + return error_response(u"appkey无效") + return _submit_code(user, data["problem_id"], data["language"], data["code"]) + else: + return serializer_invalid_response(serializer) + + class SubmissionAPIView(APIView): @login_required def post(self, request): @@ -33,38 +79,10 @@ class SubmissionAPIView(APIView): --- request_serializer: CreateSubmissionSerializer """ - controller = BucketController(user_id=request.user.id, - redis_conn=redis.Redis(host=settings.REDIS_CACHE["host"], - port=settings.REDIS_CACHE["port"], - db=settings.REDIS_CACHE["db"]), - default_capacity=settings.TOKEN_BUCKET_DEFAULT_CAPACITY) - bucket = TokenBucket(fill_rate=settings.TOKEN_BUCKET_FILL_RATE, - capacity=settings.TOKEN_BUCKET_DEFAULT_CAPACITY, - last_capacity=controller.last_capacity, - last_timestamp=controller.last_timestamp) - if bucket.consume(): - controller.last_capacity -= 1 - else: - return error_response(u"您提交的频率过快, 请等待%d秒" % int(bucket.expected_time() + 1)) - serializer = CreateSubmissionSerializer(data=request.data) if serializer.is_valid(): data = serializer.data - try: - problem = Problem.objects.get(id=data["problem_id"]) - except Problem.DoesNotExist: - return error_response(u"题目不存在") - submission = Submission.objects.create(user_id=request.user.id, - language=int(data["language"]), - code=data["code"], - problem_id=problem.id) - - try: - _judge.delay(submission, problem.time_limit, problem.memory_limit, problem.test_case_id) - except Exception as e: - logger.error(e) - return error_response(u"提交判题任务失败") - return success_response({"submission_id": submission.id}) + return _submit_code(request.user, data["problem_id"], data["language"], data["code"]) else: return serializer_invalid_response(serializer)