From 064effe3bfc5b480e65a3b801c3e6d3eedbd68db Mon Sep 17 00:00:00 2001 From: esp Date: Tue, 25 Aug 2015 14:19:44 +0800 Subject: [PATCH 01/34] =?UTF-8?q?[=E5=89=8D=E7=AB=AF]=E5=8E=BB=E6=8E=89joi?= =?UTF-8?q?nGroupRequest.js=E9=87=8C=E9=94=99=E8=AF=AF=E7=9A=84=E4=BE=9D?= =?UTF-8?q?=E8=B5=96,=E6=97=A7=E7=9A=84formvalidator=E5=B7=B2=E7=BB=8F?= =?UTF-8?q?=E8=A2=AB=E5=88=A0=E6=8E=89=E4=BA=86~[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/js/app/admin/group/joinGroupRequestList.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/src/js/app/admin/group/joinGroupRequestList.js b/static/src/js/app/admin/group/joinGroupRequestList.js index e565aad..8b9859a 100644 --- a/static/src/js/app/admin/group/joinGroupRequestList.js +++ b/static/src/js/app/admin/group/joinGroupRequestList.js @@ -1,4 +1,4 @@ -require(["jquery", "avalon", "csrfToken", "bsAlert", "formValidation"], function ($, avalon, csrfTokenHeader, bsAlert) { +require(["jquery", "avalon", "csrfToken", "bsAlert"], function ($, avalon, csrfTokenHeader, bsAlert) { // avalon:定义模式 group_list avalon.ready(function () { From a2c90093a10f816689aeb5344131565a075779b3 Mon Sep 17 00:00:00 2001 From: esp Date: Wed, 26 Aug 2015 11:28:26 +0800 Subject: [PATCH 02/34] =?UTF-8?q?[=E5=89=8D=E7=AB=AF]=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=AF=94=E8=B5=9B=E7=AE=A1=E7=90=86=E4=B8=AD=E6=9F=A5=E7=9C=8B?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E7=9A=84=E9=A1=B5=E9=9D=A2,=E6=9C=AA?= =?UTF-8?q?=E4=B8=8E=E5=90=8E=E7=AB=AF=E5=AF=B9=E6=8E=A5[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/js/app/admin/admin.js | 10 ++- .../src/js/app/admin/contest/contestList.js | 5 +- .../js/app/admin/contest/submissionList.js | 84 +++++++++++++++++++ template/src/admin/contest/contest_list.html | 5 +- .../src/admin/contest/submission_list.html | 34 ++++++++ 5 files changed, 133 insertions(+), 5 deletions(-) create mode 100644 static/src/js/app/admin/contest/submissionList.js create mode 100644 template/src/admin/contest/submission_list.html diff --git a/static/src/js/app/admin/admin.js b/static/src/js/app/admin/admin.js index bd0d51e..9246f7f 100644 --- a/static/src/js/app/admin/admin.js +++ b/static/src/js/app/admin/admin.js @@ -133,11 +133,17 @@ define("admin", ["jquery", "avalon"], function ($, avalon) { vm.template_url = "template/contest/edit_problem.html"; }); - vm.$watch("showContestListPage", function (problemId) { - vm.problemId = problemId; + vm.$watch("showContestListPage", function () { vm.template_url = "template/contest/contest_list.html"; }); + vm.$watch("showContestSubmissionPage", function (problemId, contestId, contestMode) { + vm.$problemId = problemId; + vm.$contestId = contestId; + vm.$contestMode = contestMode + vm.template_url = "template/contest/submission_list.html"; + }); + avalon.scan(); window.onhashchange = function () { diff --git a/static/src/js/app/admin/contest/contestList.js b/static/src/js/app/admin/contest/contestList.js index 9c1ba71..ae3606c 100644 --- a/static/src/js/app/admin/contest/contestList.js +++ b/static/src/js/app/admin/contest/contestList.js @@ -234,12 +234,15 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", vm.groupList[vm.choseGroupList[groupIndex].index].chose = false; vm.choseGroupList.remove(vm.choseGroupList[groupIndex]); }, - add_problem: function () { + addProblem: function () { vm.$fire("up!showContestProblemPage", 0, vm.contestList[vm.editingProblemContestIndex-1].id, vm.editMode); }, showProblemEditor: function(el) { vm.$fire("up!showContestProblemPage", el.id, vm.contestList[vm.editingProblemContestIndex-1].id, vm.editMode); }, + showSubmissionPage: function() { + vm.$fire("up!showContestSubmissionPage", el.id, vm.contestList[vm.editingProblemContestIndex-1].id, vm.editMode); + } getYesOrNo: function(yORn) { if (yORn) return "是"; return "否"; diff --git a/static/src/js/app/admin/contest/submissionList.js b/static/src/js/app/admin/contest/submissionList.js new file mode 100644 index 0000000..ff375b2 --- /dev/null +++ b/static/src/js/app/admin/contest/submissionList.js @@ -0,0 +1,84 @@ +require(["jquery", "avalon", "csrfToken", "bsAlert"], function ($, avalon, csrfTokenHeader, bsAlert) { + + avalon.ready(function () { + + if (avalon.vmodels.contestSubmissionList){ + var vm = avalon.vmodels.contestSubmissionList; + } + else { + + var vm = avalon.define({ + $id: "contestSubmissionList", + submissionList: [], + previousPage: 0, + nextPage: 0, + page: 1, + totalPage: 1, + results : { + 0: "Accepted", + 1: "Runtime Error", + 2: "Time Limit Exceeded", + 3: "Memory Limit Exceeded", + 4: "Compile Error", + 5: "Format Error", + 6: "Wrong Answer", + 7: "System Error", + 8: "Waiting" + }, + 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); + }, + showSubmissionDetailPage: function (submissionId) { + + }, + showProblemListPage: function(){ + vm.$fire("up!showProblemListPage"); + } + }); + } + + getPageData(1); + + function getPageData(page) { + var url = "/api/admin/submission/?paging=true&page=" + page + "&page_size=10&problem_id=" + avalon.vmodels.admin.problemId; + $.ajax({ + url: url, + dataType: "json", + method: "get", + success: function (data) { + if (!data.code) { + vm.submissionList = 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); + } + } + }); + } + + + }); + avalon.scan(); +}); \ No newline at end of file diff --git a/template/src/admin/contest/contest_list.html b/template/src/admin/contest/contest_list.html index 5c15629..b5e4d6a 100644 --- a/template/src/admin/contest/contest_list.html +++ b/template/src/admin/contest/contest_list.html @@ -30,7 +30,7 @@ {{ el.created_by.username }} 编辑 - 编辑问题 + 题目 @@ -158,7 +158,8 @@
- 添加 + 添加 + 查看提交 diff --git a/template/src/admin/contest/submission_list.html b/template/src/admin/contest/submission_list.html new file mode 100644 index 0000000..fc8ee7d --- /dev/null +++ b/template/src/admin/contest/submission_list.html @@ -0,0 +1,34 @@ +
+ +

提交列表

+ +
编号
+ + + + + + + + + + + + + + +
ID创建时间作者结果
{{ el.id }}{{ el.create_time|date("yyyy-MM-dd HH:mm:ss")}}{{ el.user }}{{ results[el.result] }} + 详情 +
+
+ 页数:{{ page }}/{{ totalPage }}   + + +
+
+ \ No newline at end of file From d2515bf886dbf83d8eac25d74881c833aaaf1b32 Mon Sep 17 00:00:00 2001 From: esp Date: Wed, 26 Aug 2015 11:35:21 +0800 Subject: [PATCH 03/34] =?UTF-8?q?[=E5=89=8D=E7=AB=AF-=E5=90=8E=E5=8F=B0]?= =?UTF-8?q?=E7=BB=8F=E8=BF=87=E6=B5=8B=E8=AF=95=E8=BF=98=E6=98=AF=E6=9C=89?= =?UTF-8?q?=E4=BA=9B=E9=97=AE=E9=A2=98(=E6=AF=94=E5=A6=82=E5=85=AC?= =?UTF-8?q?=E5=91=8A=E9=A1=B5=E9=9D=A2=E5=9C=A8=E9=87=8D=E5=A4=8D=E8=BD=BD?= =?UTF-8?q?=E5=85=A5=E5=90=8E=E4=BB=85=E6=98=BE=E7=A4=BA=E5=8F=AF=E8=A7=81?= =?UTF-8?q?=E7=9A=84ms-duplex-checked=E5=B0=B1=E5=A4=B1=E6=95=88=E4=BA=86,?= =?UTF-8?q?=E4=BD=86=E6=98=AF=E4=BB=85=E6=98=AF=E5=9C=A8=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=97=B6=E5=A4=B1=E6=95=88,=E4=BD=A0?= =?UTF-8?q?=E7=82=B9=E4=BB=96=E5=88=B0=E4=B9=9F=E8=BF=98=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?...)=E6=89=80=E4=BB=A5=E5=B9=B2=E8=84=86=E6=8A=8A=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E8=BF=99=E4=BA=9Bavalon=E9=83=BD=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E6=88=90=E4=B8=80=E6=A0=B7=E7=9A=84=E5=A4=84=E7=90=86=E4=BA=86?= =?UTF-8?q?[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../js/app/admin/announcement/announcement.js | 221 +++++++++--------- static/src/js/app/admin/group/group.js | 84 +++---- static/src/js/app/admin/group/groupDetail.js | 97 ++++---- .../app/admin/group/joinGroupRequestList.js | 162 ++++--------- static/src/js/app/admin/problem/problem.js | 1 + .../js/app/admin/problem/submissionList.js | 98 ++++---- static/src/js/app/admin/user/userList.js | 6 +- 7 files changed, 313 insertions(+), 356 deletions(-) diff --git a/static/src/js/app/admin/announcement/announcement.js b/static/src/js/app/admin/announcement/announcement.js index 7dd2051..e558585 100644 --- a/static/src/js/app/admin/announcement/announcement.js +++ b/static/src/js/app/admin/announcement/announcement.js @@ -1,127 +1,132 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "validator"], function ($, avalon, csrfTokenHeader, bsAlert, editor) { avalon.ready(function () { - avalon.vmodels.announcement = null; var createAnnouncementEditor = editor("#create-announcement-editor"); var editAnnouncementEditor = editor("#edit-announcement-editor"); + if (avalon.vmodels.announcement){ + var vm = avalon.vmodels.announcement; + announcementList = []; + } + else { - var vm = avalon.define({ - $id: "announcement", - //通用变量 - announcementList: [], // 公告列表数据项 - previousPage: 0, // 之前的页数 - nextPage: 0, // 之后的页数 - page: 1, // 当前页数 - editingAnnouncementId: 0, // 正在编辑的公告的ID, 为零说明未在编辑 - totalPage: 1, // 总页数 - showVisibleOnly: false, //仅显示可见公告 - // 编辑 - newTitle: "", - announcementVisible: 0, - showGlobalViewRadio: true, - isGlobal: true, - allGroups: [], - getState: function (el) { //获取公告当前状态,显示 - if (el.visible) - return "可见"; - else - return "隐藏"; - }, - getNext: function () { - if (!vm.nextPage) - return; - getPageData(vm.page + 1); - }, - getPrevious: function () { - if (!vm.previousPage) - return; - getPageData(vm.page - 1); - }, - getBtnClass: function (btnType) { - if (btnType == "next") { - return vm.nextPage ? "btn btn-primary" : "btn btn-primary disabled"; - } - else { - return vm.previousPage ? "btn btn-primary" : "btn btn-primary disabled"; - } + var vm = avalon.define({ + $id: "announcement", + //通用变量 + announcementList: [], // 公告列表数据项 + previousPage: 0, // 之前的页数 + nextPage: 0, // 之后的页数 + page: 1, // 当前页数 + editingAnnouncementId: 0, // 正在编辑的公告的ID, 为零说明未在编辑 + totalPage: 1, // 总页数 + showVisibleOnly: false, //仅显示可见公告 + // 编辑 + newTitle: "", + announcementVisible: 0, + showGlobalViewRadio: true, + isGlobal: true, + allGroups: [], + getState: function (el) { //获取公告当前状态,显示 + if (el.visible) + return "可见"; + else + return "隐藏"; + }, + getNext: function () { + if (!vm.nextPage) + return; + getPageData(vm.page + 1); + }, + getPrevious: function () { + if (!vm.previousPage) + return; + getPageData(vm.page - 1); + }, + getBtnClass: function (btnType) { + if (btnType == "next") { + return vm.nextPage ? "btn btn-primary" : "btn btn-primary disabled"; + } + else { + return vm.previousPage ? "btn btn-primary" : "btn btn-primary disabled"; + } - }, - editAnnouncement: function (announcement) { - vm.newTitle = announcement.title; - editAnnouncementEditor.setValue(announcement.content); - vm.announcementVisible = announcement.visible; - if (vm.editingAnnouncementId == announcement.id) + }, + editAnnouncement: function (announcement) { + vm.newTitle = announcement.title; + editAnnouncementEditor.setValue(announcement.content); + vm.announcementVisible = announcement.visible; + if (vm.editingAnnouncementId == announcement.id) + vm.editingAnnouncementId = 0; + else + vm.editingAnnouncementId = announcement.id; + vm.isGlobal = announcement.is_global; + for (var i = 0; i < announcement.groups.length; i++) { + for (var j = 0; j < vm.allGroups.length; j++) { + if (announcement.groups[i] == vm.allGroups[j].id) { + vm.allGroups[j].isSelected = true; + } + } + } + editAnnouncementEditor.focus(); + }, + cancelEdit: function () { vm.editingAnnouncementId = 0; - else - vm.editingAnnouncementId = announcement.id; - vm.isGlobal = announcement.is_global; - for (var i = 0; i < announcement.groups.length; i++) { - for (var j = 0; j < vm.allGroups.length; j++) { - if (announcement.groups[i] == vm.allGroups[j].id) { - vm.allGroups[j].isSelected = true; + }, + submitChange: function () { + var title = vm.newTitle; + var content = editAnnouncementEditor.getValue(); + + if (content == "" || title == "") { + bsAlert("标题和内容都不能为空"); + return false; + } + + 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); + } } } - } - editAnnouncementEditor.focus(); - }, - cancelEdit: function () { - vm.editingAnnouncementId = 0; - }, - submitChange: function () { - var title = vm.newTitle; - var content = editAnnouncementEditor.getValue(); - if (content == "" || title == "") { - bsAlert("标题和内容都不能为空"); - return false; - } - - 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); - } + if (!vm.isGlobal && !selectedGroups.length) { + bsAlert("请至少选择一个小组"); + return false; } - } - if (!vm.isGlobal && !selectedGroups.length) { - bsAlert("请至少选择一个小组"); - return false; - } - - $.ajax({ - beforeSend: csrfTokenHeader, - url: "/api/admin/announcement/", - contentType: "application/json", - dataType: "json", - method: "put", - data: JSON.stringify({ - id: vm.editingAnnouncementId, - title: title, - content: content, - visible: vm.announcementVisible, - is_global: vm.isGlobal, - groups: selectedGroups - }), - success: function (data) { - if (!data.code) { - bsAlert("修改成功"); - vm.editingAnnouncementId = 0; - getPageData(1); + $.ajax({ + beforeSend: csrfTokenHeader, + url: "/api/admin/announcement/", + contentType: "application/json", + dataType: "json", + method: "put", + data: JSON.stringify({ + id: vm.editingAnnouncementId, + title: title, + content: content, + visible: vm.announcementVisible, + is_global: vm.isGlobal, + groups: selectedGroups + }), + success: function (data) { + if (!data.code) { + bsAlert("修改成功"); + vm.editingAnnouncementId = 0; + getPageData(1); + } + else { + bsAlert(data.data); + } } - else { - bsAlert(data.data); - } - } - }); + }); - } - }); - vm.$watch("showVisibleOnly", function () { - getPageData(1); - }); + } + }); + vm.$watch("showVisibleOnly", function () { + getPageData(1); + }); + } getPageData(1); diff --git a/static/src/js/app/admin/group/group.js b/static/src/js/app/admin/group/group.js index 470f9ca..7327dba 100644 --- a/static/src/js/app/admin/group/group.js +++ b/static/src/js/app/admin/group/group.js @@ -1,47 +1,53 @@ require(["jquery", "avalon", "csrfToken", "bsAlert"], function ($, avalon, csrfTokenHeader, bsAlert) { - avalon.ready(function () { - avalon.vmodels.group = null; - var vm = avalon.define({ - $id: "group", - //通用变量 - groupList: [], // 用户列表数据项 - previousPage: 0, // 之前的页数 - nextPage: 0, // 之后的页数 - page: 1, // 当前页数 - totalPage: 1, // 总页数 - keyword: "", + //avalon.vmodels.group = null; + if (avalon.vmodels.group) { + var vm = avalon.vmodels.group; + } + else { - getNext: function () { - if (!vm.nextPage) - return; - getPageData(vm.page + 1); - }, - getPrevious: function () { - if (!vm.previousPage) - return; - getPageData(vm.page - 1); - }, - getBtnClass: function (btnType) { - if (btnType == "next") { - return vm.nextPage ? "btn btn-primary" : "btn btn-primary disabled"; - } - else { - return vm.previousPage ? "btn btn-primary" : "btn btn-primary disabled"; - } + var vm = avalon.define({ + $id: "group", + //通用变量 + groupList: [], // 用户列表数据项 + previousPage: 0, // 之前的页数 + nextPage: 0, // 之后的页数 + page: 1, // 当前页数 + totalPage: 1, // 总页数 + keyword: "", + + getNext: function () { + if (!vm.nextPage) + return; + getPageData(vm.page + 1); + }, + getPrevious: function () { + if (!vm.previousPage) + return; + getPageData(vm.page - 1); + }, + getBtnClass: function (btnType) { + if (btnType == "next") { + return vm.nextPage ? "btn btn-primary" : "btn btn-primary disabled"; + } + else { + return vm.previousPage ? "btn btn-primary" : "btn btn-primary disabled"; + } + + }, + search: function(){ + getPageData(1); + }, + getGroupSettingString: function (setting) { + return {0: "允许任何人加入", 1: "提交请求后管理员审核", 2: "不允许任何人加入"}[setting] + }, + showGroupDetailPage: function (groupId) { + vm.$fire("up!showGroupDetailPage", groupId); + } + }); + } - }, - search: function(){ - getPageData(1); - }, - getGroupSettingString: function (setting) { - return {0: "允许任何人加入", 1: "提交请求后管理员审核", 2: "不允许任何人加入"}[setting] - }, - showGroupDetailPage: function (groupId) { - vm.$fire("up!showGroupDetailPage", groupId); - } - }); getPageData(1); function getPageData(page) { diff --git a/static/src/js/app/admin/group/groupDetail.js b/static/src/js/app/admin/group/groupDetail.js index cddc755..c06f9ce 100644 --- a/static/src/js/app/admin/group/groupDetail.js +++ b/static/src/js/app/admin/group/groupDetail.js @@ -3,55 +3,60 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "validator"], function ($, // avalon:定义模式 group_list avalon.ready(function () { - avalon.vmodels.groupDetail = null; - var vm = avalon.define({ - $id: "groupDetail", - //通用变量 - memberList: [], - previousPage: 0, - nextPage: 0, - page: 1, - totalPage: 1, - name: "", - description: "", - checkedSetting: "0", - 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"; - } - }, + if (avalon.vmodels.groupDetail) { + var vm = avalon.vmodels.groupDetail; + } + else { + var vm = avalon.define({ + $id: "groupDetail", + //通用变量 + memberList: [], + previousPage: 0, + nextPage: 0, + page: 1, + totalPage: 1, + name: "", + description: "", + checkedSetting: "0", - removeMember: function (relation) { - $.ajax({ - beforeSend: csrfTokenHeader, - url: "/api/admin/group_member/", - method: "put", - data: JSON.stringify({group_id: relation.group, members: [relation.user.id]}), - contentType: "application/json", - success: function (data) { - vm.memberList.remove(relation); - bsAlert(data.data); + 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"; } - }) - }, - showGroupListPage: function () { - vm.$fire("up!showGroupListPage"); - } - }); + else { + return vm.previousPage ? "btn btn-primary" : "btn btn-primary disabled"; + } + }, + + removeMember: function (relation) { + $.ajax({ + beforeSend: csrfTokenHeader, + url: "/api/admin/group_member/", + method: "put", + data: JSON.stringify({group_id: relation.group, members: [relation.user.id]}), + contentType: "application/json", + success: function (data) { + vm.memberList.remove(relation); + bsAlert(data.data); + } + }) + }, + showGroupListPage: function () { + vm.$fire("up!showGroupListPage"); + } + }); + } avalon.scan(); getPageData(1); diff --git a/static/src/js/app/admin/group/joinGroupRequestList.js b/static/src/js/app/admin/group/joinGroupRequestList.js index 8b9859a..b178a80 100644 --- a/static/src/js/app/admin/group/joinGroupRequestList.js +++ b/static/src/js/app/admin/group/joinGroupRequestList.js @@ -2,50 +2,56 @@ require(["jquery", "avalon", "csrfToken", "bsAlert"], function ($, avalon, csrfT // avalon:定义模式 group_list avalon.ready(function () { - avalon.vmodels.requestList = null; - var vm = avalon.define({ - $id: "requestList", - //通用变量 - requestList: [], // 列表数据项 - previousPage: 0, // 之前的页数 - nextPage: 0, // 之后的页数 - page: 1, // 当前页数 - totalPage: 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); - }, - processRequest: function(request, status){ - $.ajax({ - beforeSend: csrfTokenHeader, - url: "/api/admin/join_group_request/", - method: "put", - data: {request_id: request.id, status: status}, - success: function(data){ - vm.requestList.remove(request); - bsAlert(data.data); + if (avalon.vmodels.requestList) { + var vm = avalon.vmodels.requestList; + } + else { + + var vm = avalon.define({ + $id: "requestList", + //通用变量 + requestList: [], // 列表数据项 + previousPage: 0, // 之前的页数 + nextPage: 0, // 之后的页数 + page: 1, // 当前页数 + totalPage: 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); + }, + processRequest: function(request, status){ + $.ajax({ + beforeSend: csrfTokenHeader, + url: "/api/admin/join_group_request/", + method: "put", + data: {request_id: request.id, status: status}, + success: function(data){ + vm.requestList.remove(request); + bsAlert(data.data); + } + }) + } + }); + } avalon.scan(); getPageData(1); @@ -72,78 +78,6 @@ require(["jquery", "avalon", "csrfToken", "bsAlert"], function ($, avalon, csrfT }); } - /*$("#edit_user-form") - .formValidation({ - framework: "bootstrap", - fields: { - username: { - validators: { - notEmpty: { - message: "请填写用户名" - }, - stringLength: { - min: 3, - max: 30, - message: '用户名长度必须在3到30位之间' - } - } - }, - real_name: { - validators: { - notEmpty: { - message: "请填写真实姓名" - } - } - }, - email: { - validators: { - notEmpty: { - message: "请填写电子邮箱邮箱地址" - }, - emailAddress: { - message: "请填写有效的邮箱地址" - } - } - }, - password: { - validators: { - stringLength: { - min: 6, - max: 30, - message: '密码长度必须在6到30位之间' - } - } - } - } - } - ).on('success.form.fv', function (e) { - e.preventDefault(); - var data = { - username: vm.username, - real_name: vm.real_name, - email: vm.email, - id: vm.id, - admin_type: vm.admin_type - }; - if ($("#password").val() !== "") - data.password = $("#password").val(); - $.ajax({ - beforeSend: csrfHeader, - url: "/api/admin/user/", - data: data, - dataType: "json", - method: "put", - success: function (data) { - if (!data.code) { - bsAlert("提交成功!"); - getPageData(1); - $("#password").val(""); - } else { - bsAlert(data.data); - } - } - }) - });*/ }); }); \ No newline at end of file diff --git a/static/src/js/app/admin/problem/problem.js b/static/src/js/app/admin/problem/problem.js index 2632ebf..c11d7c7 100644 --- a/static/src/js/app/admin/problem/problem.js +++ b/static/src/js/app/admin/problem/problem.js @@ -3,6 +3,7 @@ require(["jquery", "avalon", "csrfToken", "bsAlert"], function ($, avalon, csrfT avalon.ready(function () { if(avalon.vmodels.problemList){ vm = avalon.vmodels.problemList; + problemList = []; } else { var vm = avalon.define({ diff --git a/static/src/js/app/admin/problem/submissionList.js b/static/src/js/app/admin/problem/submissionList.js index 405cffa..1af2e6c 100644 --- a/static/src/js/app/admin/problem/submissionList.js +++ b/static/src/js/app/admin/problem/submissionList.js @@ -1,53 +1,59 @@ require(["jquery", "avalon", "csrfToken", "bsAlert"], function ($, avalon, csrfTokenHeader, bsAlert) { avalon.ready(function () { - avalon.vmodels.submissionList = null; - var vm = avalon.define({ - $id: "submissionList", - submissionList: [], - previousPage: 0, - nextPage: 0, - page: 1, - totalPage: 1, - results : { - 0: "Accepted", - 1: "Runtime Error", - 2: "Time Limit Exceeded", - 3: "Memory Limit Exceeded", - 4: "Compile Error", - 5: "Format Error", - 6: "Wrong Answer", - 7: "System Error", - 8: "Waiting" - }, - 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); - }, - showSubmissionDetailPage: function (submissionId) { - }, - showProblemListPage: function(){ - vm.$fire("up!showProblemListPage"); - } - }); + if (avalon.vmodels.submissionList){ + var vm = avalon.vmodels.submissionList; + } + else { + + var vm = avalon.define({ + $id: "submissionList", + submissionList: [], + previousPage: 0, + nextPage: 0, + page: 1, + totalPage: 1, + results : { + 0: "Accepted", + 1: "Runtime Error", + 2: "Time Limit Exceeded", + 3: "Memory Limit Exceeded", + 4: "Compile Error", + 5: "Format Error", + 6: "Wrong Answer", + 7: "System Error", + 8: "Waiting" + }, + 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); + }, + showSubmissionDetailPage: function (submissionId) { + + }, + showProblemListPage: function(){ + vm.$fire("up!showProblemListPage"); + } + }); + } getPageData(1); diff --git a/static/src/js/app/admin/user/userList.js b/static/src/js/app/admin/user/userList.js index 3f80c89..d2949f0 100644 --- a/static/src/js/app/admin/user/userList.js +++ b/static/src/js/app/admin/user/userList.js @@ -3,12 +3,12 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "validator"], function ($, // avalon:定义模式 userList avalon.ready(function () { - //avalon.vmodels.userList = null; + if (avalon.vmodels.userList) { var vm = avalon.vmodels.userList; // initialize avalon object - userList = []; previousPage= 0; nextPage= 0; page = 1; - editingUserId= 0; totalPage = 1; keyword= ""; showAdminOnly= false; + userList = []; //previousPage= 0; nextPage= 0; page = 1; + //editingUserId= 0; totalPage = 1; keyword= ""; showAdminOnly= false; //user editor fields username= ""; realName= ""; email= ""; adminType= 0; id= 0; } From 1c835cfa2e42a411e47b03c1d74a44b621d8cbc5 Mon Sep 17 00:00:00 2001 From: esp Date: Wed, 26 Aug 2015 12:59:14 +0800 Subject: [PATCH 04/34] =?UTF-8?q?[API]=E6=B7=BB=E5=8A=A0=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=AF=94=E8=B5=9B=E6=8F=90=E4=BA=A4adminAPI^C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest_submission/views.py | 38 +++++++++++++++++++++++++++++++++++-- oj/urls.py | 4 ++-- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/contest_submission/views.py b/contest_submission/views.py index 0dba7cb..652047e 100644 --- a/contest_submission/views.py +++ b/contest_submission/views.py @@ -21,6 +21,7 @@ from utils.shortcuts import serializer_invalid_response, error_response, success from submission.models import Submission from .serializers import CreateContestSubmissionSerializer +from submission.serializers import SubmissionSerializer class ContestSubmissionAPIView(APIView): @@ -76,7 +77,8 @@ def contest_problem_my_submissions_list_page(request, contest_id, contest_proble contest_problem = ContestProblem.objects.get(id=contest_problem_id, visible=True) except Problem.DoesNotExist: return error_page(request, u"比赛问题不存在") - submissions = Submission.objects.filter(user_id=request.user.id, problem_id=contest_problem.id).order_by("-create_time"). \ + submissions = Submission.objects.filter(user_id=request.user.id, problem_id=contest_problem.id).order_by( + "-create_time"). \ values("id", "result", "create_time", "accepted_answer_time", "language") return render(request, "oj/contest/my_submissions_list.html", {"submissions": submissions, "problem": contest_problem}) @@ -112,4 +114,36 @@ def contest_problem_submissions_list_page(request, contest_id, page=1): return render(request, "oj/contest/submissions_list.html", {"submissions": current_page, "page": int(page), "previous_page": previous_page, "next_page": next_page, "start_id": int(page) * 20 - 20, - "contest": contest}) \ No newline at end of file + "contest": contest}) + + +class ContestSubmissionAdminAPIView(APIView): + def get(self, request): + """ + 查询比赛提交,单个比赛题目提交的adminAPI + --- + response_serializer: SubmissionSerializer + """ + problem_id = request.GET.get("problem_id", None) + contest_id = request.GET.get("contest_id", None) + if contest_id: + try: + contest = Contest.objects.get(pk=contest_id) + except Contest.DoesNotExist: + return error_response(u"比赛不存在!") + if request.user.admin_type != SUPER_ADMIN and contest.created_by != request.user: + return error_response(u"您无权查看该信息!") + submissions = Submission.objects.filter(contest_id=contest_id).order_by("-create_time") + else: + if problem_id: + try: + contest_problem = ContestProblem.objects.get(pk=problem_id) + except ContestProblem.DoesNotExist: + return error_response(u"问题不存在!") + submissions = Submission.objects.filter(contest_id=contest_problem.contest_id).order_by("-create_time") + else: + return error_response(u"参数错误!") + if problem_id: + submissions = submissions.filter(problem_id=problem_id) + + return paginate(request, submissions, SubmissionSerializer) diff --git a/oj/urls.py b/oj/urls.py index adb7ef0..74a44c2 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -17,7 +17,7 @@ from admin.views import AdminTemplateView from problem.views import TestCaseUploadAPIView, ProblemTagAdminAPIView, ProblemAdminAPIView from submission.views import SubmissionAPIView, SubmissionAdminAPIView -from contest_submission.views import ContestSubmissionAPIView +from contest_submission.views import ContestSubmissionAPIView, ContestSubmissionAdminAPIView from monitor.views import QueueLengthMonitorAPIView from contest_submission.views import contest_problem_my_submissions_list_page @@ -65,7 +65,7 @@ urlpatterns = [ name="join_group_request_admin_api"), url(r'^api/admin/submission/$', SubmissionAdminAPIView.as_view(), name="submission_admin_api_view"), url(r'^api/admin/monitor/$', QueueLengthMonitorAPIView.as_view(), name="queue_length_monitor_api"), - + url(r'^api/admin/contest_submission/$', ContestSubmissionAdminAPIView.as_view(), name="contest_submission_admin_api_view"), url(r'^contest/(?P\d+)/problem/(?P\d+)/$', "contest.views.contest_problem_page", From 3e9a212732c01160d815e2f0e0128a045ff7fbd7 Mon Sep 17 00:00:00 2001 From: esp Date: Wed, 26 Aug 2015 13:10:45 +0800 Subject: [PATCH 05/34] =?UTF-8?q?[BUG]=E5=B0=91=E4=BA=86=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E9=80=97=E5=8F=B7....[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/js/app/admin/contest/contestList.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/src/js/app/admin/contest/contestList.js b/static/src/js/app/admin/contest/contestList.js index ae3606c..5dc9bbb 100644 --- a/static/src/js/app/admin/contest/contestList.js +++ b/static/src/js/app/admin/contest/contestList.js @@ -242,7 +242,7 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", }, showSubmissionPage: function() { vm.$fire("up!showContestSubmissionPage", el.id, vm.contestList[vm.editingProblemContestIndex-1].id, vm.editMode); - } + }, getYesOrNo: function(yORn) { if (yORn) return "是"; return "否"; From 48c237872c6c545958ba0a16e6f1eacb66f4a32a Mon Sep 17 00:00:00 2001 From: esp Date: Wed, 26 Aug 2015 13:27:51 +0800 Subject: [PATCH 06/34] =?UTF-8?q?[=E5=89=8D=E7=AB=AF-=E5=90=8E=E5=8F=B0]?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8F=90=E4=BA=A4=E5=88=97=E8=A1=A8=E9=87=8C?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E9=A1=B5=E9=9D=A2=E7=9A=84url(=E5=BA=94?= =?UTF-8?q?=E5=AF=B9urls.py=E7=9A=84=E6=94=B9=E5=8A=A8)[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/src/admin/contest/submission_list.html | 4 ++-- template/src/admin/problem/submission_list.html | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/template/src/admin/contest/submission_list.html b/template/src/admin/contest/submission_list.html index fc8ee7d..008f4eb 100644 --- a/template/src/admin/contest/submission_list.html +++ b/template/src/admin/contest/submission_list.html @@ -21,7 +21,7 @@ {{ el.user }} {{ results[el.result] }} - 详情 + 详情 @@ -31,4 +31,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/template/src/admin/problem/submission_list.html b/template/src/admin/problem/submission_list.html index 70aacb8..28eaebd 100644 --- a/template/src/admin/problem/submission_list.html +++ b/template/src/admin/problem/submission_list.html @@ -21,7 +21,7 @@ {{ el.user }} {{ results[el.result] }} - 详情 + 详情 From 22f344e6158f1dd519167f89e52b75189a0992b8 Mon Sep 17 00:00:00 2001 From: esp Date: Wed, 26 Aug 2015 13:52:12 +0800 Subject: [PATCH 07/34] =?UTF-8?q?[=E5=89=8D=E7=AB=AF]=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E6=AF=94=E8=B5=9B=E5=88=97=E8=A1=A8=E4=B8=AD,=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B=E6=AF=94=E8=B5=9B=E6=8F=90=E4=BA=A4=E7=9A=84=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E9=A1=B5=E9=9D=A2=E4=B8=8Eapi=E7=9A=84=E5=AF=B9?= =?UTF-8?q?=E6=8E=A5[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/js/app/admin/contest/contestList.js | 9 ++++++--- static/src/js/app/admin/contest/submissionList.js | 10 +++++++--- template/src/admin/contest/contest_list.html | 8 +++++--- template/src/admin/contest/submission_list.html | 5 ++++- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/static/src/js/app/admin/contest/contestList.js b/static/src/js/app/admin/contest/contestList.js index 5dc9bbb..036b344 100644 --- a/static/src/js/app/admin/contest/contestList.js +++ b/static/src/js/app/admin/contest/contestList.js @@ -237,11 +237,14 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", addProblem: function () { vm.$fire("up!showContestProblemPage", 0, vm.contestList[vm.editingProblemContestIndex-1].id, vm.editMode); }, - showProblemEditor: function(el) { + showProblemEditPage: function(el) { vm.$fire("up!showContestProblemPage", el.id, vm.contestList[vm.editingProblemContestIndex-1].id, vm.editMode); }, - showSubmissionPage: function() { - vm.$fire("up!showContestSubmissionPage", 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); }, getYesOrNo: function(yORn) { if (yORn) return "是"; diff --git a/static/src/js/app/admin/contest/submissionList.js b/static/src/js/app/admin/contest/submissionList.js index ff375b2..34fd591 100644 --- a/static/src/js/app/admin/contest/submissionList.js +++ b/static/src/js/app/admin/contest/submissionList.js @@ -44,13 +44,15 @@ require(["jquery", "avalon", "csrfToken", "bsAlert"], function ($, avalon, csrfT } }, getPage: function (page_index) { + if (!page_index) + var page_index = vm.page; getPageData(page_index); }, showSubmissionDetailPage: function (submissionId) { }, - showProblemListPage: function(){ - vm.$fire("up!showProblemListPage"); + goBack: function(check){ + vm.$fire("up!showContestListPage"); } }); } @@ -58,7 +60,9 @@ require(["jquery", "avalon", "csrfToken", "bsAlert"], function ($, avalon, csrfT getPageData(1); function getPageData(page) { - var url = "/api/admin/submission/?paging=true&page=" + page + "&page_size=10&problem_id=" + avalon.vmodels.admin.problemId; + var url = "/api/admin/contest_submission/?paging=true&page=" + page + "&page_size=10&contest_id=" + avalon.vmodels.admin.$contestId; + if (avalon.vmodels.admin.$problemId) + url += "&problem_id=" + avalon.vmodels.admin.$problemId $.ajax({ url: url, dataType: "json", diff --git a/template/src/admin/contest/contest_list.html b/template/src/admin/contest/contest_list.html index b5e4d6a..1b09534 100644 --- a/template/src/admin/contest/contest_list.html +++ b/template/src/admin/contest/contest_list.html @@ -158,8 +158,8 @@
- 添加 - 查看提交 + 添加题目 + 查看提交 @@ -177,7 +177,9 @@
编号{{ el.create_time|date("yyyy-MM-dd HH:mm:ss") }} 编辑 + ms-click="showProblemEditPage(el)">编辑 + 提交
diff --git a/template/src/admin/contest/submission_list.html b/template/src/admin/contest/submission_list.html index 008f4eb..1847408 100644 --- a/template/src/admin/contest/submission_list.html +++ b/template/src/admin/contest/submission_list.html @@ -1,11 +1,14 @@

提交列表

+ + 刷新 + From 42873d3d84d52291ed11e73a7368c5ffff15552b Mon Sep 17 00:00:00 2001 From: esp Date: Thu, 27 Aug 2015 14:01:09 +0800 Subject: [PATCH 08/34] =?UTF-8?q?[=E5=90=8E=E7=AB=AF]=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BA=86contest=5Fsubmission=20Admin=20API=E7=9A=84bug,?= =?UTF-8?q?=E5=B9=B6=E5=86=99=E4=BA=86=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest_submission/tests.py | 83 ++++++++++++++++++++++++++++++++++++- contest_submission/views.py | 2 + 2 files changed, 84 insertions(+), 1 deletion(-) diff --git a/contest_submission/tests.py b/contest_submission/tests.py index 7ce503c..b1eace1 100644 --- a/contest_submission/tests.py +++ b/contest_submission/tests.py @@ -1,3 +1,84 @@ -from django.test import TestCase +import json + +from django.core.urlresolvers import reverse +from account.models import User, ADMIN, SUPER_ADMIN + +from contest.models import Contest, ContestProblem +from submission.models import Submission +from rest_framework.test import APITestCase, APIClient + # Create your tests here. + +class SubmissionAPITest(APITestCase): + def setUp(self): + self.client = APIClient() + self.url = reverse('contest_submission_admin_api_view') + self.userA = User.objects.create(username="test1", admin_type=ADMIN) + self.userA.set_password("testaa") + self.userA.save() + self.userS = User.objects.create(username="test2", admin_type=SUPER_ADMIN) + self.userS.set_password("testbb") + self.userS.save() + self.global_contest = Contest.objects.create(title="titlex", description="descriptionx", mode=1, + contest_type=2, show_rank=True, show_user_submission=True, + start_time="2015-08-15T10:00:00.000Z", + end_time="2015-08-15T12:00:00.000Z", + password="aacc", created_by=self.userS + ) + self.problem = ContestProblem.objects.create(title="title1", + description="description1", + input_description="input1_description", + output_description="output1_description", + test_case_id="1", + sort_index="1", + samples=json.dumps([{"input": "1 1", "output": "2"}]), + time_limit=100, + memory_limit=1000, + hint="hint1", + contest=self.global_contest, + created_by=self.userS) + self.submission = Submission.objects.create(user_id=self.userA.id, + language=1, + code='#include "stdio.h"\nint main(){\n\treturn 0;\n}', + problem_id=self.problem.id) + self.submissionS = Submission.objects.create(user_id=self.userS.id, + language=2, + code='#include "stdio.h"\nint main(){\n\treturn 0;\n}', + problem_id=self.problem.id) + + def test_submission_contest_does_not_exist(self): + self.client.login(username="test2", password="testbb") + response = self.client.get(self.url + "?contest_id=99") + self.assertEqual(response.data["code"], 1) + + def test_submission_contest_parameter_error(self): + self.client.login(username="test2", password="testbb") + response = self.client.get(self.url) + self.assertEqual(response.data["code"], 1) + + def test_submission_access_denied(self): + self.client.login(username="test1", password="testaa") + response = self.client.get(self.url + "?problem_id=" + str(self.problem.id)) + self.assertEqual(response.data["code"], 1) + + def test_submission_access_denied_with_contest_id(self): + self.client.login(username="test1", password="testaa") + response = self.client.get(self.url + "?contest_id=" + str(self.global_contest.id)) + self.assertEqual(response.data["code"], 1) + + def test_get_submission_successfully(self): + self.client.login(username="test2", password="testbb") + response = self.client.get( + self.url + "?contest_id=" + str(self.global_contest.id) + "&problem_id=" + str(self.problem.id)) + self.assertEqual(response.data["code"], 0) + + def test_get_submission_successfully_problem(self): + self.client.login(username="test2", password="testbb") + response = self.client.get(self.url + "?problem_id=" + str(self.problem.id)) + self.assertEqual(response.data["code"], 0) + + def test_get_submission_problem_do_not_exist(self): + self.client.login(username="test2", password="testbb") + response = self.client.get(self.url + "?problem_id=9999") + self.assertEqual(response.data["code"], 1) diff --git a/contest_submission/views.py b/contest_submission/views.py index 652047e..003ad8a 100644 --- a/contest_submission/views.py +++ b/contest_submission/views.py @@ -140,6 +140,8 @@ class ContestSubmissionAdminAPIView(APIView): contest_problem = ContestProblem.objects.get(pk=problem_id) except ContestProblem.DoesNotExist: return error_response(u"问题不存在!") + if request.user.admin_type != SUPER_ADMIN and contest_problem.contest.created_by != request.user: + return error_response(u"您无权查看该信息!") submissions = Submission.objects.filter(contest_id=contest_problem.contest_id).order_by("-create_time") else: return error_response(u"参数错误!") From 235e042b5eaeb06f9b4ba130bd311fea157dcdb5 Mon Sep 17 00:00:00 2001 From: esp Date: Thu, 27 Aug 2015 14:02:10 +0800 Subject: [PATCH 09/34] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=BA=86=E6=88=91?= =?UTF-8?q?=E7=9A=84=E6=8F=90=E4=BA=A4=E9=A1=B5=E9=9D=A2=E4=B8=8D=E6=81=B0?= =?UTF-8?q?=E5=BD=93=E7=9A=84=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- submission/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submission/tests.py b/submission/tests.py index e745bde..04f0a86 100644 --- a/submission/tests.py +++ b/submission/tests.py @@ -41,7 +41,7 @@ class SubmissionsListPageTest(TestCase): def test_submissionsListPage_page_not_exist(self): self.client.login(username="gogoing", password="666666") - response = self.client.get('/submissions/5/') + response = self.client.get('/submissions/999/') self.assertTemplateUsed(response, "utils/error.html") def test_submissionsListPage_have_no_submission(self): From e7aac0a6e03295d1ffa039b556ebaa460555fdfc Mon Sep 17 00:00:00 2001 From: esp Date: Thu, 27 Aug 2015 14:03:48 +0800 Subject: [PATCH 10/34] =?UTF-8?q?[=E5=89=8D=E7=AB=AF]=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BA=86=E6=B7=BB=E5=8A=A0=E6=AF=94=E8=B5=9B,=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=85=AC=E5=91=8A=E7=9A=84=E5=90=8E=E5=8F=B0=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E5=AF=B9=E8=B6=85=E7=BA=A7=E7=AE=A1=E7=90=86=E5=91=98?= =?UTF-8?q?=E4=B9=9F=E6=8F=90=E7=A4=BA=E6=9D=83=E9=99=90=E4=B8=8D=E8=B6=B3?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../js/app/admin/announcement/announcement.js | 46 ++++++++++--------- static/src/js/app/admin/contest/addContest.js | 1 - 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/static/src/js/app/admin/announcement/announcement.js b/static/src/js/app/admin/announcement/announcement.js index e558585..9b6f2d2 100644 --- a/static/src/js/app/admin/announcement/announcement.js +++ b/static/src/js/app/admin/announcement/announcement.js @@ -130,39 +130,41 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "validator"], getPageData(1); - $.ajax({ - url: "/api/admin/group/", - method: "get", - dataType: "json", - success: function (data) { - if (!data.code) { - if (!data.data.length) { - 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); - } - } - }); - $.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; + } + 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); + } + } + }); } }); diff --git a/static/src/js/app/admin/contest/addContest.js b/static/src/js/app/admin/contest/addContest.js index 437fbdf..d4beadb 100644 --- a/static/src/js/app/admin/contest/addContest.js +++ b/static/src/js/app/admin/contest/addContest.js @@ -131,7 +131,6 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "date success: function (data) { if (!data.code) { if (!data.data.length) { - bsAlert("您的用户权限只能创建组内比赛,但是您还没有创建过小组"); return; } for (var i = 0; i < data.data.length; i++) { From 9b23a45926c7fd1433ef7f573c62ed5bccd3908c Mon Sep 17 00:00:00 2001 From: esp Date: Thu, 27 Aug 2015 14:40:33 +0800 Subject: [PATCH 11/34] =?UTF-8?q?[=E5=89=8D=E7=AB=AF-=E5=90=8E=E5=8F=B0]?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E4=BA=86=E5=AF=B9=E4=BA=8E=E5=AF=8C=E6=96=87?= =?UTF-8?q?=E6=9C=AC=E7=BC=96=E8=BE=91=E5=99=A8=E7=9A=84=E9=9D=9E=E7=A9=BA?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E7=9A=84=E6=8F=90=E7=A4=BA=E5=AD=97=E4=BD=93?= =?UTF-8?q?=E5=A4=A7=E5=B0=8F=E5=92=8C=E9=A2=9C=E8=89=B2,=E5=B9=B6?= =?UTF-8?q?=E5=86=99=E5=85=A5css,=E4=BD=86=E6=98=AF=E5=AF=B9=E4=BA=8E?= =?UTF-8?q?=E5=85=AC=E5=91=8A=E7=AE=A1=E7=90=86=E9=A1=B5=E4=BB=8D=E7=84=B6?= =?UTF-8?q?=E4=BF=9D=E6=8C=81=E7=AE=80=E5=8D=95=E7=9A=84=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E9=A3=8E=E6=A0=BC(bsAlert)[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/css/admin.css | 9 +++++++++ template/src/admin/contest/add_contest.html | 4 +--- template/src/admin/contest/contest_list.html | 2 +- template/src/admin/contest/edit_problem.html | 2 +- template/src/admin/problem/add_problem.html | 2 +- template/src/admin/problem/edit_problem.html | 2 +- 6 files changed, 14 insertions(+), 7 deletions(-) diff --git a/static/src/css/admin.css b/static/src/css/admin.css index f7e7581..cb0fb30 100644 --- a/static/src/css/admin.css +++ b/static/src/css/admin.css @@ -55,3 +55,12 @@ list-style-type: none; margin: 5px; } + +.error-info { + color: #dd4b39; + font-family: + Arial,Helvetica,sans-serif; + font-size: 13px; + line-height: 1.4; + font-weight: 800; +} diff --git a/template/src/admin/contest/add_contest.html b/template/src/admin/contest/add_contest.html index 6f237c5..b374ec8 100644 --- a/template/src/admin/contest/add_contest.html +++ b/template/src/admin/contest/add_contest.html @@ -18,9 +18,7 @@
- -
- 请填写比赛描述 +

请填写比赛描述

diff --git a/template/src/admin/contest/contest_list.html b/template/src/admin/contest/contest_list.html index 1b09534..3df9f49 100644 --- a/template/src/admin/contest/contest_list.html +++ b/template/src/admin/contest/contest_list.html @@ -63,7 +63,7 @@
- 请填写比赛描述 +

请填写比赛描述

diff --git a/template/src/admin/contest/edit_problem.html b/template/src/admin/contest/edit_problem.html index 331917c..f774670 100644 --- a/template/src/admin/contest/edit_problem.html +++ b/template/src/admin/contest/edit_problem.html @@ -23,7 +23,7 @@
- 请填写题目描述 +

请填写题目描述

diff --git a/template/src/admin/problem/add_problem.html b/template/src/admin/problem/add_problem.html index 38c22c6..70bd524 100644 --- a/template/src/admin/problem/add_problem.html +++ b/template/src/admin/problem/add_problem.html @@ -11,7 +11,7 @@
- 请填写题目描述 +

请填写题目描述

diff --git a/template/src/admin/problem/edit_problem.html b/template/src/admin/problem/edit_problem.html index 0a2b7b5..d2587b3 100644 --- a/template/src/admin/problem/edit_problem.html +++ b/template/src/admin/problem/edit_problem.html @@ -17,7 +17,7 @@
- 请填写题目描述 +

请填写题目描述

From eda4d3cb7b6d7588d79d3a4286177f996b1efd63 Mon Sep 17 00:00:00 2001 From: esp Date: Thu, 27 Aug 2015 14:56:48 +0800 Subject: [PATCH 12/34] =?UTF-8?q?[=E5=89=8D=E7=AB=AF-=E5=90=8E=E5=8F=B0]?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E5=88=86=E9=A1=B5=E5=8F=82=E6=95=B0,?= =?UTF-8?q?=E6=AF=8F=E9=A1=B510=E6=9D=A1=E8=AE=B0=E5=BD=95[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/js/app/admin/group/group.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/src/js/app/admin/group/group.js b/static/src/js/app/admin/group/group.js index 7327dba..425e4bb 100644 --- a/static/src/js/app/admin/group/group.js +++ b/static/src/js/app/admin/group/group.js @@ -51,7 +51,7 @@ require(["jquery", "avalon", "csrfToken", "bsAlert"], function ($, avalon, csrfT getPageData(1); function getPageData(page) { - var url = "/api/admin/group/?paging=true&page=" + page + "&page_size=2"; + var url = "/api/admin/group/?paging=true&page=" + page + "&page_size=10"; if (vm.keyword) url += "&keyword=" + vm.keyword; $.ajax({ From 09e30832f93dae64cdd973d714434b18845434a4 Mon Sep 17 00:00:00 2001 From: esp Date: Thu, 27 Aug 2015 15:04:19 +0800 Subject: [PATCH 13/34] =?UTF-8?q?[=E5=89=8D=E7=AB=AF-=E5=90=8E=E5=8F=B0]?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E5=90=8E=E5=8F=B0=E7=AE=A1=E7=90=86=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E5=BD=A2=E5=BC=8F,=E6=8F=8F=E8=BF=B0.=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E7=9B=B8=E5=85=B3-->=E7=BA=A2=E8=89=B2;=E6=96=B0?= =?UTF-8?q?=E5=BB=BA->=E7=BB=BF=E8=89=B2/=E5=8F=91=E5=B8=83**;=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E6=80=A7=E7=9A=84->=E8=93=9D=E8=89=B2;=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E5=86=85=E9=83=A8=E6=8C=89=E9=92=AE=E5=9D=87=E4=B8=BA?= =?UTF-8?q?sm,info[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/src/admin/announcement/announcement.html | 4 ++-- template/src/admin/contest/contest_list.html | 8 ++++---- template/src/admin/contest/edit_problem.html | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/template/src/admin/announcement/announcement.html b/template/src/admin/announcement/announcement.html index 3bfd605..b909823 100644 --- a/template/src/admin/announcement/announcement.html +++ b/template/src/admin/announcement/announcement.html @@ -66,7 +66,7 @@
- +   
@@ -106,7 +106,7 @@
- +
diff --git a/template/src/admin/contest/contest_list.html b/template/src/admin/contest/contest_list.html index 3df9f49..1788ec4 100644 --- a/template/src/admin/contest/contest_list.html +++ b/template/src/admin/contest/contest_list.html @@ -29,8 +29,8 @@
{{ el.create_time|date("yyyy-MM-dd HH:mm:ss")}} {{ el.created_by.username }} - 编辑 - 题目 + 编辑 + 题目
@@ -152,13 +152,13 @@
- +
- 添加题目 + 添加题目 查看提交 diff --git a/template/src/admin/contest/edit_problem.html b/template/src/admin/contest/edit_problem.html index f774670..87a7976 100644 --- a/template/src/admin/contest/edit_problem.html +++ b/template/src/admin/contest/edit_problem.html @@ -130,7 +130,7 @@
- +
From f3b88e85fc153771d9e711437d9c2d05beb4f83a Mon Sep 17 00:00:00 2001 From: esp Date: Thu, 27 Aug 2015 15:18:31 +0800 Subject: [PATCH 14/34] =?UTF-8?q?[=E5=89=8D=E7=AB=AF-=E5=90=8E=E5=8F=B0]?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E5=90=84=E5=88=97=E8=A1=A8=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=9A=84=E5=A4=A7=E8=87=B4=E9=A1=BA=E5=BA=8F?= =?UTF-8?q?,=E4=B8=BA=E9=A2=98=E7=9B=AE=E5=88=97=E8=A1=A8=E5=A2=9E?= =?UTF-8?q?=E6=B7=BB=E5=8F=AF=E8=A7=81=E7=AD=9B=E9=80=89,=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E5=AF=B9=E5=88=97=E8=A1=A8=E4=B8=ADboolen=E5=80=BC?= =?UTF-8?q?=E7=9A=84=E6=98=BE=E7=A4=BA,=E6=98=AF/=E5=90=A6[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/js/app/admin/announcement/announcement.js | 8 +++----- static/src/js/app/admin/problem/problem.js | 10 ++++++++++ template/src/admin/announcement/announcement.html | 6 +++--- template/src/admin/contest/contest_list.html | 4 ++-- template/src/admin/problem/problem_list.html | 5 +++++ 5 files changed, 23 insertions(+), 10 deletions(-) diff --git a/static/src/js/app/admin/announcement/announcement.js b/static/src/js/app/admin/announcement/announcement.js index 9b6f2d2..fbb9779 100644 --- a/static/src/js/app/admin/announcement/announcement.js +++ b/static/src/js/app/admin/announcement/announcement.js @@ -26,11 +26,9 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "validator"], showGlobalViewRadio: true, isGlobal: true, allGroups: [], - getState: function (el) { //获取公告当前状态,显示 - if (el.visible) - return "可见"; - else - return "隐藏"; + getYesOrNo: function(yORn) { + if (yORn) return "是"; + return "否"; }, getNext: function () { if (!vm.nextPage) diff --git a/static/src/js/app/admin/problem/problem.js b/static/src/js/app/admin/problem/problem.js index c11d7c7..ced0d91 100644 --- a/static/src/js/app/admin/problem/problem.js +++ b/static/src/js/app/admin/problem/problem.js @@ -14,6 +14,7 @@ require(["jquery", "avalon", "csrfToken", "bsAlert"], function ($, avalon, csrfT page: 1, totalPage: 1, keyword: "", + showVisibleOnly: false, getNext: function () { if (!vm.nextPage) return; @@ -40,14 +41,23 @@ require(["jquery", "avalon", "csrfToken", "bsAlert"], function ($, avalon, csrfT }, showProblemSubmissionPage: function(problemId){ vm.$fire("up!showProblemSubmissionPage", problemId); + }, + getYesOrNo: function(yORn) { + if (yORn) return "是"; + return "否"; } }); + vm.$watch("showVisibleOnly", function () { + getPageData(1); + }); } getPageData(1); function getPageData(page) { var url = "/api/admin/problem/?paging=true&page=" + page + "&page_size=10"; if (vm.keyword != "") url += "&keyword=" + vm.keyword; + if (vm.showVisibleOnly) + url += "&visible=true"; $.ajax({ url: url, dataType: "json", diff --git a/template/src/admin/announcement/announcement.html b/template/src/admin/announcement/announcement.html index b909823..fbf612d 100644 --- a/template/src/admin/announcement/announcement.html +++ b/template/src/admin/announcement/announcement.html @@ -7,8 +7,8 @@ - - + + @@ -18,7 +18,7 @@ - + diff --git a/template/src/admin/contest/contest_list.html b/template/src/admin/contest/contest_list.html index 1788ec4..d1c8d0a 100644 --- a/template/src/admin/contest/contest_list.html +++ b/template/src/admin/contest/contest_list.html @@ -16,18 +16,18 @@ - + - + + @@ -25,6 +26,7 @@ +
创建时间 更新时间 创建者可见范围状态可见范围可见
{{ el.last_update_time|date("yyyy-MM-dd HH:mm:ss")}} {{ el.created_by.username }} {{ getState(el)}}{{ getYesOrNo(el.visible)}} ID 比赛 公开排名可见 创建时间 创建者可见
{{ el.id }} {{ el.title }} {{ getYesOrNo(el.show_rank) }}{{ getYesOrNo(el.visible) }} {{ el.create_time|date("yyyy-MM-dd HH:mm:ss")}} {{ el.created_by.username }}{{ getYesOrNo(el.visible) }} 编辑 题目 diff --git a/template/src/admin/problem/problem_list.html b/template/src/admin/problem/problem_list.html index 01f8671..7557453 100644 --- a/template/src/admin/problem/problem_list.html +++ b/template/src/admin/problem/problem_list.html @@ -17,6 +17,7 @@ 题目 创建时间 作者可见 通过次数/提交总数
{{ el.title }} {{ el.create_time|date("yyyy-MM-dd HH:mm:ss")}} {{ el.created_by.username }}{{ getYesOrNo(el.visible) }} {{ el.total_accepted_number }}/{{ el.total_submit_number }} @@ -32,6 +34,9 @@
+
+ +
页数:{{ page }}/{{ totalPage }}   From 979a2070cdf360cdb7764d56c67519ef95140789 Mon Sep 17 00:00:00 2001 From: esp Date: Thu, 27 Aug 2015 15:30:11 +0800 Subject: [PATCH 15/34] =?UTF-8?q?[=E5=89=8D=E7=AB=AF-=E5=90=8E=E5=8F=B0]?= =?UTF-8?q?=E5=86=8D=E6=AC=A1=E4=BF=AE=E6=94=B9=E9=83=A8=E5=88=86=E6=8E=AA?= =?UTF-8?q?=E8=BE=9E,=E4=BF=AE=E6=94=B9boolen=E5=80=BC=E7=9A=84=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E6=96=B9=E6=B3=95(=E5=86=8D=E6=AC=A1=E6=94=B9?= =?UTF-8?q?=E8=BF=9B)[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/css/admin.css | 2 +- static/src/js/app/admin/announcement/announcement.js | 5 ----- static/src/js/app/admin/contest/contestList.js | 4 ---- static/src/js/app/admin/problem/problem.js | 4 ---- template/src/admin/announcement/announcement.html | 4 ++-- template/src/admin/contest/contest_list.html | 6 +++--- template/src/admin/problem/problem_list.html | 6 +++--- 7 files changed, 9 insertions(+), 22 deletions(-) diff --git a/static/src/css/admin.css b/static/src/css/admin.css index cb0fb30..fb9c9f2 100644 --- a/static/src/css/admin.css +++ b/static/src/css/admin.css @@ -62,5 +62,5 @@ Arial,Helvetica,sans-serif; font-size: 13px; line-height: 1.4; - font-weight: 800; + font-weight: 600; } diff --git a/static/src/js/app/admin/announcement/announcement.js b/static/src/js/app/admin/announcement/announcement.js index fbb9779..4c67ef2 100644 --- a/static/src/js/app/admin/announcement/announcement.js +++ b/static/src/js/app/admin/announcement/announcement.js @@ -26,10 +26,6 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "validator"], showGlobalViewRadio: true, isGlobal: true, allGroups: [], - getYesOrNo: function(yORn) { - if (yORn) return "是"; - return "否"; - }, getNext: function () { if (!vm.nextPage) return; @@ -47,7 +43,6 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "validator"], else { return vm.previousPage ? "btn btn-primary" : "btn btn-primary disabled"; } - }, editAnnouncement: function (announcement) { vm.newTitle = announcement.title; diff --git a/static/src/js/app/admin/contest/contestList.js b/static/src/js/app/admin/contest/contestList.js index 036b344..f63cdcc 100644 --- a/static/src/js/app/admin/contest/contestList.js +++ b/static/src/js/app/admin/contest/contestList.js @@ -245,10 +245,6 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", if (el) problemId = el.id; vm.$fire("up!showContestSubmissionPage", problemId, vm.contestList[vm.editingProblemContestIndex-1].id, vm.editMode); - }, - getYesOrNo: function(yORn) { - if (yORn) return "是"; - return "否"; } }); vm.$watch("showVisibleOnly", function() { diff --git a/static/src/js/app/admin/problem/problem.js b/static/src/js/app/admin/problem/problem.js index ced0d91..9fe56df 100644 --- a/static/src/js/app/admin/problem/problem.js +++ b/static/src/js/app/admin/problem/problem.js @@ -41,10 +41,6 @@ require(["jquery", "avalon", "csrfToken", "bsAlert"], function ($, avalon, csrfT }, showProblemSubmissionPage: function(problemId){ vm.$fire("up!showProblemSubmissionPage", problemId); - }, - getYesOrNo: function(yORn) { - if (yORn) return "是"; - return "否"; } }); vm.$watch("showVisibleOnly", function () { diff --git a/template/src/admin/announcement/announcement.html b/template/src/admin/announcement/announcement.html index fbf612d..baa085f 100644 --- a/template/src/admin/announcement/announcement.html +++ b/template/src/admin/announcement/announcement.html @@ -7,7 +7,7 @@ 创建时间 更新时间 创建者 - 可见范围 + 类型 可见 @@ -18,7 +18,7 @@ {{ el.last_update_time|date("yyyy-MM-dd HH:mm:ss")}} {{ el.created_by.username }} - {{ getYesOrNo(el.visible)}} + diff --git a/template/src/admin/contest/contest_list.html b/template/src/admin/contest/contest_list.html index d1c8d0a..7418a56 100644 --- a/template/src/admin/contest/contest_list.html +++ b/template/src/admin/contest/contest_list.html @@ -15,7 +15,7 @@ ID 比赛 - 公开排名 + 排名 创建时间 创建者 可见 @@ -24,10 +24,10 @@ {{ el.id }} {{ el.title }} - {{ getYesOrNo(el.show_rank) }} + {{ el.create_time|date("yyyy-MM-dd HH:mm:ss")}} {{ el.created_by.username }} - {{ getYesOrNo(el.visible) }} + 编辑 题目 diff --git a/template/src/admin/problem/problem_list.html b/template/src/admin/problem/problem_list.html index 7557453..a571cfe 100644 --- a/template/src/admin/problem/problem_list.html +++ b/template/src/admin/problem/problem_list.html @@ -17,8 +17,8 @@ 题目 创建时间 作者 - 可见 - 通过次数/提交总数 + 可见 + 通过次数/提交总数 @@ -26,7 +26,7 @@ {{ el.title }} {{ el.create_time|date("yyyy-MM-dd HH:mm:ss")}} {{ el.created_by.username }} - {{ getYesOrNo(el.visible) }} + {{ getYesOrNo(el.visible) }} {{ el.total_accepted_number }}/{{ el.total_submit_number }} From c64bd9d165c9242cdca89130b0cc2ee5ae533e21 Mon Sep 17 00:00:00 2001 From: esp Date: Thu, 27 Aug 2015 15:36:32 +0800 Subject: [PATCH 16/34] =?UTF-8?q?[=E5=89=8D=E7=AB=AF-=E5=90=8E=E5=8F=B0]?= =?UTF-8?q?=E5=A2=9E=E5=BC=BAradio=E7=9A=84=E6=98=93=E7=94=A8=E6=80=A7,?= =?UTF-8?q?=E4=BD=BF=E7=94=A8label=E5=8C=85=E8=A3=B9,=E4=BE=BF=E4=BA=8E?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=82=B9=E5=88=B0[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/src/admin/announcement/announcement.html | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/template/src/admin/announcement/announcement.html b/template/src/admin/announcement/announcement.html index baa085f..f08ccb0 100644 --- a/template/src/admin/announcement/announcement.html +++ b/template/src/admin/announcement/announcement.html @@ -38,7 +38,8 @@
-
+
@@ -78,12 +79,14 @@ +
+
@@ -91,10 +94,16 @@
- 全局可见 + - 小组内可见 +
From f8677f4966e6f7d5b2c61d487bda1b6c335f58a8 Mon Sep 17 00:00:00 2001 From: esp Date: Thu, 27 Aug 2015 22:26:00 +0800 Subject: [PATCH 17/34] =?UTF-8?q?[=E5=90=8E=E7=AB=AF-=E5=89=8D=E5=8F=B0]?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=94=A8=E6=88=B7=E6=B3=A8=E9=94=80=E5=8A=9F?= =?UTF-8?q?=E8=83=BD,=E8=BF=99=E4=B8=AA=E5=B9=B6=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E5=81=9A=E6=88=90api,=E6=84=9F=E8=A7=89=E8=BF=99=E4=B8=AA?= =?UTF-8?q?=E5=81=9A=E6=88=90api=E5=8F=AF=E8=83=BD=E6=B2=A1=E4=BB=80?= =?UTF-8?q?=E4=B9=88=E5=BF=85=E8=A6=81...=E6=89=80=E4=BB=A5=E5=B9=B2?= =?UTF-8?q?=E8=84=86=E5=86=99=E4=BA=86=E5=9C=B0=E5=9D=80=E9=87=8D=E5=AE=9A?= =?UTF-8?q?=E5=90=91=E5=88=B0=E9=A6=96=E9=A1=B5=E4=BA=86,=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E9=80=9A=E8=BF=87account.tests.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- account/tests.py | 15 +++++++++++++++ account/views.py | 5 +++++ oj/urls.py | 3 ++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/account/tests.py b/account/tests.py index a75d2c5..f8cc9d0 100644 --- a/account/tests.py +++ b/account/tests.py @@ -369,3 +369,18 @@ class AdminRequiredDecoratorTest(TestCase): self.client.login(username="test", password="test") response = self.client.get("/admin_required_test/cbv/1024/") self.assertEqual(response.content, "1024") + + +class UserLogoutTest(TestCase): + def setUp(self): + self.client = Client() + user = User.objects.create(username="test") + user.admin_type = 1 + user.set_password("1") + user.save() + + def logout_success(self): + self.client = Client() + self.client.login(username="test", password="1") + response = self.client.get("/logout/") + self.assertEqual(response.status_code, 302) diff --git a/account/views.py b/account/views.py index f2c6ca3..c1f0cb9 100644 --- a/account/views.py +++ b/account/views.py @@ -1,4 +1,5 @@ # coding=utf-8 +from django import http from django.contrib import auth from django.shortcuts import render from django.db.models import Q @@ -35,6 +36,10 @@ class UserLoginAPIView(APIView): return serializer_invalid_response(serializer) +def Logout(request): + auth.logout(request) + return http.HttpResponseRedirect("/") + class UserRegisterAPIView(APIView): def post(self, request): """ diff --git a/oj/urls.py b/oj/urls.py index 74a44c2..aeab5b2 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -5,7 +5,7 @@ from django.views.generic import TemplateView from account.views import (UserLoginAPIView, UsernameCheckAPIView, UserRegisterAPIView, UserChangePasswordAPIView, EmailCheckAPIView, - UserAdminAPIView, UserInfoAPIView) + UserAdminAPIView, UserInfoAPIView, Logout) from announcement.views import AnnouncementAdminAPIView from contest.views import ContestAdminAPIView, ContestProblemAdminAPIView, ContestPasswordVerifyAPIView @@ -34,6 +34,7 @@ urlpatterns = [ name="admin_template"), url(r'^login/$', TemplateView.as_view(template_name="oj/account/login.html"), name="user_login_page"), + url(r'^logout/$', Logout, name="user_logout_api"), url(r'^register/$', TemplateView.as_view(template_name="oj/account/register.html"), name="user_register_page"), url(r'^change_password/$', TemplateView.as_view(template_name="oj/account/change_password.html"), From abd7933a5a4e23ad7175966201da0d9679da32fe Mon Sep 17 00:00:00 2001 From: esp Date: Thu, 27 Aug 2015 22:28:30 +0800 Subject: [PATCH 18/34] =?UTF-8?q?[=E5=89=8D=E7=AB=AF]=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=AF=94=E8=B5=9B=E5=88=97=E8=A1=A8=E4=B8=BA=E7=A9=BA=E7=9A=84?= =?UTF-8?q?=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/src/oj/contest/contest_list.html | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/template/src/oj/contest/contest_list.html b/template/src/oj/contest/contest_list.html index 1689cee..68d939b 100644 --- a/template/src/oj/contest/contest_list.html +++ b/template/src/oj/contest/contest_list.html @@ -3,7 +3,7 @@ {% load contest %}
-
+
@@ -15,6 +15,7 @@
+ {% if contests %} @@ -47,6 +48,7 @@ {% endfor %}
+
-
+
{% include "oj/announcement/_announcement_panel.html" %}
From f04951f9a181b15b2944097e078d5c78d1d68a04 Mon Sep 17 00:00:00 2001 From: esp Date: Thu, 27 Aug 2015 22:30:55 +0800 Subject: [PATCH 19/34] =?UTF-8?q?[=E5=89=8D=E7=AB=AF]=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=89=8D=E5=8F=B0=E9=A1=B5=E9=9D=A2=E7=94=A8=E6=88=B7=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E7=8A=B6=E6=80=81=E4=B8=8B=E6=8B=89=E8=8F=9C=E5=8D=95?= =?UTF-8?q?,=E5=AE=8C=E6=88=90=E6=B3=A8=E9=94=80=E5=8A=9F=E8=83=BD,?= =?UTF-8?q?=E5=9C=A8=E7=99=BB=E5=BD=95=E9=A1=B5=E9=9D=A2=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/src/oj/account/login.html | 46 +++++++++++++++++------------- template/src/oj_base.html | 46 ++++++++++++++++-------------- 2 files changed, 51 insertions(+), 41 deletions(-) diff --git a/template/src/oj/account/login.html b/template/src/oj/account/login.html index 2f5f7cf..5777fd3 100644 --- a/template/src/oj/account/login.html +++ b/template/src/oj/account/login.html @@ -1,27 +1,33 @@ {% extends "oj_base.html" %} {% block body %} -
-
-

用户登录

+
+
+

用户登录

- -
- - -
-
-
- - -
-
-
- -
- -
+
+
+ + + +
+
+
+ + + +
+
+
+ +
+ 还没有帐号?点击注册 + +
+
{% endblock %} {% block js_block %} - + {% endblock %} \ No newline at end of file diff --git a/template/src/oj_base.html b/template/src/oj_base.html index 082cad5..be8f3b0 100644 --- a/template/src/oj_base.html +++ b/template/src/oj_base.html @@ -48,28 +48,28 @@
  • 关于
  • {% if request.user.is_authenticated %} - + {% else %} - + {% endif %}
    @@ -84,6 +84,10 @@ {% block js_block %}{% endblock %} From 8ae8fd246abf7500982405c253d83541b011e2d4 Mon Sep 17 00:00:00 2001 From: esp Date: Fri, 28 Aug 2015 17:11:40 +0800 Subject: [PATCH 20/34] =?UTF-8?q?[=E5=90=8E=E7=AB=AF-=E5=89=8D=E5=8F=B0]?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=AF=94=E8=B5=9B=E5=88=97=E8=A1=A8=E4=BB=85?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=8F=AF=E5=8F=82=E5=8A=A0=E7=9A=84=E6=AF=94?= =?UTF-8?q?=E8=B5=9B=E7=9A=84=E9=97=AE=E9=A2=98,=E5=B0=8Fbug,=E5=90=A6?= =?UTF-8?q?=E5=88=99=E9=80=89=E6=8B=A9=E6=9F=A5=E7=9C=8B=E5=8F=AF=E5=8F=82?= =?UTF-8?q?=E5=8A=A0=E7=9A=84=E6=AF=94=E8=B5=9B=E6=9C=89=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E4=B8=8D=E5=8F=AF=E8=A7=81=E7=9A=84=E6=AF=94?= =?UTF-8?q?=E8=B5=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contest/views.py b/contest/views.py index e23b50e..4763bd8 100644 --- a/contest/views.py +++ b/contest/views.py @@ -348,7 +348,7 @@ def contest_list_page(request, page=1): # 筛选我能参加的比赛 join = request.GET.get("join", None) if join: - contests = Contest.objects.filter(Q(contest_type__in=[1, 2]) | Q(groups__in=request.user.group_set.all())).\ + contests = contests.filter(Q(contest_type__in=[1, 2]) | Q(groups__in=request.user.group_set.all())).\ filter(end_time__gt=datetime.datetime.now(), start_time__lt=datetime.datetime.now()) paginator = Paginator(contests, 20) From e14eaada4f8345a3138428dd2400684a549698f1 Mon Sep 17 00:00:00 2001 From: esp Date: Fri, 28 Aug 2015 17:12:41 +0800 Subject: [PATCH 21/34] =?UTF-8?q?[=E5=90=8E=E7=AB=AF]=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=B3=A8=E9=94=80views=E7=9A=84=E5=87=BD=E6=95=B0=E5=90=8D?= =?UTF-8?q?=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- account/views.py | 2 +- oj/urls.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/account/views.py b/account/views.py index c1f0cb9..89197ae 100644 --- a/account/views.py +++ b/account/views.py @@ -36,7 +36,7 @@ class UserLoginAPIView(APIView): return serializer_invalid_response(serializer) -def Logout(request): +def logout(request): auth.logout(request) return http.HttpResponseRedirect("/") diff --git a/oj/urls.py b/oj/urls.py index aeab5b2..a623784 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -5,7 +5,7 @@ from django.views.generic import TemplateView from account.views import (UserLoginAPIView, UsernameCheckAPIView, UserRegisterAPIView, UserChangePasswordAPIView, EmailCheckAPIView, - UserAdminAPIView, UserInfoAPIView, Logout) + UserAdminAPIView, UserInfoAPIView) from announcement.views import AnnouncementAdminAPIView from contest.views import ContestAdminAPIView, ContestProblemAdminAPIView, ContestPasswordVerifyAPIView @@ -34,7 +34,7 @@ urlpatterns = [ name="admin_template"), url(r'^login/$', TemplateView.as_view(template_name="oj/account/login.html"), name="user_login_page"), - url(r'^logout/$', Logout, name="user_logout_api"), + url(r'^logout/$', "account.views.logout", name="user_logout_api"), url(r'^register/$', TemplateView.as_view(template_name="oj/account/register.html"), name="user_register_page"), url(r'^change_password/$', TemplateView.as_view(template_name="oj/account/change_password.html"), From 4847a3a36c0042d3bab7deeaa277c107dc02869c Mon Sep 17 00:00:00 2001 From: esp Date: Fri, 28 Aug 2015 17:56:32 +0800 Subject: [PATCH 22/34] =?UTF-8?q?[=E5=89=8D=E5=8F=B0]=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=88=97=E8=A1=A8=E7=9A=84=E5=85=AC=E5=91=8A?= =?UTF-8?q?=E6=A0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- submission/views.py | 13 ++- .../oj/submission/my_submissions_list.html | 89 ++++++++++--------- 2 files changed, 56 insertions(+), 46 deletions(-) diff --git a/submission/views.py b/submission/views.py index 17c1615..12c4ec4 100644 --- a/submission/views.py +++ b/submission/views.py @@ -12,15 +12,14 @@ from judge.judger_controller.settings import redis_config from account.decorators import login_required from account.models import SUPER_ADMIN -from contest.decorators import check_user_contest_permission from problem.models import Problem -from contest.models import Contest, ContestProblem +from contest.models import ContestProblem from utils.shortcuts import serializer_invalid_response, error_response, success_response, error_page, paginate from .models import Submission from .serializers import CreateSubmissionSerializer, SubmissionSerializer - +from announcement.models import Announcement class SubmissionAPIView(APIView): @login_required @@ -80,8 +79,10 @@ def problem_my_submissions_list_page(request, problem_id): problem = Problem.objects.get(id=problem_id, visible=True) except Problem.DoesNotExist: return error_page(request, u"问题不存在") + submissions = Submission.objects.filter(user_id=request.user.id, problem_id=problem.id, contest_id__isnull=True).order_by("-create_time"). \ values("id", "result", "create_time", "accepted_answer_time", "language") + return render(request, "oj/problem/my_submissions_list.html", {"submissions": submissions, "problem": problem}) @@ -154,6 +155,10 @@ def my_submission_list_page(request, page=1): except Exception: pass + # 右侧的公告列表 + announcements = Announcement.objects.filter(is_global=True, visible=True).order_by("-create_time") + return render(request, "oj/submission/my_submissions_list.html", {"submissions": current_page, "page": int(page), - "previous_page": previous_page, "next_page": next_page, "start_id": int(page) * 20 - 20}) \ No newline at end of file + "previous_page": previous_page, "next_page": next_page, "start_id": int(page) * 20 - 20, + "announcements": announcements}) \ No newline at end of file diff --git a/template/src/oj/submission/my_submissions_list.html b/template/src/oj/submission/my_submissions_list.html index 279bee6..2f28bd8 100644 --- a/template/src/oj/submission/my_submissions_list.html +++ b/template/src/oj/submission/my_submissions_list.html @@ -2,57 +2,62 @@ {% block body %} - {% load submission %} -
    +{% load submission %} +
    +
    {% if submissions %} - - - - - - - - - - - - {% for item in submissions %} - - - - - - - - {% endfor %} +
    #提交时间结果运行时间语言
    - {{ forloop.counter |add:start_id }}{{ item.create_time }}{{ item.result|translate_result }} - {% if item.accepted_answer_time %} - {{ item.accepted_answer_time }}ms - {% else %} - -- - {% endif %} - - {{ item.language|translate_language }} -
    + + + + + + + + + + + {% for item in submissions %} + + + + + + + + {% endfor %} - -
    #提交时间结果运行时间语言
    + {{ forloop.counter |add:start_id }}{{ item.create_time }}{{ item.result|translate_result }} + {% if item.accepted_answer_time %} + {{ item.accepted_answer_time }}ms + {% else %} + -- + {% endif %} + + {{ item.language|translate_language }} +
    - {% else %} -

    你还没有提交记录!

    - {% endif %} + + + {% else %} +

    你还没有提交记录!

    + {% endif %}
    +
    + {% include "oj/announcement/_announcement_panel.html" %} +
    +
    {% endblock %} From 4bfbaf249f9b932dbb4e41728f97a48ecbd6f02f Mon Sep 17 00:00:00 2001 From: esp Date: Fri, 28 Aug 2015 18:02:12 +0800 Subject: [PATCH 23/34] =?UTF-8?q?[=E5=89=8D=E5=8F=B0]=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=AF=94=E8=B5=9B=E6=A8=A1=E5=9D=97=E9=87=8Crank,submission?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E7=9A=84=E5=88=97=E8=A1=A8=E6=98=AF=E7=A9=BA?= =?UTF-8?q?=E7=9A=84=E6=83=85=E5=86=B5=E7=9A=84=E6=8F=90=E7=A4=BA(?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A8=A1=E6=9D=BF)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/src/oj/announcement/_announcement_panel.html | 11 ++++++++--- template/src/oj/contest/contest_problems_list.html | 4 ++-- template/src/oj/contest/contest_rank.html | 4 ++++ template/src/oj/problem/my_submissions_list.html | 4 ++++ template/src/oj/problem/problem_list.html | 4 ++-- 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/template/src/oj/announcement/_announcement_panel.html b/template/src/oj/announcement/_announcement_panel.html index f17a9ce..d593626 100644 --- a/template/src/oj/announcement/_announcement_panel.html +++ b/template/src/oj/announcement/_announcement_panel.html @@ -5,8 +5,13 @@ 公告
    - {% for item in announcements %} -

    {{ forloop.counter }}.  {{ item.title }}

    - {% endfor %} + {% if announcements %} + {% for item in announcements %} +

    {{ forloop.counter }}.  {{ item.title }} +

    + {% endfor %} + {% else %} +

    暂无可显示的公告

    + {% endif %}
    \ No newline at end of file diff --git a/template/src/oj/contest/contest_problems_list.html b/template/src/oj/contest/contest_problems_list.html index 2a863dd..0289592 100644 --- a/template/src/oj/contest/contest_problems_list.html +++ b/template/src/oj/contest/contest_problems_list.html @@ -26,7 +26,7 @@
    -
    +
    @@ -55,7 +55,7 @@ -
    +
    {% include "oj/announcement/_announcement_panel.html" %}
    diff --git a/template/src/oj/contest/contest_rank.html b/template/src/oj/contest/contest_rank.html index 823b021..7d17134 100644 --- a/template/src/oj/contest/contest_rank.html +++ b/template/src/oj/contest/contest_rank.html @@ -20,6 +20,7 @@
    + {% if result %}
    @@ -49,6 +50,9 @@ {% endfor %}
    + {% else %} +

    还没有结果

    + {% endif %}
    diff --git a/template/src/oj/problem/my_submissions_list.html b/template/src/oj/problem/my_submissions_list.html index fb07a4c..03d7e8c 100644 --- a/template/src/oj/problem/my_submissions_list.html +++ b/template/src/oj/problem/my_submissions_list.html @@ -11,6 +11,7 @@ 我的提交 {% include "oj/problem/_problem_header.html" %} + {% if submissions %} @@ -42,5 +43,8 @@
    + {% else %} +

    你还没有提交该题目

    + {% endif %}
    {% endblock %} \ No newline at end of file diff --git a/template/src/oj/problem/problem_list.html b/template/src/oj/problem/problem_list.html index a26ae80..247b07f 100644 --- a/template/src/oj/problem/problem_list.html +++ b/template/src/oj/problem/problem_list.html @@ -3,7 +3,7 @@ {% load problem %}
    -
    +
    @@ -54,7 +54,7 @@
    -
    +
    {% include "oj/announcement/_announcement_panel.html" %}
    From 6d4d44430f6bff28c511337104ca7760ffd56b4d Mon Sep 17 00:00:00 2001 From: esp Date: Fri, 28 Aug 2015 20:27:47 +0800 Subject: [PATCH 24/34] =?UTF-8?q?[=E5=90=8E=E7=AB=AF]=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=88=97=E8=A1=A8=E7=AD=9B=E9=80=89=E5=8A=9F?= =?UTF-8?q?=E8=83=BD,=E6=8C=89=E8=AF=AD=E8=A8=80,=E9=A2=98=E7=9B=AE,?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E8=BF=98=E6=B2=A1=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- submission/views.py | 11 +++++- .../oj/submission/my_submissions_list.html | 34 ++++++++++++++++--- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/submission/views.py b/submission/views.py index 12c4ec4..5c90aca 100644 --- a/submission/views.py +++ b/submission/views.py @@ -140,6 +140,15 @@ def my_submission_list_page(request, page=1): """ submissions = Submission.objects.filter(user_id=request.user.id). \ values("id", "result", "create_time", "accepted_answer_time", "language").order_by("-create_time") + language = request.GET.get("language", None) + filter = None + if language: + submissions = submissions.filter(language=int(language)) + filter = {"name": "language", "content": language} + result = request.GET.get("result", None) + if result: + submissions = submissions.filter(result=int(result)) + filter = {"name": "result", "content": result} paginator = Paginator(submissions, 20) try: current_page = paginator.page(int(page)) @@ -161,4 +170,4 @@ def my_submission_list_page(request, page=1): return render(request, "oj/submission/my_submissions_list.html", {"submissions": current_page, "page": int(page), "previous_page": previous_page, "next_page": next_page, "start_id": int(page) * 20 - 20, - "announcements": announcements}) \ No newline at end of file + "announcements": announcements, "filter":filter}) \ No newline at end of file diff --git a/template/src/oj/submission/my_submissions_list.html b/template/src/oj/submission/my_submissions_list.html index 2f28bd8..f49060b 100644 --- a/template/src/oj/submission/my_submissions_list.html +++ b/template/src/oj/submission/my_submissions_list.html @@ -8,12 +8,36 @@ {% if submissions %} - + - + - + @@ -42,12 +66,12 @@ From f2a8c437de60677dde3e229684eadb3cca47da0c Mon Sep 17 00:00:00 2001 From: esp Date: Sat, 29 Aug 2015 08:33:38 +0800 Subject: [PATCH 25/34] =?UTF-8?q?[=E5=90=8E=E7=AB=AF]=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=98=A8=E5=A4=A9=E4=BF=AE=E6=94=B9=E7=9A=84=E6=88=91=E7=9A=84?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=88=97=E8=A1=A8=E9=A1=B5=E9=9D=A2=E7=9A=84?= =?UTF-8?q?=E6=B5=8B=E8=AF=95,=E5=85=A8=E8=A6=86=E7=9B=96=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- submission/tests.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/submission/tests.py b/submission/tests.py index 04f0a86..3aab246 100644 --- a/submission/tests.py +++ b/submission/tests.py @@ -29,6 +29,16 @@ class SubmissionsListPageTest(TestCase): response = self.client.get('/submissions/1/') self.assertEqual(response.status_code, 200) + def test_visit_submissionsListPage_successfully_language_filter(self): + self.client.login(username="gogoing", password="666666") + response = self.client.get('/submissions/?language=1') + self.assertEqual(response.status_code, 200) + + def test_visit_submissionsListPage_successfully_result_filter(self): + self.client.login(username="gogoing", password="666666") + response = self.client.get('/submissions/?result=1') + self.assertEqual(response.status_code, 200) + def test_visit_submissionsListPage_without_page_successfully(self): self.client.login(username="gogoing", password="666666") response = self.client.get('/submissions/') @@ -137,10 +147,3 @@ class ContestSubmissionAPITest(APITestCase): data = {"language": 1} response = self.client.post(self.url, data=data) pass - - - - - - - From cfaac4f5a245ca7504edd51af466c2759ba5345b Mon Sep 17 00:00:00 2001 From: esp Date: Sat, 29 Aug 2015 09:34:46 +0800 Subject: [PATCH 26/34] =?UTF-8?q?[=E5=90=8E=E7=AB=AF]=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=88=91=E7=9A=84=E6=8F=90=E4=BA=A4=E5=88=97=E8=A1=A8=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F,=E6=96=B9=E4=BE=BF=E7=AD=9B=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oj/urls.py | 2 +- template/src/oj/submission/my_submissions_list.html | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/oj/urls.py b/oj/urls.py index a623784..b3f6929 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -1,11 +1,11 @@ # coding=utf-8 from django.conf.urls import include, url -from django.contrib import admin from django.views.generic import TemplateView from account.views import (UserLoginAPIView, UsernameCheckAPIView, UserRegisterAPIView, UserChangePasswordAPIView, EmailCheckAPIView, UserAdminAPIView, UserInfoAPIView) + from announcement.views import AnnouncementAdminAPIView from contest.views import ContestAdminAPIView, ContestProblemAdminAPIView, ContestPasswordVerifyAPIView diff --git a/template/src/oj/submission/my_submissions_list.html b/template/src/oj/submission/my_submissions_list.html index f49060b..e048ab9 100644 --- a/template/src/oj/submission/my_submissions_list.html +++ b/template/src/oj/submission/my_submissions_list.html @@ -5,7 +5,6 @@ {% load submission %}
    - {% if submissions %}
    # 提交时间结果 + 运行时间语言 +
    @@ -76,7 +75,7 @@ {% endif %} - {% else %} + {% if not submissions %}

    你还没有提交记录!

    {% endif %} From a6c33bed360473b10b21319888ef69fe115d8cb4 Mon Sep 17 00:00:00 2001 From: esp Date: Sat, 29 Aug 2015 16:49:07 +0800 Subject: [PATCH 27/34] =?UTF-8?q?[=E5=89=8D=E7=AB=AF]=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E9=A6=96=E9=A1=B5=E5=92=8Coj=5Fbase=E4=B8=AD?= =?UTF-8?q?=E5=AF=BC=E8=88=AA=E6=A0=8F=E9=A1=B9=E7=9B=AE,=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E9=A6=96=E9=A1=B5=E7=99=BB=E5=BD=95,=E5=8F=8A?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E7=8A=B6=E6=80=81=E5=8C=BA(=E8=BF=99?= =?UTF-8?q?=E4=B8=AA=E4=BD=BF=E7=94=A8css=E7=9A=84float:right=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E5=9B=BA=E5=AE=9A=E5=9C=A8=E5=8F=B3=E4=BE=A7,?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E5=8A=A8=E6=80=81=E5=93=8D=E5=BA=94=E7=AA=97?= =?UTF-8?q?=E5=8F=A3=E5=A4=A7=E5=B0=8F=E5=8F=98=E5=8C=96,=E5=8F=AA?= =?UTF-8?q?=E6=98=AF=E4=B8=8E=E5=AF=BC=E8=88=AA=E6=A0=8F=E4=BD=8D=E7=BD=AE?= =?UTF-8?q?=E5=B0=91=E4=B8=8D=E5=AF=B9=E7=A7=B0=E4=BA=86.=E7=94=B1?= =?UTF-8?q?=E4=BA=8E=E6=B2=A1=E6=9C=89=E5=BC=95=E5=85=A5bootstraps?= =?UTF-8?q?=E6=89=80=E4=BB=A5=E6=B2=A1=E6=9C=89=E4=BD=BF=E7=94=A8=E4=B8=8E?= =?UTF-8?q?oj=5Fbase=E9=87=8C=E7=9B=B8=E5=90=8C=E7=9A=84=E4=B8=8B=E6=8B=89?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E6=9D=A5=E6=98=BE=E7=A4=BA=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E5=90=8E=E7=9A=84=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/src/oj/group/group_list.html | 10 ++++ template/src/oj/index.html | 86 ++++++++++++++++++--------- template/src/oj_base.html | 1 + 3 files changed, 68 insertions(+), 29 deletions(-) create mode 100644 template/src/oj/group/group_list.html diff --git a/template/src/oj/group/group_list.html b/template/src/oj/group/group_list.html new file mode 100644 index 0000000..d538fea --- /dev/null +++ b/template/src/oj/group/group_list.html @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/template/src/oj/index.html b/template/src/oj/index.html index 520f753..af54f1d 100644 --- a/template/src/oj/index.html +++ b/template/src/oj/index.html @@ -8,64 +8,71 @@ @@ -84,13 +91,34 @@ loopBottom: true }); }); + +
    diff --git a/template/src/oj_base.html b/template/src/oj_base.html index be8f3b0..f39fea0 100644 --- a/template/src/oj_base.html +++ b/template/src/oj_base.html @@ -45,6 +45,7 @@
  • 题目
  • 提交
  • 比赛
  • +
  • 小组
  • 关于
  • {% if request.user.is_authenticated %} From 9bf3dad91e0165ad504e0ec2bc09ea2ad86c6d61 Mon Sep 17 00:00:00 2001 From: esp Date: Sat, 29 Aug 2015 17:06:00 +0800 Subject: [PATCH 28/34] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=89=8D=E5=8F=B0?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=88=97=E8=A1=A8=E7=9A=84=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F,=E4=BD=BF=E4=B9=8B=E4=B8=8E=E5=85=B6?= =?UTF-8?q?=E4=BB=96=E5=88=97=E8=A1=A8=E5=BD=A2=E5=BC=8F=E6=9B=B4=E5=8A=A0?= =?UTF-8?q?=E7=BB=9F=E4=B8=80,=E4=BF=AE=E6=94=B9=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E7=9A=84=E9=A2=9C=E8=89=B2=E6=9C=89=E5=8E=9F=E6=9D=A5=E7=9A=84?= =?UTF-8?q?class=3Dsuccess=E7=AD=89=E7=AD=89=E6=94=B9=E4=B8=BAalert-succes?= =?UTF-8?q?s,=E5=B9=B6=E5=A2=9E=E5=8A=A0strong=E6=A0=87=E7=AD=BE[CI=20SKIP?= =?UTF-8?q?]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/src/oj/group/group_list.html | 91 +++++++++++++++++-- .../src/oj/problem/my_submissions_list.html | 14 +-- .../oj/submission/my_submissions_list.html | 67 ++++++++------ 3 files changed, 128 insertions(+), 44 deletions(-) diff --git a/template/src/oj/group/group_list.html b/template/src/oj/group/group_list.html index d538fea..247b07f 100644 --- a/template/src/oj/group/group_list.html +++ b/template/src/oj/group/group_list.html @@ -1,10 +1,83 @@ - - - - - - - +{% extends "oj_base.html" %} +{% block body %} + {% load problem %} +
    +
    +
    +
    +
    + +
    + + +
    + +
    +
    +
    +
    + + + + + + + + + + + {% for item in problems %} + + + + + + + + {% endfor %} + +
    #题目难度通过率
    {{ item.id }}{{ item.title }}{{ item.difficulty }}{{ item|accepted_radio }}
    + +
    +
    - - \ No newline at end of file +
    + {% include "oj/announcement/_announcement_panel.html" %} +
    +
    +

    + + 分类 +

    +
    +
      + {% for item in tags %} +
    • + {{ item.problem_number }} + {{ item.name }} +
    • + {% endfor %} +
    +
    + +
    +
    +
    +{% endblock %} + +{% block js_block %} + +{% endblock %} \ No newline at end of file diff --git a/template/src/oj/problem/my_submissions_list.html b/template/src/oj/problem/my_submissions_list.html index 03d7e8c..3bf7ac5 100644 --- a/template/src/oj/problem/my_submissions_list.html +++ b/template/src/oj/problem/my_submissions_list.html @@ -17,17 +17,19 @@ # 提交时间 - 结果 - 运行时间 语言 + 运行时间 + 结果 {% for item in submissions %} - + {{ forloop.counter }} {{ item.create_time }} - {{ item.result|translate_result }} + + {{ item.language|translate_language }} + {% if item.accepted_answer_time %} {{ item.accepted_answer_time }}ms @@ -35,8 +37,8 @@ -- {% endif %} - - {{ item.language|translate_language }} + + {{ item.result|translate_result }} {% endfor %} diff --git a/template/src/oj/submission/my_submissions_list.html b/template/src/oj/submission/my_submissions_list.html index e048ab9..d3c0844 100644 --- a/template/src/oj/submission/my_submissions_list.html +++ b/template/src/oj/submission/my_submissions_list.html @@ -5,47 +5,55 @@ {% load submission %}
    - +
    - - {% for item in submissions %} - + - + - + {% endfor %} From 91f961e0b271487ee23e1a7f4e5411e42b79e6ae Mon Sep 17 00:00:00 2001 From: esp Date: Sat, 29 Aug 2015 17:07:02 +0800 Subject: [PATCH 29/34] =?UTF-8?q?[=E5=90=8E=E5=8F=B0]=E6=88=91=E7=9A=84?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=88=97=E8=A1=A8=E4=B8=8D=E5=86=8D=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E6=AF=94=E8=B5=9B=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- submission/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submission/views.py b/submission/views.py index 5c90aca..0925e13 100644 --- a/submission/views.py +++ b/submission/views.py @@ -138,7 +138,7 @@ def my_submission_list_page(request, page=1): """ 我的所有提交的列表页 """ - submissions = Submission.objects.filter(user_id=request.user.id). \ + submissions = Submission.objects.filter(user_id=request.user.id, contest_id__isnull=True). \ values("id", "result", "create_time", "accepted_answer_time", "language").order_by("-create_time") language = request.GET.get("language", None) filter = None From 85905f91e365125014faed1ed94e124bff54d4b2 Mon Sep 17 00:00:00 2001 From: esp Date: Sat, 29 Aug 2015 17:54:09 +0800 Subject: [PATCH 30/34] =?UTF-8?q?[=E5=90=8E=E7=AB=AF]=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=AF=94=E8=B5=9B,=E9=A2=98=E7=9B=AE=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E9=A1=B5=E5=AF=B9=E6=8F=8F=E8=BF=B0=E7=9A=84=E6=A3=80=E7=B4=A2?= =?UTF-8?q?(=E5=8E=9F=E6=9D=A5=E4=BB=85=E5=AF=B9=E6=A0=87=E9=A2=98?= =?UTF-8?q?=E6=A3=80=E7=B4=A2=E5=85=B3=E9=94=AE=E5=AD=97)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contest/views.py b/contest/views.py index 4763bd8..2153f95 100644 --- a/contest/views.py +++ b/contest/views.py @@ -343,7 +343,7 @@ def contest_list_page(request, page=1): # 搜索的情况 keyword = request.GET.get("keyword", None) if keyword: - contests = contests.filter(title__contains=keyword) + contests = contests.filter(Q(title__contains=keyword) | Q(description__contains=keyword)) # 筛选我能参加的比赛 join = request.GET.get("join", None) From 63a858bd06fc061cbc6ca15b1dbb1fef36303fa4 Mon Sep 17 00:00:00 2001 From: esp Date: Sat, 29 Aug 2015 18:21:03 +0800 Subject: [PATCH 31/34] =?UTF-8?q?[=E5=89=8D=E5=8F=B0]=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BA=86=E5=B0=8F=E7=BB=84=E5=88=97=E8=A1=A8=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?,=E5=B8=A6=E6=B5=8B=E8=AF=95,=E4=B8=8D=E5=85=A8=E8=A6=86?= =?UTF-8?q?=E7=9B=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group/tests.py | 27 ++++++++++++ group/views.py | 53 +++++++++++++++++++---- oj/urls.py | 5 ++- template/src/oj/group/group_list.html | 60 +++++++++++---------------- 4 files changed, 101 insertions(+), 44 deletions(-) diff --git a/group/tests.py b/group/tests.py index f62dfa5..50e7168 100644 --- a/group/tests.py +++ b/group/tests.py @@ -8,6 +8,8 @@ from rest_framework.test import APITestCase, APIClient from account.models import User, REGULAR_USER, ADMIN, SUPER_ADMIN from group.models import Group, UserGroupRelation, JoinGroupRequest +from django.test import TestCase, Client + class GroupAPITest(APITestCase): pass @@ -254,3 +256,28 @@ class JoinGroupRequestAdminAPITest(APITestCase): response = self.client.put(self.url, data=data) self.assertEqual(response.data, {"code": 1, "data": u"加入失败,已经在本小组内"}) + +class ProblemListPageTest(TestCase): + def setUp(self): + self.client = Client() + self.url = reverse('group_list_page') + self.url = reverse('problem_list_page', kwargs={"page": 1}) + self.user = User.objects.create(username="test", admin_type=SUPER_ADMIN) + self.user.set_password("testaa") + self.user.save() + self.group = Group.objects.create(name="group1", + description="description1", + # 0是公开 1是需要申请后加入 2是不允许任何人加入 + join_group_setting = 1, + admin=User.objects.get(username="test")) + + def get_group_list_page_successful(self): + self.client.login(username="test", password="testaa") + response = self.client.get(self.url) + self.assertEqual(response.status_coed, 200) + + def get_group_list_page_successful_with_keyword(self): + self.client.login(username="test", password="testaa") + response = self.client.get(self.url+"?keyword=gro") + self.assertEqual(response.status_coed, 200) + diff --git a/group/views.py b/group/views.py index ff1cbde..6a9d2d1 100644 --- a/group/views.py +++ b/group/views.py @@ -4,7 +4,7 @@ from django.db import IntegrityError from rest_framework.views import APIView -from utils.shortcuts import error_response, serializer_invalid_response, success_response, paginate +from utils.shortcuts import error_response, serializer_invalid_response, success_response, paginate, error_page from account.models import REGULAR_USER, ADMIN, SUPER_ADMIN from account.decorators import login_required @@ -13,6 +13,9 @@ from .serializers import (CreateGroupSerializer, EditGroupSerializer, CreateJoinGroupRequestSerializer, GroupSerializer, GroupMemberSerializer, EditGroupMemberSerializer, JoinGroupRequestSerializer, PutJoinGroupRequestSerializer) +from announcement.models import Announcement +from django.core.paginator import Paginator +from django.db.models import Q class GroupAPIViewBase(object): @@ -26,7 +29,7 @@ class GroupAPIViewBase(object): else: group = Group.objects.get(id=group_id, visible=True, admin=request.user) return group - + def get_groups(self, request): """ 如果是超级管理员,就返回全部的小组 @@ -113,8 +116,8 @@ class GroupAdminAPIView(APIView, GroupAPIViewBase): elif request.GET.get("admin_id", None): groups = groups.filter(admin__id=request.GET["admin_id"]) return paginate(request, groups, GroupSerializer) - - + + class GroupMemberAdminAPIView(APIView, GroupAPIViewBase): def get(self, request): """ @@ -129,9 +132,9 @@ class GroupMemberAdminAPIView(APIView, GroupAPIViewBase): group = self.get_group(request, group_id) except Group.DoesNotExist: return error_response(u"小组不存在") - + return paginate(request, UserGroupRelation.objects.filter(group=group), GroupMemberSerializer) - + def put(self, request): """ 删除小组成员的api接口 @@ -190,7 +193,7 @@ class JoinGroupAPIView(APIView): return error_response(u"该小组不允许任何人加入") else: return serializer_invalid_response(serializer) - + def get(self, request): """ 搜索小组的api,需要传递keyword参数 @@ -244,3 +247,39 @@ class JoinGroupRequestAdminAPIView(APIView, GroupAPIViewBase): else: return serializer_invalid_response(serializer) + +@login_required +def group_list_page(request, page=1): + # 右侧的公告列表 + announcements = Announcement.objects.filter(is_global=True, visible=True).order_by("-create_time") + + groups = Group.objects.filter(visible=True, join_group_setting__lte=2) + # 搜索的情况 + keyword = request.GET.get("keyword", None) + if keyword: + groups = groups.filter(Q(name__contains=keyword) | Q(description__contains=keyword)) + + paginator = Paginator(groups, 20) + try: + current_page = paginator.page(int(page)) + except Exception: + return error_page(request, u"不存在的页码") + + previous_page = next_page = None + + try: + previous_page = current_page.previous_page_number() + except Exception: + pass + next_page = None + try: + next_page = current_page.next_page_number() + except Exception: + pass + + return render(request, "oj/group/group_list.html", { + "groups": groups, "announcements": announcements, + "contests": current_page, "page": int(page), + "previous_page": previous_page, "next_page": next_page, + "keyword": keyword, "announcements": announcements, + }) diff --git a/oj/urls.py b/oj/urls.py index b3f6929..08937c4 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -100,6 +100,9 @@ urlpatterns = [ url(r'^submissions/$', "submission.views.my_submission_list_page", name="my_submission_list_page"), url(r'^submissions/(?P\d+)/$', "submission.views.my_submission_list_page", name="my_submission_list_page"), - url(r'^contest/(?P\d+)/rank/$', "contest.views.contest_rank_page", name="contest_rank_page") + url(r'^contest/(?P\d+)/rank/$', "contest.views.contest_rank_page", name="contest_rank_page"), + + url(r'^groups/$', "group.views.group_list_page", name="group_list_page"), + url(r'^groups/(?P\d+)/$', "group.views.group_list_page", name="group_list_page") ] diff --git a/template/src/oj/group/group_list.html b/template/src/oj/group/group_list.html index 247b07f..d499e1a 100644 --- a/template/src/oj/group/group_list.html +++ b/template/src/oj/group/group_list.html @@ -18,21 +18,27 @@
    # 提交时间 + + 运行时间 + +
    {{ forloop.counter |add:start_id }} {{ item.create_time }}{{ item.result|translate_result }} + {{ item.language|translate_language }} + {% if item.accepted_answer_time %} {{ item.accepted_answer_time }}ms @@ -53,9 +61,10 @@ -- {% endif %} - {{ item.language|translate_language }} + + {{ item.result|translate_result }}
    - - - - + + + + - {% for item in problems %} + {% for item in groups %} - - - - - + + + + + {% endfor %} @@ -41,13 +47,16 @@ @@ -56,28 +65,7 @@
    {% include "oj/announcement/_announcement_panel.html" %} -
    -
    -

    - - 分类 -

    -
    -
      - {% for item in tags %} -
    • - {{ item.problem_number }} - {{ item.name }} -
    • - {% endfor %} -
    -
    -
    {% endblock %} - -{% block js_block %} - -{% endblock %} \ No newline at end of file From f222472c1330380cc3c4cdcc81f14e6f488d8492 Mon Sep 17 00:00:00 2001 From: esp Date: Sat, 29 Aug 2015 19:04:26 +0800 Subject: [PATCH 32/34] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A2=98=E7=9B=AE?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=A3=80=E7=B4=A2=E5=8C=85=E5=90=AB=E6=8F=8F?= =?UTF-8?q?=E8=BF=B0=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problem/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problem/views.py b/problem/views.py index 2e9d172..6052ea9 100644 --- a/problem/views.py +++ b/problem/views.py @@ -222,7 +222,7 @@ def problem_list_page(request, page=1): # 搜索的情况 keyword = request.GET.get("keyword", None) if keyword: - problems = problems.filter(title__contains=keyword) + problems = problems.filter(Q(title__contains=keyword) | Q(description__contains=keyword)) # 按照标签筛选 tag_text = request.GET.get("tag", None) From 546fe6337a8f38551d67fea61c5fe4cae0ceaea5 Mon Sep 17 00:00:00 2001 From: esp Date: Sat, 29 Aug 2015 19:05:04 +0800 Subject: [PATCH 33/34] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E6=B3=A8=E9=87=8A[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- submission/tests.py | 1 - 1 file changed, 1 deletion(-) diff --git a/submission/tests.py b/submission/tests.py index 3aab246..0d374ee 100644 --- a/submission/tests.py +++ b/submission/tests.py @@ -18,7 +18,6 @@ class SubmissionsListPageTest(TestCase): self.user.set_password("666666") self.user.save() self.user2.save() - # self.client.login(username="gogoing", password="666666") self.submission = Submission.objects.create(user_id=self.user.id, language=1, code='#include "stdio.h"\nint main(){\n\treturn 0;\n}', From d903832ba29446907d0452bb59048f7609eeff9a Mon Sep 17 00:00:00 2001 From: esp Date: Sat, 29 Aug 2015 19:13:20 +0800 Subject: [PATCH 34/34] =?UTF-8?q?[Bugs]=E4=BF=AE=E5=A4=8D=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E7=AE=A1=E7=90=86=E6=AF=94=E8=B5=9B,=E9=A2=98?= =?UTF-8?q?=E7=9B=AE=E5=88=97=E8=A1=A8=E5=8F=AF=E8=A7=81=E4=B8=8D=E5=8F=AF?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/src/admin/contest/contest_list.html | 2 +- template/src/admin/problem/problem_list.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/template/src/admin/contest/contest_list.html b/template/src/admin/contest/contest_list.html index 7418a56..945d1f5 100644 --- a/template/src/admin/contest/contest_list.html +++ b/template/src/admin/contest/contest_list.html @@ -173,7 +173,7 @@ - + - +
    #题目难度通过率名称加入方式创建者创建时间
    {{ item.id }}{{ item.title }}{{ item.difficulty }}{{ item|accepted_radio }}{{ item.id }}{{ item.name }} + {% if item.join_group_setting %} + 需要申请 + {% else %} + 无需申请 + {% endif %} + {{ item.admin }}{{ item.create_time }}
    {{ el.sort_index }} {{ el.title }} {{ el.score}}{{ getYesOrNo(el.visible) }} {{ el.create_time|date("yyyy-MM-dd HH:mm:ss") }} {{ el.title }} {{ el.create_time|date("yyyy-MM-dd HH:mm:ss")}} {{ el.created_by.username }}{{ getYesOrNo(el.visible) }} {{ el.total_accepted_number }}/{{ el.total_submit_number }}