add test case upload api
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
from django import forms
|
||||
|
||||
|
||||
class TestCaseUploadForm(forms.Form):
|
||||
spj = forms.BooleanField()
|
||||
file = forms.FileField()
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
from utils.api.tests import APITestCase
|
||||
|
||||
from .models import ProblemTag
|
||||
from .views.admin import TestCaseUploadAPI
|
||||
|
||||
|
||||
class ProblemTagListAPITest(APITestCase):
|
||||
@@ -10,3 +11,15 @@ class ProblemTagListAPITest(APITestCase):
|
||||
resp = self.client.get(self.reverse("problem_tag_list_api"))
|
||||
self.assertSuccess(resp)
|
||||
self.assertEqual(resp.data["data"], ["name1", "name2"])
|
||||
|
||||
|
||||
class TestCaseUploadAPITest(APITestCase):
|
||||
def setUp(self):
|
||||
self.api = TestCaseUploadAPI()
|
||||
|
||||
def test_filter_file_name(self):
|
||||
self.assertEqual(self.api.filter_name_list(["1.in", "1.out", "2.in", ".DS_Store"], spj=False), ["1.in", "1.out"])
|
||||
self.assertEqual(self.api.filter_name_list(["2.in", "2.out"], spj=False), [])
|
||||
|
||||
self.assertEqual(self.api.filter_name_list(["1.in", "1.out", "2.in"], spj=True), ["1.in", "2.in"])
|
||||
self.assertEqual(self.api.filter_name_list(["2.in", "3.in"], spj=True), [])
|
||||
|
||||
7
problem/urls/admin.py
Normal file
7
problem/urls/admin.py
Normal file
@@ -0,0 +1,7 @@
|
||||
from django.conf.urls import url
|
||||
|
||||
from ..views.admin import TestCaseUploadAPI
|
||||
|
||||
urlpatterns = [
|
||||
url(r"^test_case/upload$", TestCaseUploadAPI.as_view(), name="test_case_upload_api")
|
||||
]
|
||||
@@ -1,6 +1,6 @@
|
||||
from django.conf.urls import url
|
||||
|
||||
from ..views import ProblemTagAPI
|
||||
from ..views.oj import ProblemTagAPI
|
||||
|
||||
urlpatterns = [
|
||||
url(r"^tags$", ProblemTagAPI.as_view(), name="problem_tag_list_api")
|
||||
|
||||
0
problem/views/__init__.py
Normal file
0
problem/views/__init__.py
Normal file
68
problem/views/admin.py
Normal file
68
problem/views/admin.py
Normal file
@@ -0,0 +1,68 @@
|
||||
import os
|
||||
import zipfile
|
||||
|
||||
from django.conf import settings
|
||||
|
||||
from utils.api import CSRFExemptAPIView
|
||||
from account.decorators import admin_required
|
||||
from utils.shortcuts import rand_str
|
||||
|
||||
from ..serializers import TestCaseUploadForm
|
||||
|
||||
|
||||
class TestCaseUploadAPI(CSRFExemptAPIView):
|
||||
request_parsers = ()
|
||||
|
||||
def filter_name_list(self, name_list, spj):
|
||||
ret = []
|
||||
prefix = 1
|
||||
if spj:
|
||||
while True:
|
||||
in_name = str(prefix) + ".in"
|
||||
if in_name in name_list:
|
||||
ret.append(in_name)
|
||||
prefix += 1
|
||||
continue
|
||||
else:
|
||||
return sorted(ret)
|
||||
else:
|
||||
while True:
|
||||
in_name = str(prefix) + ".in"
|
||||
out_name = str(prefix) + ".out"
|
||||
if in_name in name_list and out_name in name_list:
|
||||
ret.append(in_name)
|
||||
ret.append(out_name)
|
||||
prefix += 1
|
||||
continue
|
||||
else:
|
||||
return sorted(ret)
|
||||
|
||||
@admin_required
|
||||
def post(self, request):
|
||||
form = TestCaseUploadForm(request.POST, request.FILES)
|
||||
if form.is_valid():
|
||||
spj = form.cleaned_data["spj"]
|
||||
file = form.cleaned_data["file"]
|
||||
else:
|
||||
return self.error("Upload failed")
|
||||
tmp_file = os.path.join("/tmp", rand_str() + ".zip")
|
||||
with open(tmp_file, "wb") as f:
|
||||
for chunk in file:
|
||||
f.write(chunk)
|
||||
try:
|
||||
zip_file = zipfile.ZipFile(tmp_file)
|
||||
except zipfile.BadZipfile:
|
||||
return self.error("Bad zip file")
|
||||
name_list = zip_file.namelist()
|
||||
test_case_list = self.filter_name_list(name_list, spj=spj)
|
||||
if not test_case_list:
|
||||
return self.error("Empty file")
|
||||
|
||||
test_case_id = rand_str()
|
||||
test_case_dir = os.path.join(settings.TEST_CASE_DIR, test_case_id)
|
||||
os.mkdir(test_case_dir)
|
||||
|
||||
for item in test_case_list:
|
||||
with open(os.path.join(test_case_dir, item), "wb") as f:
|
||||
f.write(zip_file.read(item).replace(b"\r\n", b"\n"))
|
||||
return self.success(test_case_list)
|
||||
@@ -1,6 +1,6 @@
|
||||
from utils.api import APIView
|
||||
|
||||
from .models import ProblemTag
|
||||
from ..models import ProblemTag
|
||||
|
||||
|
||||
class ProblemTagAPI(APIView):
|
||||
Reference in New Issue
Block a user