增加创建提交的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 problem.views import TestCaseUploadAPIView, ProblemTagAdminAPIView, ProblemAdminAPIView, OpenAPIProblemAPI
from submission.views import (SubmissionAPIView, SubmissionAdminAPIView, ContestSubmissionAPIView, from submission.views import (SubmissionAPIView, SubmissionAdminAPIView, ContestSubmissionAPIView,
SubmissionShareAPIView, SubmissionRejudgeAdminAPIView) SubmissionShareAPIView, SubmissionRejudgeAdminAPIView, OpenAPISubmitCodeAPI)
from judge_dispatcher.views import AdminJudgeServerAPIView from judge_dispatcher.views import AdminJudgeServerAPIView
from utils.views import SimditorImageUploadAPIView 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", url(r'^problem/(?P<problem_id>\d+)/submissions/$', "submission.views.problem_my_submissions_list_page",
name="problem_my_submissions_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'^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/$', "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"), 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) 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): class SubmissionSerializer(serializers.ModelSerializer):
user = serializers.SerializerMethodField("_get_submission_user") user = serializers.SerializerMethodField("_get_submission_user")

View File

@@ -20,20 +20,13 @@ from .tasks import _judge
from .models import Submission from .models import Submission
from .serializers import (CreateSubmissionSerializer, SubmissionSerializer, from .serializers import (CreateSubmissionSerializer, SubmissionSerializer,
SubmissionhareSerializer, SubmissionRejudgeSerializer, SubmissionhareSerializer, SubmissionRejudgeSerializer,
CreateContestSubmissionSerializer) CreateContestSubmissionSerializer, OpenAPICreateSubmissionSerializer)
logger = logging.getLogger("app_info") logger = logging.getLogger("app_info")
class SubmissionAPIView(APIView): def _submit_code(user, problem_id, language, code):
@login_required controller = BucketController(user_id=user.id,
def post(self, request):
"""
提交代码
---
request_serializer: CreateSubmissionSerializer
"""
controller = BucketController(user_id=request.user.id,
redis_conn=redis.Redis(host=settings.REDIS_CACHE["host"], redis_conn=redis.Redis(host=settings.REDIS_CACHE["host"],
port=settings.REDIS_CACHE["port"], port=settings.REDIS_CACHE["port"],
db=settings.REDIS_CACHE["db"]), db=settings.REDIS_CACHE["db"]),
@@ -47,16 +40,13 @@ class SubmissionAPIView(APIView):
else: else:
return error_response(u"您提交的频率过快, 请等待%d" % int(bucket.expected_time() + 1)) return error_response(u"您提交的频率过快, 请等待%d" % int(bucket.expected_time() + 1))
serializer = CreateSubmissionSerializer(data=request.data)
if serializer.is_valid():
data = serializer.data
try: try:
problem = Problem.objects.get(id=data["problem_id"]) problem = Problem.objects.get(id=problem_id)
except Problem.DoesNotExist: except Problem.DoesNotExist:
return error_response(u"题目不存在") return error_response(u"题目不存在")
submission = Submission.objects.create(user_id=request.user.id, submission = Submission.objects.create(user_id=user.id,
language=int(data["language"]), language=language,
code=data["code"], code=code,
problem_id=problem.id) problem_id=problem.id)
try: try:
@@ -65,6 +55,34 @@ class SubmissionAPIView(APIView):
logger.error(e) logger.error(e)
return error_response(u"提交判题任务失败") return error_response(u"提交判题任务失败")
return success_response({"submission_id": submission.id}) 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: else:
return serializer_invalid_response(serializer) return serializer_invalid_response(serializer)