Accept Merge Request #291 dev -> master : (dev -> master)

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

View File

@ -91,6 +91,10 @@ def check_user_contest_permission(func):
return render(request, "oj/contest/no_contest_permission.html", return render(request, "oj/contest/no_contest_permission.html",
{"reason": "contest_not_start", "show_tab": False, "contest": contest}) {"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 func(*args, **kwargs)
return _check_user_contest_permission return _check_user_contest_permission

View File

@ -96,7 +96,7 @@ class MessageQueue(object):
contest_problem.add_ac_number() contest_problem.add_ac_number()
problems_status["contest_problems"][str(contest_problem.id)] = 1 problems_status["contest_problems"][str(contest_problem.id)] = 1
else: 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.problems_status = problems_status
user.save() user.save()

View File

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

View File

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

View File

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

View File

@ -134,6 +134,19 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE
}); });
else { else {
var vm = avalon.vmodels.editProblem; 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) { 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) { if (avalon.vmodels.addProblem) {
var vm = 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 else
var vm = avalon.define({ var vm = avalon.define({

View File

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

View File

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

View File

@ -8,7 +8,7 @@ from .models import Submission
class CreateSubmissionSerializer(serializers.Serializer): class CreateSubmissionSerializer(serializers.Serializer):
problem_id = serializers.IntegerField() problem_id = serializers.IntegerField()
language = serializers.IntegerField() language = serializers.IntegerField()
code = serializers.CharField(max_length=3000) code = serializers.CharField(max_length=20000)
class SubmissionSerializer(serializers.ModelSerializer): class SubmissionSerializer(serializers.ModelSerializer):
@ -34,6 +34,6 @@ class CreateContestSubmissionSerializer(serializers.Serializer):
contest_id = serializers.IntegerField() contest_id = serializers.IntegerField()
problem_id = serializers.IntegerField() problem_id = serializers.IntegerField()
language = 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"任务提交成功") return success_response(u"任务提交成功")
else: else:
return serializer_invalid_response(serializer) 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)