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,