From 5cdab3f573faedbc9357b912a94ae89c3a9d74d5 Mon Sep 17 00:00:00 2001 From: sxw Date: Fri, 30 Oct 2015 14:52:22 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E6=AF=94=E8=B5=9B=E9=A1=B5=E9=9D=A2[CI=20SKI?= =?UTF-8?q?P]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/js/app/admin/contest/contestList.js | 9 +- .../src/js/app/admin/contest/editContest.js | 175 ++++++++++++++++++ template/src/admin/contest/edit_contest.html | 107 +++++++++++ 3 files changed, 290 insertions(+), 1 deletion(-) create mode 100644 static/src/js/app/admin/contest/editContest.js create mode 100644 template/src/admin/contest/edit_contest.html diff --git a/static/src/js/app/admin/contest/contestList.js b/static/src/js/app/admin/contest/contestList.js index 7eb47fad..ac240574 100644 --- a/static/src/js/app/admin/contest/contestList.js +++ b/static/src/js/app/admin/contest/contestList.js @@ -20,6 +20,14 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", search: function () { getPage(1); avalon.vmodels.contestListPager.currentPage = 1; + }, + + editContest: function(contestId){ + avalon.vmodels.admin.contestId = contestId; + avalon.vmodels.admin.template_url = "template/contest/edit_contest.html"; + }, + showContestProblems: function(contestId){ + // todo } }) } @@ -42,7 +50,6 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", success: function (data) { if (!data.code) { vm.contestList = data.data.results; - vm.announcementList = data.data.results; avalon.vmodels.contestListPager.totalPage = data.data.total_page; } else { diff --git a/static/src/js/app/admin/contest/editContest.js b/static/src/js/app/admin/contest/editContest.js new file mode 100644 index 00000000..f34e2614 --- /dev/null +++ b/static/src/js/app/admin/contest/editContest.js @@ -0,0 +1,175 @@ +require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "datetimePicker", + "validator", "editorComponent"], + function ($, avalon, editor, uploader, bsAlert, csrfTokenHeader) { + + $("#edit-contest-form").validator().on('submit', function (e) { + if (!e.isDefaultPrevented()) { + e.preventDefault(); + var ajaxData = { + id: avalon.vmodels.admin.contestId, + title: vm.title, + description: avalon.vmodels.contestDescriptionEditor.content, + contest_type: 0, + real_time_rank: vm.realTimeRank, + start_time: vm.startTime, + end_time: vm.endTime, + visible: vm.visible + }; + + var selectedGroups = []; + if (!vm.isGlobal) { + for (var i = 0; i < vm.allGroups.length; i++) { + if (vm.allGroups[i].isSelected) { + selectedGroups.push(vm.allGroups[i].id); + } + } + ajaxData.groups = selectedGroups; + } + else { + if (vm.password) { + ajaxData.password = vm.password; + ajaxData.contest_type = 2; + } + else + ajaxData.contest_type = 1; + } + if (!vm.isGlobal && !selectedGroups.length) { + bsAlert("你没有选择参赛用户!"); + return false; + } + if (ajaxData.description.trim() == "") { + bsAlert("比赛描述不能为空!"); + return false; + } + $.ajax({ + url: "/api/admin/contest/", + dataType: "json", + contentType: "application/json;charset=UTF-8", + data: JSON.stringify(ajaxData), + method: "put", + success: function (data) { + if (!data.code) { + bsAlert("修改成功!"); + vm.showContestListPage(); + } + else { + bsAlert(data.data); + } + } + }); + } + return false; + }); + + if (avalon.vmodels.edit_contest) + var vm = avalon.vmodels.edit_contest; + else + var vm = avalon.define({ + $id: "edit_contest", + title: "", + startTime: "", + endTime: "", + password: "", + isGlobal: true, + allGroups: [], + showGlobalViewRadio: true, + realTimeRank: true, + visible: false, + showContestListPage: function () { + avalon.vmodels.admin.template_url = "template/contest/contest_list.html"; + }, + + contestDescriptionEditor: { + editorId: "contest-description-editor", + placeholder: "比赛介绍内容" + } + }); + avalon.scan(); + $.ajax({ + url: "/api/user/", + method: "get", + dataType: "json", + success: function (data) { + if (!data.code) { + var admin_type = data.data.admin_type; + if (data.data.admin_type == 1) { + vm.isGlobal = false; + vm.showGlobalViewRadio = false; + } + } + $.ajax({ + url: "/api/admin/group/", + method: "get", + dataType: "json", + success: function (data) { + if (!data.code) { + if (!data.data.length) { + if (admin_type != 2) + bsAlert("您的用户权限只能创建小组内比赛,但是您还没有创建过小组"); + return; + } + vm.allGroups = []; + for (var i = 0; i < data.data.length; i++) { + var item = data.data[i]; + item.isSelected = false; + vm.allGroups.push(item); + } + $.ajax({ + url: "/api/admin/contest/?contest_id=" + avalon.vmodels.admin.contestId, + method: "get", + dataType: "json", + success: function (data) { + if (data.code) { + bsAlert(data.data); + } + else { + var contest = data.data; + vm.title = contest.title; + avalon.vmodels.contestDescriptionEditor.content = contest.description; + vm.visible = contest.visible; + vm.realTimeRank = contest.real_time_rank; + vm.startTime = contest.start_time.substring(0, 16).replace("T", " "); + vm.endTime = contest.end_time.substring(0, 16).replace("T", " "); + if (contest.contest_type == 0) { //contest_type == 0, 小组内比赛 + vm.isGlobal = false; + for (var i = 0; i < vm.allGroups.length; i++) { + vm.allGroups[i].isSelected = false; + } + for (var i = 0; i < contest.groups.length; i++) { + var id = contest.groups[i]; + for (var index = 0; vm.allGroups[index]; index++) { + if (vm.allGroups[index].id == id) { + vm.allGroups[index].isSelected = true; + break; + } + } + } + } + else { + vm.isGlobal = true; + } + } + } + }); + } + else { + bsAlert(data.data); + } + } + }); + } + }); + + $("#contest_start_time").datetimepicker({ + format: "yyyy-mm-dd hh:ii", + minuteStep: 5, + weekStart: 1, + language: "zh-CN" + }); + $("#contest_end_time").datetimepicker({ + format: "yyyy-mm-dd hh:ii", + minuteStep: 5, + weekStart: 1, + language: "zh-CN" + }); + }); \ No newline at end of file diff --git a/template/src/admin/contest/edit_contest.html b/template/src/admin/contest/edit_contest.html new file mode 100644 index 00000000..2afc8491 --- /dev/null +++ b/template/src/admin/contest/edit_contest.html @@ -0,0 +1,107 @@ +
+
+ +
+ +
+
+
+ + +
+
+
+
+ +
+
+
+ +
+
+
+ + +
+ + +
+
+
+
+ + +
+ + +
+
+
+
+
+ + +
+ + + + + + +
+ +
+
+
+ + +
+ +
+
+
+ +
+   {{ el.name }} +
+
+ +
+ + +
+ +
+
+
+ + +
+ +
+
+
+ +
+
+
+ + From 266ce4de66cdf19b80a41a51a2224e0ccce4ba48 Mon Sep 17 00:00:00 2001 From: sxw Date: Fri, 30 Oct 2015 14:54:03 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B0=8Fbug=EF=BC=8C?= =?UTF-8?q?=E4=BB=BF=E7=85=A7problem=20GET=E6=B7=BB=E5=8A=A0=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=8D=95=E4=B8=AA=E6=AF=94=E8=B5=9B=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E7=9A=84API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest/views.py | 24 ++++++++++++++++++------ problem/views.py | 4 ++-- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/contest/views.py b/contest/views.py index 29c943a7..d2a22b26 100644 --- a/contest/views.py +++ b/contest/views.py @@ -90,8 +90,8 @@ class ContestAdminAPIView(APIView): try: # 超级管理员可以编辑所有的 contest = Contest.objects.get(id=data["id"]) - if request.user.admin_type != SUPER_ADMIN: - contest = contest.get(created_by=request.user) + if request.user.admin_type != SUPER_ADMIN and contest.created_by != request.user: + return error_response(u"无权访问!") except Contest.DoesNotExist: return error_response(u"该比赛不存在!") try: @@ -144,6 +144,18 @@ class ContestAdminAPIView(APIView): --- response_serializer: ContestSerializer """ + contest_id = request.GET.get("contest_id", None) + if contest_id: + try: + # 普通管理员只能获取自己创建的题目 + # 超级管理员可以获取全部的题目 + contest = Contest.objects.get(id=contest_id) + if request.user.admin_type != SUPER_ADMIN and contest.created_by != request.user: + return error_response(u"题目不存在") + return success_response(ContestSerializer(contest).data) + except Contest.DoesNotExist: + return error_response(u"题目不存在") + if request.user.admin_type == SUPER_ADMIN: contest = Contest.objects.all().order_by("-create_time") else: @@ -171,8 +183,8 @@ class ContestProblemAdminAPIView(APIView): data = serializer.data try: contest = Contest.objects.get(id=data["contest_id"]) - if request.user.admin_type != SUPER_ADMIN: - contest = contest.get(created_by=request.user) + if request.user.admin_type != SUPER_ADMIN and contest.created_by != request.user: + return error_response(u"比赛不存在") except Contest.DoesNotExist: return error_response(u"比赛不存在") contest_problem = ContestProblem.objects.create(title=data["title"], @@ -238,8 +250,8 @@ class ContestProblemAdminAPIView(APIView): if contest_problem_id: try: contest_problem = ContestProblem.objects.get(id=contest_problem_id) - if request.user.admin_type != SUPER_ADMIN: - contest_problem = contest_problem.get(created_by=request.user) + if request.user.admin_type != SUPER_ADMIN and contest_problem.created_by != request.user: + return error_response(u"比赛题目不存在") return success_response(ContestProblemSerializer(contest_problem).data) except ContestProblem.DoesNotExist: return error_response(u"比赛题目不存在") diff --git a/problem/views.py b/problem/views.py index e48b8a5c..5f1d5353 100644 --- a/problem/views.py +++ b/problem/views.py @@ -136,8 +136,8 @@ class ProblemAdminAPIView(APIView): # 普通管理员只能获取自己创建的题目 # 超级管理员可以获取全部的题目 problem = Problem.objects.get(id=problem_id) - if request.user.admin_type != SUPER_ADMIN: - problem = problem.get(created_by=request.user) + if request.user.admin_type != SUPER_ADMIN and problem.created_by != request.user: + return error_response(u"题目不存在") return success_response(ProblemSerializer(problem).data) except Problem.DoesNotExist: return error_response(u"题目不存在") From edaad01253afbd525452a9899b392de961f1306c Mon Sep 17 00:00:00 2001 From: sxw Date: Fri, 30 Oct 2015 14:57:18 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=B0=8F=E8=B0=83=E6=95=B4=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E6=94=B9addContest=E7=9A=84=E5=B0=8Fbug=EF=BC=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重复进入页面导致小组列表不断增加的问题,每次先清空;添加 添加了一般管理员前台到后台的链接(原来只有超管有)[CI SKIP] --- static/src/js/app/admin/contest/addContest.js | 1 + template/src/oj_base.html | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/static/src/js/app/admin/contest/addContest.js b/static/src/js/app/admin/contest/addContest.js index b05ba4ee..9cbd57dd 100644 --- a/static/src/js/app/admin/contest/addContest.js +++ b/static/src/js/app/admin/contest/addContest.js @@ -104,6 +104,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "date bsAlert("您的用户权限只能创建小组内比赛,但是您还没有创建过小组"); return; } + vm.allGroups = []; for (var i = 0; i < data.data.length; i++) { var item = data.data[i]; item["isSelected"] = false; diff --git a/template/src/oj_base.html b/template/src/oj_base.html index bb0e5ff1..87497fc7 100644 --- a/template/src/oj_base.html +++ b/template/src/oj_base.html @@ -59,7 +59,7 @@ {{ request.user.username }}