diff --git a/contest/views.py b/contest/views.py index abe5d84..7deb166 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, 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"测试用例文件格式错误,文件数目为奇数") diff --git a/static/src/js/app/admin/contest/editProblem.js b/static/src/js/app/admin/contest/editProblem.js index 4fdb94f..c19a26b 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 () { @@ -7,7 +8,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE .on('submit', function (e) { if (!e.isDefaultPrevented()) { e.preventDefault(); - if (vm.testCaseId == "") { + if (!avalon.vmodels.testCaseUploader.uploaded) { bsAlert("你还没有上传测试数据!"); return false; } @@ -35,7 +36,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.contestProblemHintEditor.content, visible: vm.visible, contest_id: avalon.vmodels.admin.contestId, @@ -71,6 +72,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE success: function (data) { if (!data.code) { bsAlert(alertContent); + avalon.vmodels.admin.template_url = "template/contest/problem_list.html"; } else { bsAlert(data.data); @@ -97,7 +99,6 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE outputDescription: "", testCaseId: "", testCaseList: [], - uploadSuccess: false, contestProblemDescriptionEditor: { editorId: "contest-problem-description-editor", @@ -134,38 +135,20 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE }); 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, @@ -188,7 +171,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE 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({ @@ -198,26 +181,6 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE }) } 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; - } - } - }) } } }); 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/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 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 }}
-
-
-
-
选择文件
-
-
+