test_case download api

This commit is contained in:
zema1 2017-11-14 21:06:33 +08:00
parent ffd5943492
commit 4dc1e2687b
3 changed files with 31 additions and 6 deletions

View File

@ -11,7 +11,7 @@ from utils.api.tests import APITestCase
from .models import ProblemTag from .models import ProblemTag
from .models import Problem, ProblemRuleType from .models import Problem, ProblemRuleType
from .views.admin import TestCaseUploadAPI from .views.admin import TestCaseAPI
from contest.models import Contest from contest.models import Contest
from contest.tests import DEFAULT_CONTEST_DATA from contest.tests import DEFAULT_CONTEST_DATA
@ -75,8 +75,8 @@ class ProblemTagListAPITest(APITestCase):
class TestCaseUploadAPITest(APITestCase): class TestCaseUploadAPITest(APITestCase):
def setUp(self): def setUp(self):
self.api = TestCaseUploadAPI() self.api = TestCaseAPI()
self.url = self.reverse("test_case_upload_api") self.url = self.reverse("test_case_api")
self.create_super_admin() self.create_super_admin()
def test_filter_file_name(self): def test_filter_file_name(self):

View File

@ -1,9 +1,9 @@
from django.conf.urls import url from django.conf.urls import url
from ..views.admin import ContestProblemAPI, ProblemAPI, TestCaseUploadAPI, MakeContestProblemPublicAPIView from ..views.admin import ContestProblemAPI, ProblemAPI, TestCaseAPI, MakeContestProblemPublicAPIView
urlpatterns = [ urlpatterns = [
url(r"^test_case/upload/?$", TestCaseUploadAPI.as_view(), name="test_case_upload_api"), url(r"^test_case/?$", TestCaseAPI.as_view(), name="test_case_api"),
url(r"^problem/?$", ProblemAPI.as_view(), name="problem_admin_api"), 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/?$", ContestProblemAPI.as_view(), name="contest_problem_admin_api"),
url(r"^contest_problem/make_public/?$", MakeContestProblemPublicAPIView.as_view(), name="make_public_api"), url(r"^contest_problem/make_public/?$", MakeContestProblemPublicAPIView.as_view(), name="make_public_api"),

View File

@ -2,8 +2,10 @@ import hashlib
import json import json
import os import os
import zipfile import zipfile
from wsgiref.util import FileWrapper
from django.conf import settings from django.conf import settings
from django.http import StreamingHttpResponse
from account.decorators import problem_permission_required from account.decorators import problem_permission_required
from contest.models import Contest from contest.models import Contest
@ -16,7 +18,7 @@ from ..serializers import (CreateContestProblemSerializer, ContestProblemAdminSe
ProblemAdminSerializer, TestCaseUploadForm, ContestProblemMakePublicSerializer) ProblemAdminSerializer, TestCaseUploadForm, ContestProblemMakePublicSerializer)
class TestCaseUploadAPI(CSRFExemptAPIView): class TestCaseAPI(CSRFExemptAPIView):
request_parsers = () request_parsers = ()
def filter_name_list(self, name_list, spj): def filter_name_list(self, name_list, spj):
@ -43,6 +45,29 @@ class TestCaseUploadAPI(CSRFExemptAPIView):
else: else:
return sorted(ret, key=natural_sort_key) return sorted(ret, key=natural_sort_key)
@problem_permission_required
def get(self, request):
problem_id = request.GET.get("problem_id")
if not problem_id:
return self.error("Parameter error, problem_id is required")
try:
problem = Problem.objects.get(id=problem_id)
except Problem.DoesNotExist:
return self.error("Problem does not exists")
test_case_dir = os.path.join(settings.TEST_CASE_DIR, problem.test_case_id)
if not os.path.isdir(test_case_dir):
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)
with zipfile.ZipFile(file_name, "w") as file:
for test_case in name_list:
file.write(f"{test_case_dir}/{test_case}", test_case)
response = StreamingHttpResponse(FileWrapper(open(file_name, "rb")), content_type="application/zip")
response["Content-Disposition"] = f"attachment; filename=problem_{problem.id}_test_cases.zip"
return response
@problem_permission_required @problem_permission_required
def post(self, request): def post(self, request):
form = TestCaseUploadForm(request.POST, request.FILES) form = TestCaseUploadForm(request.POST, request.FILES)