diff --git a/template/src/admin/contest/problem_list.html b/template/src/admin/contest/problem_list.html
new file mode 100644
index 00000000..b0042db1
--- /dev/null
+++ b/template/src/admin/contest/problem_list.html
@@ -0,0 +1,34 @@
+
+
+
比赛题目列表
+
+
+
+
+
+ ID |
+ 题目 |
+ 创建时间 |
+ 可见 |
+ 通过次数/提交总数 |
+ |
+
+
+ {{ el.sort_index }} |
+ {{ el.title }} |
+ {{ el.create_time|date("yyyy-MM-dd HH:mm:ss")}} |
+ |
+ {{ el.total_accepted_number }}/{{ el.total_submit_number }} |
+
+
+ |
+
+
+
+
\ No newline at end of file
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 15/20] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=85=AC=E5=BC=80?=
=?UTF-8?q?=E6=AF=94=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 }} |
+
|