diff --git a/contest/decorators.py b/contest/decorators.py index 2f5e3ba3..93e24fad 100644 --- a/contest/decorators.py +++ b/contest/decorators.py @@ -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 diff --git a/mq/scripts/mq.py b/mq/scripts/mq.py index 411b1033..a3b15e7e 100644 --- a/mq/scripts/mq.py +++ b/mq/scripts/mq.py @@ -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() diff --git a/oj/urls.py b/oj/urls.py index 53283fe2..c4d2e09f 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -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\d+)/problem/(?P\d+)/$', "contest.views.contest_problem_page", name="contest_problem_page"), diff --git a/static/src/js/app/admin/contest/addContest.js b/static/src/js/app/admin/contest/addContest.js index 9cbd57dd..e84f6b08 100644 --- a/static/src/js/app/admin/contest/addContest.js +++ b/static/src/js/app/admin/contest/addContest.js @@ -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", diff --git a/static/src/js/app/admin/contest/editContest.js b/static/src/js/app/admin/contest/editContest.js index f34e2614..67a027c3 100644 --- a/static/src/js/app/admin/contest/editContest.js +++ b/static/src/js/app/admin/contest/editContest.js @@ -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++) { diff --git a/static/src/js/app/admin/contest/editProblem.js b/static/src/js/app/admin/contest/editProblem.js index 31b2560a..4fdb94fe 100644 --- a/static/src/js/app/admin/contest/editProblem.js +++ b/static/src/js/app/admin/contest/editProblem.js @@ -49,7 +49,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE ajaxData["id"] = avalon.vmodels.admin.problemId; var alertContent = "题目编辑成功"; } - else{ + else { var method = "post"; var alertContent = "题目创建成功"; } @@ -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) { @@ -142,7 +155,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE else { vm.testCaseId = response.data.test_case_id; vm.testCaseList = []; - for(var key in response.data.file_list){ + for (var key in response.data.file_list) { vm.testCaseList.push({ input: response.data.file_list[key].input_name, output: response.data.file_list[key].output_name @@ -189,8 +202,8 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE url: "/api/admin/test_case_upload/?test_case_id=" + vm.testCaseId, method: "get", dataType: "json", - success: function(response){ - if(response.code){ + success: function (response) { + if (response.code) { bsAlert(response.data); } else { diff --git a/static/src/js/app/admin/problem/addProblem.js b/static/src/js/app/admin/problem/addProblem.js index dc19f0b5..e2f9e6fc 100644 --- a/static/src/js/app/admin/problem/addProblem.js +++ b/static/src/js/app/admin/problem/addProblem.js @@ -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({ @@ -135,7 +149,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE vm.testCaseId = response.data.test_case_id; vm.uploadSuccess = true; vm.testCaseList = []; - for(var key in response.data.file_list){ + for (var key in response.data.file_list) { vm.testCaseList.push({ input: response.data.file_list[key].input_name, output: response.data.file_list[key].output_name diff --git a/static/src/js/app/admin/problem/editProblem.js b/static/src/js/app/admin/problem/editProblem.js index 9fa96251..e6dda3be 100644 --- a/static/src/js/app/admin/problem/editProblem.js +++ b/static/src/js/app/admin/problem/editProblem.js @@ -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, diff --git a/static/src/js/lib/jcountdown/jcountdown.js b/static/src/js/lib/jcountdown/jcountdown.js index aa91f597..318f7b73 100644 --- a/static/src/js/lib/jcountdown/jcountdown.js +++ b/static/src/js/lib/jcountdown/jcountdown.js @@ -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, diff --git a/submission/serializers.py b/submission/serializers.py index dcaf7014..a0bc1094 100644 --- a/submission/serializers.py +++ b/submission/serializers.py @@ -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) diff --git a/submission/views.py b/submission/views.py index e9eaa44e..1f2acb16 100644 --- a/submission/views.py +++ b/submission/views.py @@ -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)