diff --git a/oj/urls.py b/oj/urls.py index fea74415..bef0ace8 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -20,7 +20,7 @@ from group.views import (GroupAdminAPIView, GroupMemberAdminAPIView, from admin.views import AdminTemplateView -from problem.views import TestCaseUploadAPIView, ProblemTagAdminAPIView, ProblemAdminAPIView +from problem.views import TestCaseUploadAPIView, ProblemTagAdminAPIView, ProblemAdminAPIView, OpenAPIProblemAPI from submission.views import (SubmissionAPIView, SubmissionAdminAPIView, ContestSubmissionAPIView, SubmissionShareAPIView, SubmissionRejudgeAdminAPIView) from judge_dispatcher.views import AdminJudgeServerAPIView @@ -92,6 +92,8 @@ urlpatterns = [ url(r'^contests/$', "contest.views.contest_list_page", name="contest_list_page"), url(r'^contests/(?P\d+)/$', "contest.views.contest_list_page", name="contest_list_page"), + url(r'^api/open/problem/$', OpenAPIProblemAPI.as_view(), name="openapi_problem_api"), + url(r'^problem/(?P\d+)/$', "problem.views.problem_page", name="problem_page"), url(r'^problems/$', "problem.views.problem_list_page", name="problem_list_page"), url(r'^problems/(?P\d+)/$', "problem.views.problem_list_page", name="problem_list_page"), diff --git a/problem/serizalizers.py b/problem/serizalizers.py index 0865b8f7..b29c0d30 100644 --- a/problem/serizalizers.py +++ b/problem/serizalizers.py @@ -39,7 +39,7 @@ class ProblemTagSerializer(serializers.ModelSerializer): model = ProblemTag -class ProblemSerializer(serializers.ModelSerializer): +class BaseProblemSerializer(serializers.ModelSerializer): samples = JSONField() tags = ProblemTagSerializer(many=True) @@ -50,10 +50,19 @@ class ProblemSerializer(serializers.ModelSerializer): created_by = UserSerializer() + +class ProblemSerializer(BaseProblemSerializer): class Meta: model = Problem +class OpenAPIProblemSerializer(BaseProblemSerializer): + + class Meta: + model = Problem + exclude = ["visible", "test_case_id"] + + class EditProblemSerializer(serializers.Serializer): id = serializers.IntegerField() title = serializers.CharField(max_length=50) diff --git a/problem/views.py b/problem/views.py index 6e2d391a..90e1450b 100644 --- a/problem/views.py +++ b/problem/views.py @@ -13,12 +13,12 @@ from django.utils.timezone import now from django.conf import settings from rest_framework.views import APIView -from account.models import SUPER_ADMIN +from account.models import SUPER_ADMIN, User from account.decorators import super_admin_required from utils.shortcuts import (serializer_invalid_response, error_response, success_response, paginate, rand_str, error_page) from .serizalizers import (CreateProblemSerializer, EditProblemSerializer, ProblemSerializer, - ProblemTagSerializer) + ProblemTagSerializer, OpenAPIProblemSerializer) from .models import Problem, ProblemTag from .decorators import check_user_problem_permission @@ -36,6 +36,26 @@ def problem_page(request, problem_id): return render(request, "oj/problem/problem.html", {"problem": problem, "samples": json.loads(problem.samples)}) +class OpenAPIProblemAPI(APIView): + def get(sell, request): + """ + openapi 获取题目内容 + """ + problem_id = request.GET.get("problem_id", None) + appkey = request.GET.get("appkey", None) + if not (problem_id and appkey): + return error_response(u"参数错误") + try: + User.objects.get(openapi_appkey=appkey) + except User.DoesNotExist: + return error_response(u"appkey无效") + try: + problem = Problem.objects.get(id=problem_id, visible=True) + except Problem.DoesNotExist: + return error_page(request, u"题目不存在") + return success_response(OpenAPIProblemSerializer(problem).data) + + class ProblemTagAdminAPIView(APIView): """ 获取所有标签的列表