From f263e05746c6f929f1a0c1ac46ca4ab776c8900b Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Sat, 7 Nov 2015 12:48:43 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B=E4=B8=8A=E4=BC=A0=E5=92=8C=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=9A=84=20web=20=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/js/components/testCaseUploader.js | 83 ++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 static/src/js/components/testCaseUploader.js diff --git a/static/src/js/components/testCaseUploader.js b/static/src/js/components/testCaseUploader.js new file mode 100644 index 0000000..8a41cc3 --- /dev/null +++ b/static/src/js/components/testCaseUploader.js @@ -0,0 +1,83 @@ +define("testCaseUploader", ["avalon", "uploader", "bsAlert", "jquery"], function(avalon, uploader, bsAlert, $){ + avalon.component("ms:testcaseuploader", { + $template: '
' + + '
' + + '
' + + '' + + '请将所有测试用例打包在一个文件中上传,' + + '所有文件要在压缩包的根目录,' + + '且输入输出文件名要以从1开始连续数字标识要对应例如:' + + '
1.in 1.out 2.in 2.out
' + + '

上传进度%

' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '
编号 输入文件名 输出文件名
{{ $index + 1 }}{{ el.input }}{{ el.output }}
' + + '
' + + '
' + + '
' + + '
选择文件
' + + '
' + + '
', + testCaseId: "", + testCaseList: [], + uploaded: false, + uploadProgress: 0, + + setTestCaseId: function(){}, + + $init: function(vm, el){ + vm.setTestCase = function(testCaseId){ + vm.testCaseId = testCaseId; + $.ajax({ + url: "/api/admin/test_case_upload/?test_case_id=" + testCaseId, + method: "get", + success: function(data){ + if(data.code){ + bsAlert("获取测试用例列表失败"); + } + else{ + for(var key in data.data.file_list){ + vm.testCaseList.push({ + input: data.data.file_list[key].input_name, + output: data.data.file_list[key].output_name + }) + } + vm.uploaded = true; + vm.uploadProgress = 100; + } + } + }); + + } + }, + + $ready: function(vm, el){ + el.msRetain = true; + var testCaseUploader = uploader("#testCaseFileSelector", "/api/admin/test_case_upload/", + function (file, response) { + if (response.code) { + bsAlert(response.data); + } + else { + vm.testCaseId = response.data.test_case_id; + vm.uploaded = true; + vm.testCaseList = []; + for(var key in response.data.file_list){ + vm.testCaseList.push({ + input: response.data.file_list[key].input_name, + output: response.data.file_list[key].output_name + }) + } + bsAlert("测试数据添加成功!共添加" + vm.testCaseList.length + "组测试数据"); + } + }, + function (file, percentage) { + vm.uploadProgress = parseInt(percentage * 100); + }); + } + }) +}); \ No newline at end of file From 6a172f53f7ee15976ac738c0b1ae122fab9c6284 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Sat, 7 Nov 2015 12:49:00 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B=E7=9A=84=E6=97=B6=E5=80=99?= =?UTF-8?q?=E5=AF=B9=E7=A9=BA=E6=96=87=E4=BB=B6=E7=9A=84=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problem/views.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/problem/views.py b/problem/views.py index 4e7e7eb..ba3b552 100644 --- a/problem/views.py +++ b/problem/views.py @@ -191,6 +191,8 @@ class TestCaseUploadAPIView(APIView): name_list = test_case_file.namelist() # 如果文件是直接打包的,那么name_list 就是["1.in", "1.out"]这样的 + if len(name_list) == 0: + return error_response(u"压缩包内没有文件") if len(name_list) % 2 == 1: return error_response(u"测试用例文件格式错误,文件数目为奇数") From e0bb9eed2b6623d531b98ba487abd01d58f80ba9 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Sat, 7 Nov 2015 13:05:17 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E4=B8=BA=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BE=8B=E4=B8=8A=E4=BC=A0=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/js/app/admin/contest/editProblem.js | 3 +- static/src/js/app/admin/problem/addProblem.js | 30 +++-------------- .../src/js/app/admin/problem/editProblem.js | 32 +++---------------- static/src/js/config.js | 1 + template/src/admin/contest/edit_problem.html | 24 +------------- template/src/admin/problem/add_problem.html | 25 +-------------- template/src/admin/problem/edit_problem.html | 25 +-------------- 7 files changed, 15 insertions(+), 125 deletions(-) diff --git a/static/src/js/app/admin/contest/editProblem.js b/static/src/js/app/admin/contest/editProblem.js index 4fdb94f..05aff43 100644 --- a/static/src/js/app/admin/contest/editProblem.js +++ b/static/src/js/app/admin/contest/editProblem.js @@ -1,4 +1,5 @@ -require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagEditor", "validator", "editorComponent"], +require(["jquery", "avalon", "editor", "uploader", "bsAlert", + "csrfToken", "tagEditor", "validator", "editorComponent", "testCaseUploader"], function ($, avalon, editor, uploader, bsAlert, csrfTokenHeader) { avalon.ready(function () { diff --git a/static/src/js/app/admin/problem/addProblem.js b/static/src/js/app/admin/problem/addProblem.js index e2f9e6f..73254af 100644 --- a/static/src/js/app/admin/problem/addProblem.js +++ b/static/src/js/app/admin/problem/addProblem.js @@ -1,11 +1,12 @@ -require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagEditor", "validator", "jqueryUI", "editorComponent"], +require(["jquery", "avalon", "editor", "uploader", "bsAlert", + "csrfToken", "tagEditor", "validator", "jqueryUI", "editorComponent", "testCaseUploader"], function ($, avalon, editor, uploader, bsAlert, csrfTokenHeader) { avalon.ready(function () { $("#add-problem-form").validator() .on('submit', function (e) { if (!e.isDefaultPrevented()) { - if (vm.testCaseId == "") { + if (!avalon.vmodels.testCaseUploader.uploaded) { bsAlert("你还没有上传测试数据!"); return false; } @@ -39,7 +40,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE time_limit: vm.timeLimit, memory_limit: vm.memoryLimit, samples: [], - test_case_id: vm.testCaseId, + test_case_id: avalon.vmodels.testCaseUploader.testCaseId, hint: avalon.vmodels.problemHintEditor.content, source: vm.source, visible: vm.visible, @@ -139,29 +140,6 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE } }); - var testCaseUploader = uploader("#testCaseFile", "/api/admin/test_case_upload/", - function (file, response) { - if (response.code) { - vm.uploadProgress = 0; - bsAlert(response.data); - } - else { - vm.testCaseId = response.data.test_case_id; - vm.uploadSuccess = true; - vm.testCaseList = []; - for (var key in response.data.file_list) { - vm.testCaseList.push({ - input: response.data.file_list[key].input_name, - output: response.data.file_list[key].output_name - }) - } - bsAlert("测试数据添加成功!共添加" + vm.testCaseList.length + "组测试数据"); - } - }, - function (file, percentage) { - vm.uploadProgress = parseInt(percentage * 100); - }); - var tagAutoCompleteList = []; $.ajax({ diff --git a/static/src/js/app/admin/problem/editProblem.js b/static/src/js/app/admin/problem/editProblem.js index e6dda3b..b144864 100644 --- a/static/src/js/app/admin/problem/editProblem.js +++ b/static/src/js/app/admin/problem/editProblem.js @@ -1,4 +1,5 @@ -require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagEditor", "validator", "jqueryUI", "editorComponent"], +require(["jquery", "avalon", "editor", "uploader", "bsAlert", + "csrfToken", "tagEditor", "validator", "jqueryUI", "editorComponent", "testCaseUploader"], function ($, avalon, editor, uploader, bsAlert, csrfTokenHeader) { avalon.ready(function () { @@ -6,7 +7,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE $("#edit-problem-form").validator() .on('submit', function (e) { if (!e.isDefaultPrevented()) { - if (vm.testCaseId == "") { + if (!avalon.vmodels.testCaseUploader.uploaded) { bsAlert("你还没有上传测试数据!"); return false; } @@ -40,7 +41,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE time_limit: vm.timeLimit, memory_limit: vm.memoryLimit, samples: [], - test_case_id: vm.testCaseId, + test_case_id: avalon.vmodels.testCaseUploader.testCaseId, hint: avalon.vmodels.problemHintEditor.content, source: vm.source, visible: vm.visible, @@ -127,29 +128,6 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE avalon.vmodels.admin.template_url = "template/problem/problem_list.html"; } }); - var testCaseUploader = uploader("#testCaseFile", "/api/admin/test_case_upload/", - function (file, response) { - if (response.code) { - vm.uploadProgress = 0; - bsAlert(response.data); - } - else { - vm.testCaseId = response.data.test_case_id; - vm.uploadSuccess = true; - vm.testCaseList = []; - for(var key in response.data.file_list){ - vm.testCaseList.push({ - input: response.data.file_list[key].input_name, - output: response.data.file_list[key].output_name - }) - } - bsAlert("测试数据添加成功!共添加" + vm.testCaseList.length + "组测试数据"); - } - }, - function (file, percentage) { - vm.uploadProgress = parseInt(percentage * 100); - } - ); $.ajax({ url: "/api/admin/problem/?problem_id=" + avalon.vmodels.admin.problemId, @@ -178,7 +156,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE vm.difficulty = problem.difficulty; vm.inputDescription = problem.input_description; vm.outputDescription = problem.output_description; - vm.testCaseId = problem.test_case_id; + avalon.vmodels.testCaseUploader.setTestCase(problem.test_case_id); vm.source = problem.source; var problemTags = problem.tags; $.ajax({ diff --git a/static/src/js/config.js b/static/src/js/config.js index f0b1047..603c4a2 100644 --- a/static/src/js/config.js +++ b/static/src/js/config.js @@ -27,6 +27,7 @@ var require = { // ------ admin web 组件 ---------- pager: "components/pager", editorComponent: "components/editorComponent", + testCaseUploader: "components/testCaseUploader", // ------ 下面写的都不要直接用,而是使用上面的封装版本 ------ diff --git a/template/src/admin/contest/edit_problem.html b/template/src/admin/contest/edit_problem.html index f5ef148..14bbd6b 100644 --- a/template/src/admin/contest/edit_problem.html +++ b/template/src/admin/contest/edit_problem.html @@ -96,29 +96,7 @@ -

-
- 请将所有测试用例打包在一个文件中上传,所有文件要在压缩包的根目录,且输入输出文件名要以从1开始连续数字标识要对应例如:
- 1.in 1.out 2.in 2.out -
- - - - - - - - - - - -
编号输入文件名输出文件名
{{ $index + 1 }}{{ el.input }}{{ el.output }}
-
-
-
-
选择文件
-
-
+
diff --git a/template/src/admin/problem/add_problem.html b/template/src/admin/problem/add_problem.html index 5c6b430..6d96a7b 100644 --- a/template/src/admin/problem/add_problem.html +++ b/template/src/admin/problem/add_problem.html @@ -99,30 +99,7 @@
-

-
- 请将所有测试用例打包在一个文件中上传,所有文件要在压缩包的根目录,且输入输出文件名要以从1开始连续数字标识要对应例如:
- 1.in 1.out 2.in 2.out -
-

上传进度%

- - - - - - - - - - - -
编号输入文件名输出文件名
{{$index + 1}}{{ el.input }}{{ el.output }}
-
-
-
-
选择文件
-
-
+
diff --git a/template/src/admin/problem/edit_problem.html b/template/src/admin/problem/edit_problem.html index 617573e..f9af36b 100644 --- a/template/src/admin/problem/edit_problem.html +++ b/template/src/admin/problem/edit_problem.html @@ -105,30 +105,7 @@
-

-
- 请将所有测试用例打包在一个文件中上传,所有文件要在压缩包的根目录,且输入输出文件名要以从1开始连续数字标识要对应例如:
- 1.in 1.out 2.in 2.out -
-

上传进度%

- - - - - - - - - - - -
编号输入文件名输出文件名
{{ $index + 1 }}{{ el.input }}{{ el.output }}
-
-
-
-
选择文件
-
-
+
From 9e4342f6490107f94a195e4dde64103ef03a39e9 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Sat, 7 Nov 2015 13:05:40 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20vm=20=E4=B8=AD?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=B8=85=E9=99=A4=E9=94=99=E8=AF=AF=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=9B=E6=9B=BF=E6=8D=A2=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B=E4=B8=8A=E4=BC=A0=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/js/app/admin/contest/editProblem.js | 70 +++++-------------- 1 file changed, 16 insertions(+), 54 deletions(-) diff --git a/static/src/js/app/admin/contest/editProblem.js b/static/src/js/app/admin/contest/editProblem.js index 05aff43..c19a26b 100644 --- a/static/src/js/app/admin/contest/editProblem.js +++ b/static/src/js/app/admin/contest/editProblem.js @@ -8,7 +8,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", .on('submit', function (e) { if (!e.isDefaultPrevented()) { e.preventDefault(); - if (vm.testCaseId == "") { + if (!avalon.vmodels.testCaseUploader.uploaded) { bsAlert("你还没有上传测试数据!"); return false; } @@ -36,7 +36,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", time_limit: vm.timeLimit, memory_limit: vm.memoryLimit, samples: [], - test_case_id: vm.testCaseId, + test_case_id: avalon.vmodels.testCaseUploader.testCaseId, hint: avalon.vmodels.contestProblemHintEditor.content, visible: vm.visible, contest_id: avalon.vmodels.admin.contestId, @@ -72,6 +72,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", success: function (data) { if (!data.code) { bsAlert(alertContent); + avalon.vmodels.admin.template_url = "template/contest/problem_list.html"; } else { bsAlert(data.data); @@ -98,7 +99,6 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", outputDescription: "", testCaseId: "", testCaseList: [], - uploadSuccess: false, contestProblemDescriptionEditor: { editorId: "contest-problem-description-editor", @@ -135,38 +135,20 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", }); else { var vm = avalon.vmodels.editProblem; - title = ""; - description = ""; - timeLimit = 1000; - memoryLimit = 128; - samples = []; - hint = ""; - sortIndex = ""; - visible = true; - inputDescription = ""; - outputDescription = ""; - testCaseId = ""; - testCaseList = []; - uploadSuccess = false; + vm.title = ""; + vm.description = ""; + vm.timeLimit = 1000; + vm.memoryLimit = 128; + vm.samples = []; + vm.hint = ""; + vm.sortIndex = ""; + vm.visible = true; + vm.inputDescription = ""; + vm.outputDescription = ""; + vm.testCaseId = ""; + vm.testCaseList = []; } - var testCaseUploader = uploader("#testCaseFile", "/api/admin/test_case_upload/", function (file, response) { - if (response.code) - bsAlert(response.data); - else { - vm.testCaseId = response.data.test_case_id; - vm.testCaseList = []; - for (var key in response.data.file_list) { - vm.testCaseList.push({ - input: response.data.file_list[key].input_name, - output: response.data.file_list[key].output_name - }) - } - vm.uploadSuccess = true; - bsAlert("测试数据添加成功!共添加" + vm.testCaseList.length + "组测试数据"); - } - }); - if (avalon.vmodels.admin.contestProblemStatus == "edit") { $.ajax({ url: "/api/admin/contest_problem/?contest_problem_id=" + avalon.vmodels.admin.problemId, @@ -189,7 +171,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", vm.inputDescription = problem.input_description; vm.outputDescription = problem.output_description; vm.score = problem.score; - vm.testCaseId = problem.test_case_id; + avalon.vmodels.testCaseUploader.setTestCase(problem.test_case_id); vm.samples = []; for (var i = 0; i < problem.samples.length; i++) { vm.samples.push({ @@ -199,26 +181,6 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", }) } avalon.vmodels.contestProblemHintEditor.content = problem.hint; - $.ajax({ - url: "/api/admin/test_case_upload/?test_case_id=" + vm.testCaseId, - method: "get", - dataType: "json", - success: function (response) { - if (response.code) { - bsAlert(response.data); - } - else { - vm.testCaseList = []; - for (var key in response.data.file_list) { - vm.testCaseList.push({ - input: response.data.file_list[key].input_name, - output: response.data.file_list[key].output_name - }) - } - vm.uploadSuccess = true; - } - } - }) } } }); From 6776b88cb482bd49e64013bd4b1a395e44818a2e Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Sat, 7 Nov 2015 13:35:41 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=AF=94=E8=B5=9B?= =?UTF-8?q?=E9=A2=98=E7=9B=AE=E5=85=AC=E5=BC=80=E5=90=8E=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=85=AC=E5=BC=80=E7=8A=B6=E6=80=81=E7=9A=84?= =?UTF-8?q?=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest/views.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contest/views.py b/contest/views.py index 83a5219..b10e426 100644 --- a/contest/views.py +++ b/contest/views.py @@ -278,6 +278,8 @@ class MakeContestProblemPublicAPIView(APIView): problem_id = request.data.get("problem_id", -1) try: problem = ContestProblem.objects.get(id=problem_id) + problem.is_public = True + problem.save() except ContestProblem.DoesNotExist: return error_response(u"比赛不存在") Problem.objects.create(title=problem.title, description=problem.description,