增加前台题目的重新判题功能

This commit is contained in:
virusdefender
2015-09-21 13:56:54 +08:00
parent 60d727d7b2
commit 5f23bff3c5
5 changed files with 51 additions and 2 deletions

View File

@@ -17,7 +17,8 @@ from group.views import (GroupAdminAPIView, GroupMemberAdminAPIView,
from admin.views import AdminTemplateView 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, SubmissionShareAPIView from submission.views import (SubmissionAPIView, SubmissionAdminAPIView,
SubmissionShareAPIView, SubmissionRejudgeAdminAPIView)
from contest_submission.views import ContestSubmissionAPIView, ContestSubmissionAdminAPIView from contest_submission.views import ContestSubmissionAPIView, ContestSubmissionAdminAPIView
from monitor.views import QueueLengthMonitorAPIView from monitor.views import QueueLengthMonitorAPIView
from utils.views import SimditorImageUploadAPIView from utils.views import SimditorImageUploadAPIView
@@ -119,4 +120,5 @@ urlpatterns = [
url(r'^api/account_security_check/$', AccountSecurityAPIView.as_view(), name="account_security_check"), url(r'^api/account_security_check/$', AccountSecurityAPIView.as_view(), name="account_security_check"),
url(r'^api/contest/time/$', ContestTimeAPIView.as_view(), name="contest_time_api_view"), url(r'^api/contest/time/$', ContestTimeAPIView.as_view(), name="contest_time_api_view"),
url(r'^api/admin/rejudge/$', SubmissionRejudgeAdminAPIView.as_view(), name="submission_rejudge_api"),
] ]

View File

@@ -51,6 +51,20 @@ require(["jquery", "avalon", "csrfToken", "bsAlert"], function ($, avalon, csrfT
}, },
showProblemListPage: function(){ showProblemListPage: function(){
vm.$fire("up!showProblemListPage"); vm.$fire("up!showProblemListPage");
},
rejudge: function(submission_id){
$.ajax({
beforeSend: csrfTokenHeader,
url: "/api/admin/rejudge/",
method: "post",
data: {"submission_id": submission_id},
success: function(data){
if(!data.code){
bsAlert("重判任务提交成功");
}
}
})
} }
}); });
} }

View File

@@ -26,3 +26,7 @@ class SubmissionhareSerializer(serializers.Serializer):
submission_id = serializers.CharField(max_length=40) submission_id = serializers.CharField(max_length=40)
class SubmissionRejudgeSerializer(serializers.Serializer):
submission_id = serializers.CharField(max_length=40)

View File

@@ -19,7 +19,8 @@ from announcement.models import Announcement
from utils.shortcuts import serializer_invalid_response, error_response, success_response, error_page, paginate from utils.shortcuts import serializer_invalid_response, error_response, success_response, error_page, paginate
from .models import Submission from .models import Submission
from .serializers import CreateSubmissionSerializer, SubmissionSerializer, SubmissionhareSerializer from .serializers import (CreateSubmissionSerializer, SubmissionSerializer,
SubmissionhareSerializer, SubmissionRejudgeSerializer)
logger = logging.getLogger("app_info") logger = logging.getLogger("app_info")
@@ -219,3 +220,30 @@ class SubmissionShareAPIView(APIView):
return success_response(submission.shared) return success_response(submission.shared)
else: else:
return serializer_invalid_response(serializer) return serializer_invalid_response(serializer)
class SubmissionRejudgeAdminAPIView(APIView):
def post(self, request):
serializer = SubmissionRejudgeSerializer(data=request.data)
if serializer.is_valid():
submission_id = serializer.data["submission_id"]
try:
submission = Submission.objects.get(id=submission_id)
except Submission.DoesNotExist:
return error_response(u"提交不存在")
# 目前只考虑前台公开题目的重新判题
try:
problem = Problem.objects.get(id=submission.problem_id)
except Problem.DoesNotExist:
return error_response(u"题目不存在")
try:
judge.delay(submission_id, problem.time_limit, problem.memory_limit, problem.test_case_id)
except Exception as e:
logger.error(e)
return error_response(u"提交判题任务失败")
# 增加redis 中判题队列长度的计数器
r = redis.Redis(host=redis_config["host"], port=redis_config["port"], db=redis_config["db"])
r.incr("judge_queue_length")
else:
return serializer_invalid_response(serializer)

View File

@@ -22,6 +22,7 @@
<td>{{ results[el.result] }}</td> <td>{{ results[el.result] }}</td>
<td> <td>
<a class="btn btn-info" ms-attr-href="'/submission/' + el.id + '/'" target="_blank">详情</a> <a class="btn btn-info" ms-attr-href="'/submission/' + el.id + '/'" target="_blank">详情</a>
<a class="btn btn-primary" ms-click="rejudge(el.id)">重判</a>
</td> </td>
</tr> </tr>
</table> </table>