2015-08-02 00:50:19 +00:00
|
|
|
|
# coding=utf-8
|
2015-08-10 04:25:35 +00:00
|
|
|
|
import zipfile
|
|
|
|
|
import re
|
2015-08-10 05:53:03 +00:00
|
|
|
|
import os
|
|
|
|
|
|
2015-06-26 07:59:53 +00:00
|
|
|
|
from django.shortcuts import render
|
2015-08-10 04:25:35 +00:00
|
|
|
|
|
|
|
|
|
from rest_framework.views import APIView
|
|
|
|
|
|
|
|
|
|
from utils.shortcuts import rand_str, error_response, success_response
|
2015-06-26 07:59:53 +00:00
|
|
|
|
|
2015-08-02 00:50:19 +00:00
|
|
|
|
|
|
|
|
|
def problem_page(request, problem_id):
|
|
|
|
|
# todo
|
2015-08-02 01:59:13 +00:00
|
|
|
|
return render(request, "oj/problem/problem.html")
|
2015-08-10 04:25:35 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestCaseUploadAPIView(APIView):
|
|
|
|
|
def _is_legal_test_case_file_name(self, file_name):
|
|
|
|
|
# 正整数开头的 .in 或者.out 结尾的
|
|
|
|
|
regex = r"^[1-9]\d*\.(in|out)$"
|
|
|
|
|
return re.compile(regex).match(file_name) is not None
|
|
|
|
|
|
|
|
|
|
def post(self, request):
|
2015-08-10 05:53:03 +00:00
|
|
|
|
if "file" not in request.FILES:
|
|
|
|
|
return error_response(u"文件上传失败")
|
|
|
|
|
|
2015-08-10 04:25:35 +00:00
|
|
|
|
f = request.FILES["file"]
|
|
|
|
|
|
|
|
|
|
tmp_zip = "tmp/" + rand_str() + ".zip"
|
2015-08-10 05:53:03 +00:00
|
|
|
|
with open(tmp_zip, "wb") as test_case_zip:
|
2015-08-10 04:25:35 +00:00
|
|
|
|
for chunk in f:
|
|
|
|
|
test_case_zip.write(chunk)
|
|
|
|
|
|
|
|
|
|
test_case_file = zipfile.ZipFile(tmp_zip, 'r')
|
|
|
|
|
name_list = test_case_file.namelist()
|
|
|
|
|
|
|
|
|
|
l = []
|
|
|
|
|
|
|
|
|
|
# 如果文件是直接打包的,那么name_list 就是["1.in", "1.out"]这样的
|
|
|
|
|
# 如果文件还有一层文件夹test_case,那么name_list就是["test_case/", "test_case/1.in", "test_case/1.out"]
|
|
|
|
|
# 现在暂时只支持第一种,先判断一下是什么格式的
|
|
|
|
|
|
|
|
|
|
# 第一种格式的
|
|
|
|
|
if "1.in" in name_list and "1.out" in name_list:
|
|
|
|
|
for file_name in name_list:
|
|
|
|
|
if self._is_legal_test_case_file_name(file_name):
|
2015-08-10 05:53:03 +00:00
|
|
|
|
name = file_name.split(".")
|
2015-08-10 04:25:35 +00:00
|
|
|
|
# 有了.in 判断对应的.out 在不在
|
|
|
|
|
if name[1] == "in":
|
|
|
|
|
if (name[0] + ".out") in name_list:
|
|
|
|
|
l.append(file_name)
|
|
|
|
|
else:
|
|
|
|
|
return error_response(u"测试用例文件不完整,缺少" + name[0] + ".out")
|
|
|
|
|
else:
|
|
|
|
|
# 有了.out 判断对应的 .in 在不在
|
|
|
|
|
if (name[0] + ".in") in name_list:
|
|
|
|
|
l.append(file_name)
|
|
|
|
|
else:
|
|
|
|
|
return error_response(u"测试用例文件不完整,缺少" + name[0] + ".in")
|
|
|
|
|
|
|
|
|
|
problem_test_dir = rand_str()
|
|
|
|
|
test_case_dir = "test_case/" + problem_test_dir + "/"
|
|
|
|
|
|
|
|
|
|
# 得到了合法的测试用例文件列表 然后去解压缩
|
2015-08-10 05:53:03 +00:00
|
|
|
|
os.mkdir(test_case_dir)
|
2015-08-10 04:25:35 +00:00
|
|
|
|
for name in l:
|
2015-08-10 05:53:03 +00:00
|
|
|
|
f = open(test_case_dir + name, "wb")
|
2015-08-10 04:25:35 +00:00
|
|
|
|
f.write(test_case_file.read(name))
|
|
|
|
|
f.close()
|
2015-08-10 05:53:03 +00:00
|
|
|
|
l.sort()
|
|
|
|
|
return success_response({"test_case_id": problem_test_dir,
|
|
|
|
|
"file_list": {"input": l[0::2],
|
|
|
|
|
"output": l[1::2]}})
|
2015-08-10 04:25:35 +00:00
|
|
|
|
else:
|
|
|
|
|
return error_response(u"测试用例压缩文件格式错误,请保证测试用例文件在根目录下直接压缩")
|