Accept Merge Request #290 virusdefender-dev -> dev : (virusdefender-dev -> dev)

Merge Request: virusdefender-dev -> dev
Created By: @virusdefender
Accepted By: @virusdefender
URL: https://coding.net/u/virusdefender/p/qduoj/git/merge/290
This commit is contained in:
virusdefender
2015-11-02 21:05:03 +08:00
14 changed files with 97 additions and 109 deletions

View File

@@ -91,6 +91,10 @@ def check_user_contest_permission(func):
return render(request, "oj/contest/no_contest_permission.html",
{"reason": "contest_not_start", "show_tab": False, "contest": contest})
# 比赛已经结束了,只拦截 ajax 的答案提交
if contest.status == CONTEST_ENDED and request.is_ajax():
return error_response(u"比赛已经结束")
return func(*args, **kwargs)
return _check_user_contest_permission

View File

@@ -96,7 +96,7 @@ class MessageQueue(object):
contest_problem.add_ac_number()
problems_status["contest_problems"][str(contest_problem.id)] = 1
else:
problems_status["contest_problems"][str(contest_problem.id)] = 1
problems_status["contest_problems"][str(contest_problem.id)] = 0
user.problems_status = problems_status
user.save()

View File

@@ -21,8 +21,7 @@ from admin.views import AdminTemplateView
from problem.views import TestCaseUploadAPIView, ProblemTagAdminAPIView, ProblemAdminAPIView
from submission.views import (SubmissionAPIView, SubmissionAdminAPIView, ContestSubmissionAPIView,
SubmissionShareAPIView, SubmissionRejudgeAdminAPIView,
ContestSubmissionAdminAPIView)
SubmissionShareAPIView, SubmissionRejudgeAdminAPIView)
from monitor.views import QueueLengthMonitorAPIView
from utils.views import SimditorImageUploadAPIView
@@ -73,8 +72,6 @@ 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<contest_id>\d+)/problem/(?P<contest_problem_id>\d+)/$', "contest.views.contest_problem_page",
name="contest_problem_page"),

View File

@@ -48,7 +48,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "date
method: "post",
success: function (data) {
if (!data.code) {
bsAlert("添加成功!将转到比赛列表页以便为比赛添加问题(注意比赛当前状态为:隐藏)");
bsAlert("添加成功!接下来下需要为比赛添加问题(注意比赛当前状态为:隐藏)");
location.hash = "#contest/contest_list";
}
else {
@@ -61,8 +61,19 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "date
});
//editor("#editor");
if (avalon.vmodels.add_contest)
if (avalon.vmodels.add_contest) {
var vm = avalon.vmodels.add_contest;
vm.title = "";
vm.startTime = "";
vm.endTime = "";
vm.password = "";
vm.isGlobal = true;
vm.allGroups = [];
vm.showGlobalViewRadio = true;
vm.realTimeRank = true;
avalon.vmodels.contestDescriptionEditor.content = "";
}
else
var vm = avalon.define({
$id: "add_contest",

View File

@@ -130,6 +130,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "date
vm.realTimeRank = contest.real_time_rank;
vm.startTime = contest.start_time.substring(0, 16).replace("T", " ");
vm.endTime = contest.end_time.substring(0, 16).replace("T", " ");
vm.password = contest.password;
if (contest.contest_type == 0) { //contest_type == 0, 小组内比赛
vm.isGlobal = false;
for (var i = 0; i < vm.allGroups.length; i++) {

View File

@@ -134,6 +134,19 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE
});
else {
var vm = avalon.vmodels.editProblem;
title = "";
description = "";
timeLimit = 1000;
memoryLimit = 128;
samples = [];
hint = "";
sortIndex = "";
visible = true;
inputDescription = "";
outputDescription = "";
testCaseId = "";
testCaseList = [];
uploadSuccess = false;
}
var testCaseUploader = uploader("#testCaseFile", "/api/admin/test_case_upload/", function (file, response) {

View File

@@ -79,6 +79,20 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE
if (avalon.vmodels.addProblem) {
var vm = avalon.vmodels.addProblem;
vm.title = "";
vm.timeLimit = 1000;
vm.memoryLimit = 128;
vm.samples = [{input: "", output: "", "visible": true}];
vm.visible = true;
vm.difficulty = "1";
vm.tags = [];
vm.inputDescription = "";
vm.outputDescription = "";
vm.testCaseId = "";
vm.testCaseList = [];
vm.uploadSuccess = false;
vm.source = "";
vm.uploadProgress = 0;
}
else
var vm = avalon.define({

View File

@@ -165,6 +165,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE
avalon.vmodels.problemDescriptionEditor.content = problem.description;
vm.timeLimit = problem.time_limit;
vm.memoryLimit = problem.memory_limit;
vm.samples = [];
for (var i = 0; i < problem.samples.length; i++) {
vm.samples.push({
input: problem.samples[i].input,

View File

@@ -62,17 +62,18 @@
admin_8_pack: "app/admin/admin",
login_9_pack: "app/oj/account/login",
addContest_10_pack: "app/admin/contest/addContest",
changePassword_11_pack: "app/oj/account/changePassword",
monitor_12_pack: "app/admin/monitor/monitor",
editProblem_13_pack: "app/admin/contest/editProblem",
joinGroupRequestList_14_pack: "app/admin/group/joinGroupRequestList",
group_15_pack: "app/oj/group/group",
editProblem_16_pack: "app/admin/problem/editProblem",
register_17_pack: "app/oj/account/register",
groupDetail_18_pack: "app/admin/group/groupDetail",
contestPassword_19_pack: "app/oj/contest/contestPassword",
group_20_pack: "app/admin/group/group",
submissionList_21_pack: "app/admin/contest/submissionList"
contestPassword_11_pack: "app/oj/contest/contestPassword",
changePassword_12_pack: "app/oj/account/changePassword",
monitor_13_pack: "app/admin/monitor/monitor",
editProblem_14_pack: "app/admin/contest/editProblem",
joinGroupRequestList_15_pack: "app/admin/group/joinGroupRequestList",
group_16_pack: "app/oj/group/group",
contestProblemList_17_pack: "app/admin/contest/contestProblemList",
editProblem_18_pack: "app/admin/problem/editProblem",
register_19_pack: "app/oj/account/register",
groupDetail_20_pack: "app/admin/group/groupDetail",
editContest_21_pack: "app/admin/contest/editContest",
group_22_pack: "app/admin/group/group",
},
shim: {
avalon: {
@@ -123,38 +124,41 @@
name: "addContest_10_pack"
},
{
name: "changePassword_11_pack"
name: "contestPassword_11_pack"
},
{
name: "monitor_12_pack"
name: "changePassword_12_pack"
},
{
name: "editProblem_13_pack"
name: "monitor_13_pack"
},
{
name: "joinGroupRequestList_14_pack"
name: "editProblem_14_pack"
},
{
name: "group_15_pack"
name: "joinGroupRequestList_15_pack"
},
{
name: "editProblem_16_pack"
name: "group_16_pack"
},
{
name: "register_17_pack"
name: "contestProblemList_17_pack"
},
{
name: "groupDetail_18_pack"
name: "editProblem_18_pack"
},
{
name: "contestPassword_19_pack"
name: "register_19_pack"
},
{
name: "group_20_pack"
name: "groupDetail_20_pack"
},
{
name: "submissionList_21_pack"
name: "editContest_21_pack"
},
{
name: "group_22_pack"
}
],
optimizeCss: "standard",
})

View File

@@ -64,17 +64,18 @@ var require = {
admin_8_pack: "app/admin/admin",
login_9_pack: "app/oj/account/login",
addContest_10_pack: "app/admin/contest/addContest",
changePassword_11_pack: "app/oj/account/changePassword",
monitor_12_pack: "app/admin/monitor/monitor",
editProblem_13_pack: "app/admin/contest/editProblem",
joinGroupRequestList_14_pack: "app/admin/group/joinGroupRequestList",
group_15_pack: "app/oj/group/group",
editProblem_16_pack: "app/admin/problem/editProblem",
register_17_pack: "app/oj/account/register",
groupDetail_18_pack: "app/admin/group/groupDetail",
contestPassword_19_pack: "app/oj/contest/contestPassword",
group_20_pack: "app/admin/group/group",
submissionList_21_pack: "app/admin/contest/submissionList"
contestPassword_11_pack: "app/oj/contest/contestPassword",
changePassword_12_pack: "app/oj/account/changePassword",
monitor_13_pack: "app/admin/monitor/monitor",
editProblem_14_pack: "app/admin/contest/editProblem",
joinGroupRequestList_15_pack: "app/admin/group/joinGroupRequestList",
group_16_pack: "app/oj/group/group",
contestProblemList_17_pack: "app/admin/contest/contestProblemList",
editProblem_18_pack: "app/admin/problem/editProblem",
register_19_pack: "app/oj/account/register",
groupDetail_20_pack: "app/admin/group/groupDetail",
editContest_21_pack: "app/admin/contest/editContest",
group_22_pack: "app/admin/group/group",
},
shim: {
avalon: {

View File

@@ -659,10 +659,10 @@
yearSingularText: 'year',
monthSingularText: 'month',
weekSingularText: 'week',
daySingularText: 'day',
hourSingularText: 'hour',
minSingularText: 'min',
secSingularText: 'sec',
daySingularText: '',
hourSingularText: '小时',
minSingularText: '分钟',
secSingularText: '',
digits : [0,1,2,3,4,5,6,7,8,9],
isRTL: false,
minus: false,

View File

@@ -8,7 +8,7 @@ from .models import Submission
class CreateSubmissionSerializer(serializers.Serializer):
problem_id = serializers.IntegerField()
language = serializers.IntegerField()
code = serializers.CharField(max_length=3000)
code = serializers.CharField(max_length=20000)
class SubmissionSerializer(serializers.ModelSerializer):
@@ -34,6 +34,6 @@ class CreateContestSubmissionSerializer(serializers.Serializer):
contest_id = serializers.IntegerField()
problem_id = serializers.IntegerField()
language = serializers.IntegerField()
code = serializers.CharField(max_length=3000)
code = serializers.CharField(max_length=20000)

View File

@@ -286,24 +286,3 @@ class SubmissionRejudgeAdminAPIView(APIView):
return success_response(u"任务提交成功")
else:
return serializer_invalid_response(serializer)
class ContestSubmissionAdminAPIView(APIView):
@check_user_contest_permission
def get(self, request):
"""
查询比赛提交,单个比赛题目提交的adminAPI
---
response_serializer: SubmissionSerializer
"""
problem_id = request.GET.get("problem_id", None)
contest_id = request.GET.get("contest_id", None)
# 需要 problem_id 和 contest_id 两个参数 否则会在check_user_contest_permission 的时候被拦截
if problem_id:
submissions = Submission.objects.filter(contest_id=contest_id, problem_id=problem_id).order_by("-create_time")
# 需要 contest_id 参数
else:
submissions = Submission.objects.filter(contest_id=contest_id).order_by("-create_time")
return paginate(request, submissions, SubmissionSerializer)

View File

@@ -1,37 +0,0 @@
<div ms-controller="contestSubmissionList" class="col-md-9">
<nav>
<ul class="pager">
<li class="previous" ms-click="goBack()"><a href="javascript:void(0)"><span
aria-hidden="true">&larr;</span> 返回</a></li>
</ul>
</nav>
<h1>提交列表</h1>
<a href="javascript:void(0)" class="btn btn-sm btn-primary" ms-click="getPage(1)">
<span class="glyphicon glyphicon-refresh"></span> 刷新
</a>
<table class="table table-striped">
<tr>
<th>ID</th>
<th>创建时间</th>
<th>作者</th>
<td>结果</td>
<td></td>
</tr>
<tr ms-repeat="submissionList">
<td>{{ el.id }}</td>
<td>{{ el.create_time|date("yyyy-MM-dd HH:mm:ss")}}</td>
<td>{{ el.user }}</td>
<td>{{ results[el.result] }}</td>
<td>
<a class="btn btn-info" ms-attr-href="'/submission/' + el.id + '/'" target="_blank">详情</a>
</td>
</tr>
</table>
<div class="text-right">
页数:{{ page }}/{{ totalPage }}&nbsp;&nbsp;
<button ms-attr-class="getBtnClass('pre')" ms-click="getPrevious">上一页</button>
<button ms-attr-class="getBtnClass('next')" ms-click="getNext">下一页</button>
</div>
</div>
<script src="/static/js/app/admin/contest/submissionList.js"></script>