添加SPJ编译API
This commit is contained in:
20
problem/migrations/0010_problem_spj_compile_ok.py
Normal file
20
problem/migrations/0010_problem_spj_compile_ok.py
Normal file
@@ -0,0 +1,20 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11.4 on 2017-11-16 12:42
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('problem', '0009_auto_20171011_1214'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='problem',
|
||||
name='spj_compile_ok',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
]
|
||||
@@ -56,6 +56,7 @@ class Problem(models.Model):
|
||||
spj_language = models.CharField(max_length=32, blank=True, null=True)
|
||||
spj_code = models.TextField(blank=True, null=True)
|
||||
spj_version = models.CharField(max_length=32, blank=True, null=True)
|
||||
spj_compile_ok = models.BooleanField(default=False)
|
||||
rule_type = models.CharField(max_length=32)
|
||||
visible = models.BooleanField(default=True)
|
||||
difficulty = models.CharField(max_length=32)
|
||||
|
||||
@@ -79,6 +79,12 @@ class TagSerializer(serializers.ModelSerializer):
|
||||
fields = "__all__"
|
||||
|
||||
|
||||
class CompileSPJSerializer(serializers.Serializer):
|
||||
id = serializers.IntegerField()
|
||||
spj_language = serializers.ChoiceField(choices=spj_language_names)
|
||||
spj_code = serializers.CharField()
|
||||
|
||||
|
||||
class BaseProblemSerializer(serializers.ModelSerializer):
|
||||
samples = serializers.JSONField()
|
||||
test_case_score = serializers.JSONField()
|
||||
@@ -125,3 +131,5 @@ class ContestProblemSafeSerializer(BaseProblemSerializer):
|
||||
class ContestProblemMakePublicSerializer(serializers.Serializer):
|
||||
id = serializers.IntegerField()
|
||||
display_id = serializers.CharField(max_length=32)
|
||||
|
||||
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
from django.conf.urls import url
|
||||
|
||||
from ..views.admin import ContestProblemAPI, ProblemAPI, TestCaseAPI, MakeContestProblemPublicAPIView
|
||||
from ..views.admin import CompileSPJAPI
|
||||
|
||||
urlpatterns = [
|
||||
url(r"^test_case/?$", TestCaseAPI.as_view(), name="test_case_api"),
|
||||
url(r"^compile_spj/?$", CompileSPJAPI.as_view(), name="compile_spj"),
|
||||
url(r"^problem/?$", ProblemAPI.as_view(), name="problem_admin_api"),
|
||||
url(r"^contest/problem/?$", ContestProblemAPI.as_view(), name="contest_problem_admin_api"),
|
||||
url(r"^contest_problem/make_public/?$", MakeContestProblemPublicAPIView.as_view(), name="make_public_api"),
|
||||
|
||||
@@ -8,12 +8,13 @@ from django.conf import settings
|
||||
from django.http import StreamingHttpResponse
|
||||
|
||||
from account.decorators import problem_permission_required
|
||||
from judge.dispatcher import SPJCompiler
|
||||
from contest.models import Contest
|
||||
from utils.api import APIView, CSRFExemptAPIView, validate_serializer
|
||||
from utils.shortcuts import rand_str, natural_sort_key
|
||||
|
||||
from ..models import Problem, ProblemRuleType, ProblemTag
|
||||
from ..serializers import (CreateContestProblemSerializer, ContestProblemAdminSerializer,
|
||||
from ..serializers import (CreateContestProblemSerializer, ContestProblemAdminSerializer, CompileSPJSerializer,
|
||||
CreateProblemSerializer, EditProblemSerializer, EditContestProblemSerializer,
|
||||
ProblemAdminSerializer, TestCaseUploadForm, ContestProblemMakePublicSerializer)
|
||||
|
||||
@@ -60,7 +61,7 @@ class TestCaseAPI(CSRFExemptAPIView):
|
||||
return self.error("Test case does not exists")
|
||||
name_list = self.filter_name_list(os.listdir(test_case_dir), problem.spj)
|
||||
name_list.append("info")
|
||||
file_name = os.path.join(test_case_dir, problem.test_case_id)
|
||||
file_name = os.path.join(test_case_dir, problem.test_case_id + ".zip")
|
||||
with zipfile.ZipFile(file_name, "w") as file:
|
||||
for test_case in name_list:
|
||||
file.write(f"{test_case_dir}/{test_case}", test_case)
|
||||
@@ -134,6 +135,31 @@ class TestCaseAPI(CSRFExemptAPIView):
|
||||
return self.success({"id": test_case_id, "info": ret, "hint": hint, "spj": spj})
|
||||
|
||||
|
||||
class CompileSPJAPI(APIView):
|
||||
@validate_serializer(CompileSPJSerializer)
|
||||
@problem_permission_required
|
||||
def post(self, request):
|
||||
data = request.data
|
||||
try:
|
||||
problem = Problem.objects.get(pk=data["id"])
|
||||
except Problem.DoesNotExist:
|
||||
return self.error("Problem does not exist")
|
||||
spj_version = rand_str(8)
|
||||
problem.spj = True
|
||||
problem.spj_version = spj_version
|
||||
problem.spj_language = data["spj_language"]
|
||||
problem.spj_code = data["spj_code"]
|
||||
error = SPJCompiler(data["spj_code"], spj_version, data["spj_language"]).compile_spj()
|
||||
if error:
|
||||
problem.spj_compile_ok = False
|
||||
problem.save()
|
||||
return self.error(error)
|
||||
else:
|
||||
problem.spj_compile_ok = True
|
||||
problem.save()
|
||||
return self.success()
|
||||
|
||||
|
||||
class ProblemBase(APIView):
|
||||
def common_checks(self, request):
|
||||
data = request.data
|
||||
|
||||
Reference in New Issue
Block a user