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: '
上传进度%
' + + '| 编号 | 输入文件名 | 输出文件名 |
| {{ $index + 1 }} | ' + + '{{ el.input }} | ' + + '{{ el.output }} |
| 编号 | -输入文件名 | -输出文件名 | -
| {{ $index + 1 }} | -{{ el.input }} | -{{ el.output }} | -
上传进度%
-| 编号 | -输入文件名 | -输出文件名 | -
| {{$index + 1}} | -{{ el.input }} | -{{ el.output }} | -
上传进度%
-| 编号 | -输入文件名 | -输出文件名 | -
| {{ $index + 1 }} | -{{ el.input }} | -{{ el.output }} | -