From 247d356f7f3d7c877000f87b1243fa4503948357 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Tue, 5 Apr 2016 17:53:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84SPJ=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B=E7=9A=84=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problem/views.py | 100 ++++++++++++------ static/src/js/app/admin/problem/addProblem.js | 3 +- .../src/js/app/admin/problem/editProblem.js | 3 +- static/src/js/components/spj.js | 51 +++++---- static/src/js/components/testCaseUploader.js | 4 +- 5 files changed, 104 insertions(+), 57 deletions(-) diff --git a/problem/views.py b/problem/views.py index ffc9868..89a6e63 100644 --- a/problem/views.py +++ b/problem/views.py @@ -220,72 +220,106 @@ class TestCaseUploadAPIView(APIView): if len(name_list) == 0: return error_response(u"压缩包内没有文件") - if len(name_list) % 2 == 1: - return error_response(u"测试用例文件格式错误,文件数目为奇数") + for item in name_list: + if not self._is_legal_test_case_file_name(item): + return error_response(u"%s 文件名不符合规范" % item) - for index in range(1, len(name_list) / 2 + 1): - if not (str(index) + ".in" in name_list and str(index) + ".out" in name_list): - return error_response(u"测试用例文件格式错误,缺少" + str(index) + u".in/.out文件") + # 排序,这样name_list就是[1.in, 1.out, 2.in, 2.out]的形式了 + name_list.sort() + + spj = False + + for item in name_list: + # 代表里面有.out文件,所以应该是普通题目的测试用例 + if item.endswith(".out"): + break + else: + # 否则就应该是spj的测试用例 + spj = True + + print name_list, spj + + if not spj: + if len(name_list) % 2 == 1: + return error_response(u"测试用例文件格式错误,文件数目为奇数") + + for index in range(1, len(name_list) / 2 + 1): + if not (str(index) + ".in" in name_list and str(index) + ".out" in name_list): + return error_response(u"测试用例文件格式错误,缺少" + str(index) + u".in/.out文件") + test_case_number = len(name_list) / 2 + else: + for index in range(1, len(name_list) + 1): + if str(index) + ".in" not in name_list: + return error_response(u"测试用例文件格式错误,缺少" + str(index) + u".in文件") + test_case_number = len(name_list) problem_test_dir = rand_str() - test_case_dir = settings.TEST_CASE_DIR + problem_test_dir + "/" + test_case_dir = os.path.join(settings.TEST_CASE_DIR, problem_test_dir) # 得到了合法的测试用例文件列表 然后去解压缩 os.mkdir(test_case_dir) for name in name_list: - f = open(test_case_dir + name, "wb") + f = open(os.path.join(test_case_dir, name), "wb") try: f.write(test_case_file.read(name).replace("\r\n", "\n")) except MemoryError: return error_response(u"单个测试数据体积过大!") finally: f.close() - name_list.sort() - file_info = {"test_case_number": len(name_list) / 2, "test_cases": {}} + file_info = {"test_case_number": test_case_number, "test_cases": {}, "spj": spj} # 计算输出文件的md5 - for i in range(1, len(name_list) / 2 + 1): - md5 = hashlib.md5() - striped_md5 = hashlib.md5() - f = open(test_case_dir + str(i) + ".out", "r") - # 完整文件的md5 - while True: - data = f.read(2 ** 8) - if not data: - break - md5.update(data) + for i in range(1, test_case_number + 1): + if not spj: + md5 = hashlib.md5() + striped_md5 = hashlib.md5() + f = open(os.path.join(test_case_dir, str(i) + ".out"), "r") + # 完整文件的md5 + while True: + data = f.read(2 ** 8) + if not data: + break + md5.update(data) - # 删除标准输出最后的空格和换行 - # 这时只能一次全部读入了,分块读的话,没办法确定文件结尾 - f.seek(0) - striped_md5.update(f.read().rstrip()) + # 删除标准输出最后的空格和换行 + # 这时只能一次全部读入了,分块读的话,没办法确定文件结尾 + f.seek(0) + striped_md5.update(f.read().rstrip()) + + output_md5 = md5.hexdigest() + striped_output_md5 = striped_md5.hexdigest() + output_name = str(i) + ".out" + output_size = os.path.getsize(os.path.join(test_case_dir, output_name)) + else: + output_md5 = striped_output_md5 = output_name = output_size = None file_info["test_cases"][str(i)] = {"input_name": str(i) + ".in", - "output_name": str(i) + ".out", - "output_md5": md5.hexdigest(), - "striped_output_md5": striped_md5.hexdigest(), - "input_size": os.path.getsize(test_case_dir + str(i) + ".in"), - "output_size": os.path.getsize(test_case_dir + str(i) + ".out")} + "output_name": output_name, + "output_md5": output_md5, + "striped_output_md5": striped_output_md5, + "input_size": os.path.getsize(os.path.join(test_case_dir, str(i) + ".in")), + "output_size": output_size} # 写入配置文件 - with open(test_case_dir + "info", "w") as f: - f.write(json.dumps(file_info)) + with open(os.path.join(test_case_dir, "info"), "w") as f: + f.write(json.dumps(file_info)) return success_response({"test_case_id": problem_test_dir, - "file_list": file_info["test_cases"]}) + "file_list": file_info["test_cases"], + "spj": spj}) def get(self, request): test_case_id = request.GET.get("test_case_id", None) if not test_case_id: return error_response(u"参数错误") - test_case_config = settings.TEST_CASE_DIR + test_case_id + "/info" + test_case_config = os.path.join(settings.TEST_CASE_DIR, test_case_id, "info") try: f = open(test_case_config) config = json.loads(f.read()) f.close() except Exception as e: return error_response(u"读取测试用例出错") - return success_response({"file_list": config["test_cases"]}) + return success_response({"file_list": config["test_cases"], "spj": config.get("spj", False)}) def problem_list_page(request, page=1): diff --git a/static/src/js/app/admin/problem/addProblem.js b/static/src/js/app/admin/problem/addProblem.js index d510bf8..00ca52a 100644 --- a/static/src/js/app/admin/problem/addProblem.js +++ b/static/src/js/app/admin/problem/addProblem.js @@ -109,7 +109,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", vm.source = ""; vm.uploadProgress = 0; } - else + else { var vm = avalon.define({ $id: "addProblem", title: "", @@ -153,6 +153,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", return "展开"; } }); + } var tagAutoCompleteList = []; diff --git a/static/src/js/app/admin/problem/editProblem.js b/static/src/js/app/admin/problem/editProblem.js index 0c13470..120530e 100644 --- a/static/src/js/app/admin/problem/editProblem.js +++ b/static/src/js/app/admin/problem/editProblem.js @@ -96,7 +96,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", if (avalon.vmodels.editProblem) { var vm = avalon.vmodels.editProblem; } - else + else { var vm = avalon.define({ $id: "editProblem", title: "", @@ -142,6 +142,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", avalon.vmodels.admin.template_url = "template/problem/problem_list.html"; } }); + } $.ajax({ url: "/api/admin/problem/?problem_id=" + avalon.vmodels.admin.problemId, diff --git a/static/src/js/components/spj.js b/static/src/js/components/spj.js index 07dc1bc..1969877 100644 --- a/static/src/js/components/spj.js +++ b/static/src/js/components/spj.js @@ -1,30 +1,39 @@ -define("spj", ["avalon"], function (avalon) { +define("spj", ["avalon", "bsAlert"], function (avalon, bsAlert) { avalon.component("ms:spj", { - $template: '