增加创建提交的OpenAPI

This commit is contained in:
virusdefender 2016-02-17 18:58:12 +08:00
parent 823c6be0e1
commit b4d31ed79b
3 changed files with 58 additions and 31 deletions

View File

@ -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<problem_id>\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<submission_id>\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<page>\d+)/$', "submission.views.my_submission_list_page", name="my_submission_list_page"),

View File

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

View File

@ -20,20 +20,13 @@ from .tasks import _judge
from .models import Submission
from .serializers import (CreateSubmissionSerializer, SubmissionSerializer,
SubmissionhareSerializer, SubmissionRejudgeSerializer,
CreateContestSubmissionSerializer)
CreateContestSubmissionSerializer, OpenAPICreateSubmissionSerializer)
logger = logging.getLogger("app_info")
class SubmissionAPIView(APIView):
@login_required
def post(self, request):
"""
提交代码
---
request_serializer: CreateSubmissionSerializer
"""
controller = BucketController(user_id=request.user.id,
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"]),
@ -47,16 +40,13 @@ class SubmissionAPIView(APIView):
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"])
problem = Problem.objects.get(id=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"],
submission = Submission.objects.create(user_id=user.id,
language=language,
code=code,
problem_id=problem.id)
try:
@ -65,6 +55,34 @@ class SubmissionAPIView(APIView):
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):
"""
提交代码
---
request_serializer: CreateSubmissionSerializer
"""
serializer = CreateSubmissionSerializer(data=request.data)
if serializer.is_valid():
data = serializer.data
return _submit_code(request.user, data["problem_id"], data["language"], data["code"])
else:
return serializer_invalid_response(serializer)