From 38202b6bf2c9034ff1236056bf67ac793b6d5e23 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 29 Oct 2015 18:58:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=85=AC=E5=BC=80=E6=AF=94?= =?UTF-8?q?=E8=B5=9B=E9=A2=98=E7=9B=AE=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest/serializers.py | 2 +- contest/views.py | 23 +- oj/urls.py | 4 +- static/src/js/app/admin/admin.js | 2 + .../src/js/app/admin/contest/contestList1.js | 321 ------------------ .../app/admin/contest/contestProblemList.js | 21 ++ template/src/admin/contest/problem_list.html | 1 + 7 files changed, 50 insertions(+), 324 deletions(-) delete mode 100644 static/src/js/app/admin/contest/contestList1.js diff --git a/contest/serializers.py b/contest/serializers.py index e0fde2a4..0ee0def5 100644 --- a/contest/serializers.py +++ b/contest/serializers.py @@ -110,4 +110,4 @@ class EditContestProblemSerializer(serializers.Serializer): class ContestPasswordVerifySerializer(serializers.Serializer): contest_id = serializers.IntegerField() - password = serializers.CharField(max_length=30) + password = serializers.CharField(max_length=30) \ No newline at end of file diff --git a/contest/views.py b/contest/views.py index eccd4514..03285c99 100644 --- a/contest/views.py +++ b/contest/views.py @@ -16,10 +16,11 @@ from rest_framework.views import APIView from utils.shortcuts import (serializer_invalid_response, error_response, success_response, paginate, error_page, paginate_data) from account.models import SUPER_ADMIN, User -from account.decorators import login_required +from account.decorators import login_required, super_admin_required from group.models import Group from utils.cache import get_cache_redis from submission.models import Submission +from problem.models import Problem from .models import (Contest, ContestProblem, CONTEST_ENDED, CONTEST_NOT_START, CONTEST_UNDERWAY, ContestRank) from .models import GROUP_CONTEST, PUBLIC_CONTEST, PASSWORD_PROTECTED_CONTEST @@ -271,6 +272,26 @@ class ContestProblemAdminAPIView(APIView): return paginate(request, contest_problems, ContestProblemSerializer) +class MakeContestProblemPublicAPIView(APIView): + @super_admin_required + def post(self, request): + problem_id = request.data.get("problem_id", -1) + try: + problem = ContestProblem.objects.get(id=problem_id) + except ContestProblem.DoesNotExist: + return error_response(u"比赛不存在") + Problem.objects.create(title=problem.title, description=problem.description, + input_description=problem.input_description, + output_description=problem.output_description, + samples=problem.samples, + test_case_id=problem.test_case_id, + hint=problem.hint, created_by=problem.created_by, + time_limit=problem.time_limit, memory_limit=problem.memory_limit, + visible=False, difficulty=-1, source=problem.contest.title) + return success_response(u"创建成功") + + + class ContestPasswordVerifyAPIView(APIView): @login_required def post(self, request): diff --git a/oj/urls.py b/oj/urls.py index dfbe669f..53283fe2 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -11,7 +11,8 @@ from account.views import (UserLoginAPIView, UsernameCheckAPIView, UserRegisterA from announcement.views import AnnouncementAdminAPIView from contest.views import (ContestAdminAPIView, ContestProblemAdminAPIView, - ContestPasswordVerifyAPIView, ContestTimeAPIView) + ContestPasswordVerifyAPIView, ContestTimeAPIView, + MakeContestProblemPublicAPIView) from group.views import (GroupAdminAPIView, GroupMemberAdminAPIView, JoinGroupAPIView, JoinGroupRequestAdminAPIView) @@ -65,6 +66,7 @@ urlpatterns = [ url(r'^api/admin/problem/$', ProblemAdminAPIView.as_view(), name="problem_admin_api"), url(r'^api/admin/contest_problem/$', ContestProblemAdminAPIView.as_view(), name="contest_problem_admin_api"), + url(r'^api/admin/contest_problem/public/', MakeContestProblemPublicAPIView.as_view(), name="make_contest_problem_public"), url(r'^api/admin/test_case_upload/$', TestCaseUploadAPIView.as_view(), name="test_case_upload_api"), url(r'^api/admin/tag/$', ProblemTagAdminAPIView.as_view(), name="problem_tag_admin_api"), url(r'^api/admin/join_group_request/$', JoinGroupRequestAdminAPIView.as_view(), diff --git a/static/src/js/app/admin/admin.js b/static/src/js/app/admin/admin.js index 9e2c6ff3..72c8fd6b 100644 --- a/static/src/js/app/admin/admin.js +++ b/static/src/js/app/admin/admin.js @@ -68,6 +68,7 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "bootstrap"], function ($, $id: "admin", template_url: "template/" + hash + ".html", username: "", + adminType: 1, groupId: -1, problemId: -1, adminNavList: [], @@ -91,6 +92,7 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "bootstrap"], function ($, success: function(data){ if(!data.code){ vm.username = data.data.username; + vm.adminType = data.data.admin_type; if (data.data.admin_type == 2){ vm.adminNavList = superAdminNav; } diff --git a/static/src/js/app/admin/contest/contestList1.js b/static/src/js/app/admin/contest/contestList1.js deleted file mode 100644 index 07ddc1e1..00000000 --- a/static/src/js/app/admin/contest/contestList1.js +++ /dev/null @@ -1,321 +0,0 @@ -require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", "validator"], function ($, avalon, csrfTokenHeader, bsAlert, editor) { - - avalon.ready(function () { - - $("#edit-contest-form").validator().on('submit', function (e) { - if (!e.isDefaultPrevented()) { - e.preventDefault(); - var ajaxData = { - id: vm.contestList[vm.editingContestId - 1].id, - title: vm.editTitle, - description: vm.editDescription, - mode: vm.editMode, - contest_type: 0, - real_time_rank: vm.editRealTimeRank, - show_user_submission: vm.editShowSubmission, - start_time: vm.editStartTime, - end_time: vm.editEndTime, - visible: vm.editVisible - }; - - 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.editPassword) { - ajaxData.password = vm.editPassword; - ajaxData.contest_type = 2; - } - else - ajaxData.contest_type = 1; - } - if (!vm.isGlobal && !selectedGroups.length) { - bsAlert("你没有选择参赛用户!"); - return false; - } - if (vm.editDescription == "") { - bsAlert("比赛描述不能为空!"); - return false; - } - - $.ajax({ // modify contest info - beforeSend: csrfTokenHeader, - 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.editingContestId = 0; // Hide the editor - vm.getPage(1); // Refresh the contest list - } - else { - bsAlert(data.data); - } - } - }); - } - return false; - }); - - if (avalon.vmodels.contestList) { - // this page has been loaded before, so set the default value - var vm = avalon.vmodels.contestList; - vm.contestList = []; - } - else { - var vm = avalon.define({ - $id: "contestList", - contestList: [], - previousPage: 0, - nextPage: 0, - page: 1, - totalPage: 1, - showVisibleOnly: false, - keyword: "", - editingContestId: 0, - editTitle: "", - editDescription: "", - editProblemList: [], - editPassword: "", - editStartTime: "", - editEndTime: "", - editMode: "", - editShowSubmission: false, - editVisible: false, - editRealTimeRank: true, - editingProblemContestIndex: 0, - isGlobal: true, - allGroups: [], - showGlobalViewRadio: true, - admin_type: 1, - getNext: function () { - if (!vm.nextPage) - return; - getPageData(vm.page + 1); - }, - getPrevious: function () { - if (!vm.previousPage) - return; - getPageData(vm.page - 1); - }, - getBtnClass: function (btn) { - if (btn == "next") { - return vm.nextPage ? "btn btn-primary" : "btn btn-primary disabled"; - } - else { - return vm.previousPage ? "btn btn-primary" : "btn btn-primary disabled"; - } - }, - getPage: function (page_index) { - getPageData(page_index); - }, - showEditContestArea: function (contestId) { - if (vm.editingContestId && !confirm("如果继续将丢失未保存的信息,是否继续?")) - return; - if (contestId == vm.editingContestId) - vm.editingContestId = 0; - else { - vm.editingContestId = contestId; - vm.editTitle = vm.contestList[contestId - 1].title; - vm.editPassword = vm.contestList[contestId - 1].password; - vm.editStartTime = vm.contestList[contestId - 1].start_time.substring(0, 16).replace("T", " "); - vm.editEndTime = vm.contestList[contestId - 1].end_time.substring(0, 16).replace("T", " "); - vm.editMode = vm.contestList[contestId - 1].mode; - vm.editVisible = vm.contestList[contestId - 1].visible; - vm.editRealTimeRank = vm.contestList[contestId - 1].real_time_rank; - if (vm.contestList[contestId - 1].contest_type == 0) { //contest type == 0, contest in group - vm.isGlobal = false; - for (var i = 0; i < vm.allGroups.length; i++) { - vm.allGroups[i].isSelected = false; - } - for (var i = 0; i < vm.contestList[contestId - 1].groups.length; i++) { - var id = parseInt(vm.contestList[contestId - 1].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; - } - vm.editShowSubmission = vm.contestList[contestId - 1].show_user_submission; - editor("#editor").setValue(vm.contestList[contestId - 1].description); - vm.editingProblemContestIndex = 0; - } - }, - showEditProblemArea: function (contestId) { - if (vm.editingProblemContestIndex == contestId) { - vm.editingProblemContestIndex = 0; - return; - } - if (vm.editingContestId && !confirm("如果继续将丢失未保存的信息,是否继续?")) { - return; - } - $.ajax({ // Get the problem list of current contest - beforeSend: csrfTokenHeader, - url: "/api/admin/contest_problem/?contest_id=" + vm.contestList[contestId - 1].id, - method: "get", - dataType: "json", - success: function (data) { - if (!data.code) { - vm.editProblemList = data.data; - } - else { - bsAlert(data.data); - } - } - }); - vm.editingContestId = 0; - vm.editingProblemContestIndex = contestId; - vm.editMode = vm.contestList[contestId - 1].mode; - }, - addProblem: function () { - vm.$fire("up!showContestProblemPage", 0, vm.contestList[vm.editingProblemContestIndex - 1].id, vm.editMode); - }, - showProblemEditPage: function (el) { - vm.$fire("up!showContestProblemPage", el.id, vm.contestList[vm.editingProblemContestIndex - 1].id, vm.editMode); - }, - showSubmissionPage: function (el) { - var problemId = 0 - if (el) - problemId = el.id; - vm.$fire("up!showContestSubmissionPage", problemId, vm.contestList[vm.editingProblemContestIndex - 1].id, vm.editMode); - }, - addToProblemList: function (problem) { - var ajaxData = { - title: problem.title, - description: problem.description, - time_limit: problem.time_limit, - memory_limit: problem.memory_limit, - samples: [], - test_case_id: problem.test_case_id, - hint: problem.hint, - source: problem.contest.title, - visible: false, - tags: [], - input_description: problem.input_description, - output_description: problem.output_description, - difficulty: 0 - }; - for (var i = 0; i < problem.samples.length; i++) { - ajaxData.samples.push({input: problem.samples[i].input, output: problem.samples[i].output}) - } - $.ajax({ - beforeSend: csrfTokenHeader, - url: "/api/admin/problem/", - dataType: "json", - data: JSON.stringify(ajaxData), - method: "post", - contentType: "application/json;charset=UTF-8", - success: function (data) { - if (!data.code) { - bsAlert("题目添加成功!题目现在处于隐藏状态,请到题目列表手动修改,并添加分类和难度信息!"); - } - else { - bsAlert(data.data); - } - } - }); - } - }); - vm.$watch("showVisibleOnly", function () { - getPageData(1); - }) - } - getPageData(1); - - //init time picker - $("#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" - }); - - function getPageData(page) { - var url = "/api/admin/contest/?paging=true&page=" + page + "&page_size=10"; - if (vm.showVisibleOnly) - url += "&visible=true" - if (vm.keyword != "") - url += "&keyword=" + vm.keyword; - $.ajax({ - url: url, - dataType: "json", - method: "get", - success: function (data) { - if (!data.code) { - vm.contestList = data.data.results; - vm.totalPage = data.data.total_page; - vm.previousPage = data.data.previous_page; - vm.nextPage = data.data.next_page; - vm.page = page; - } - else { - bsAlert(data.data); - } - } - }); - } - - // Get group list - $.ajax({ - url: "/api/user/", - method: "get", - dataType: "json", - success: function (data) { - if (!data.code) { - var admin_type = data.data.admin_type; - vm.admin_type = 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; - } - for (var i = 0; i < data.data.length; i++) { - var item = data.data[i]; - item["isSelected"] = false; - vm.allGroups.push(item); - } - } - else { - bsAlert(data.data); - } - } - }); - } - }); - - }); - avalon.scan(); -}); \ No newline at end of file diff --git a/static/src/js/app/admin/contest/contestProblemList.js b/static/src/js/app/admin/contest/contestProblemList.js index 180e0b16..c2dc4330 100644 --- a/static/src/js/app/admin/contest/contestProblemList.js +++ b/static/src/js/app/admin/contest/contestProblemList.js @@ -8,6 +8,9 @@ require(["jquery", "avalon", "csrfToken", "bsAlert"], function ($, avalon, csrfT var vm = avalon.define({ $id: "contestProblemList", problemList: [], + + adminType: avalon.vmodels.admin.adminType, + showEditProblemPage: function (problemId) { avalon.vmodels.admin.contestProblemStatus = "edit"; avalon.vmodels.admin.problemId = problemId; @@ -19,6 +22,24 @@ require(["jquery", "avalon", "csrfToken", "bsAlert"], function ($, avalon, csrfT }, goBack: function(){ avalon.vmodels.admin.template_url = "template/contest/contest_list.html" + }, + + makeProblemPublic: function(problem){ + $.ajax({ + url: "/api/admin/contest_problem/public/", + method: "post", + dataType: "json", + data: {"problem_id": problem.id}, + success: function(response){ + if(response.code){ + bsAlert(response.data); + } + else{ + problem.is_public = true; + alert("公开题目成功,现在处于隐藏状态,请添加标签难度等信息。"); + } + } + }) } }); } diff --git a/template/src/admin/contest/problem_list.html b/template/src/admin/contest/problem_list.html index b0042db1..0fb852ac 100644 --- a/template/src/admin/contest/problem_list.html +++ b/template/src/admin/contest/problem_list.html @@ -27,6 +27,7 @@ {{ el.total_accepted_number }}/{{ el.total_submit_number }} +