mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2024-09-21 16:33:22 +00:00
9977e156b1
* dev: ¢ûÂ䆉∫ÜÊØî˵õÂàóË°®È°µ [ÂêéÁ´Ø]ÂéªÊéâ‰∫ÜÁ∫éÁîü‰∫ßÂ∫èÂè∑ÁöÑjavascript,Êîπ‰∏∫‰ΩøÁî®Ê®°ÊùøËøáʪ§Âô®ÂÆûÁé∞(ÊàëÁöÑÊâÄÊúâÊèê‰∫§) [ÂâçÁ´Ø]‰øÆÊîπÂÆåÂñщ∫ÜÊ∑ªÂä†ÊØî˵õÈ°µÈù¢, ÊØî˵õÂàóË°®ÂäüËÉΩ‰ªç‰∏çÂÖ®Èù¢,Á®çÂêéÊîπËøõ[CI SKIP] ‰øÆÊîπ‰∫ÜcssºïÁî®Êñπºè[CI SKIP] [ÂêéÁ´Ø]‰øÆÊîπ‰∫Ücontest‰∏≠ api-docs ÁöÑÂ∞èbug[CI SKIP] Âàõª∫ÂâçÂè∞ÊØî˵õÂàóË°® ÂéªÊéâÂÜó‰ΩôËØ≠Âè•,Âõ†‰∏∫pageÂèòÈáèÂ∑≤ÁªèÊúâȪòËƧÂĺ‰∫Ü,‰∏çËÉΩ‰∏∫Á©∫ [ÂêéÁ´Ø]ÂâçÂè∞ÊàëÁöÑÊèê‰∫§È°µÈù¢ ¢ûº∫Êèê‰∫§Â∫èÂè∑ÁöÑÊòæÁ§∫,ÂéüÊù•ÊòØÊòæÁ§∫ÁúüÂÆûidÂç≥ÈöèÊú∫ÁöÑÊï£ÂàóÂĺ,‰∏ç•ΩÁúã,Áé∞Âú®ÊîπÊàêËá™ÁÑ∂Êï∞Â∫èÂàó,‰ΩÜÈúÄ˶ÅÁªìÂêàjavascriptÁîüÊàê,‰∏îÊòØÁõ∏ÂØπÂĺ,Âõ†‰∏∫Êï∞ÊçÆÂ∫ìÈáåÊ≤°ÊúâËøô‰∏™Â≠óÊƵ,ÊúâÁÇπÂà´Êâ≠‰∫Ü. Á¨¨‰∫å,Ê∑ªÂ䆉∫ÜÁî®Êà∑Ê≤°ÊúâÊèê‰∫§ËÆ∞ÂΩïÁöÑÂèçȶà. Á¨¨‰∏â,Êú¨ÊâìÁÆó¢ûÂä†Á≠õÈÄâÂäüËÉΩ,‰ΩÜÂõ†‰∏∫URLÈö扪•Áªü‰∏ĉΩúÁΩ¢,Âè™ÊúâÂú®Â¢ûÂä†Êñ∞ÁöÑurlÊâçËÉΩËæÉ•ΩÁöѧÑÁêÜ,‰∏ãʨ°ÂÜçËØ¥Êãú [ÂâçÁ´Ø]ÊØî˵õÂàóË°®È°µÈù¢(ÂêéÂè∞)ÁöÑËøõ‰∏ÄÊ≠•ÂÆåÂñÑ,‰∏çÂåÖÂê´api [ÂêéÁ´Ø]‰øÆÊîπ‰∫ÜÊàëÁöÑÊèê‰∫§ÂàóË°®ÁöÑÊ®°Êùøʆ∑ºè,Êï¥ÁêÜʆºÂºè [ÂêéÁ´Ø]‰øÆÊîπÊàëÁöÑÊèê‰∫§È°µÈù¢,ÂéªÊéâ‰∫ÜÂÜó‰ΩôËØ≠Âè•,Âπ∂Ê∑ªÂä†ÊµãËØï [ÂêéÁ´Ø-ÂâçÂè∞]Ê∑ªÂ䆉∫ÜsubmissionsÂàÜÈ°µÊòæÁ§∫(Âè™ÊòæÁ§∫ÂΩìÂâçÁî®Êà∑ÁöÑÊèê‰∫§),Ë∞ÉÁî®Â∑≤ÊúâÁöÑviewÂÆåÊàêÂçï‰∏™submissionÁöÑÊòæÁ§∫.ÊòæÁ§∫ÁïåÈù¢‰∏éÈóÆÈ¢òÂàÜÈ°µÊòæÁ§∫Áªü‰∏Ä.ÈóÆÈ¢òÊòØidÁöÑÊòæÁ§∫.url:http://127.0.0.1:8000/my_submissions/ [ÂâçÁ´Ø]‰øÆÊîπÊ∑ªÂä†ÊØî˵õÈ°µÈù¢,Êñ∞¢û‰∫܉ΩøÁî®Â∞èÁªÑapiÊü•ËØ¢ËØ•Áî®Êà∑ÊâÄÂàõª∫ÁöÑÊâÄÊúâÁöÑÂ∞èÁªÑÁöÑÂäüËÉΩ[CI SKIP] [ÂâçÁ´Ø]Ê∑ªÂä†ÊØî˵õÈ°µÈù¢Ëøõ‰∏ÄÊ≠•ÂÆåÂñÑ,Ê∑ªÂä†Â≠óÊƵÂåÖÊã¨ÊòØÂê¶ÊòæÁ§∫Êèê‰∫§,ÊØî˵õÊ®°Âºè,ÈóÆÈ¢òÂàÜÂĺ,ÂÖÅËÆ∏ÂèÇÂä†ÊØî˵õÁöÑÁî®Êà∑ÁªÑ,Âπ∂ÂÆåÂñÑÂÜÖÈÉ®ÈĪËæë,Âü∫Êú¨ÂèØÁ∫Ü,Âè™ÊòØÊ≤°ÂÜôajaxÊèê‰∫§Êï∞ÊçÆ,ÂíåÂïÊãâÂÂèñÂ∞èÁªÑ‰ø°ÊÅØÁöÑÈÉ®ÂàÜ[CI SKIP] [ÂâçÁ´Ø]‰øÆÊîπ‰∫ÜÊ∑ªÂä†ÊØî˵õÈ°µÁöÑÂΩ¢ÂºèÁªìÊûÑ,‰ªçÊúâbug[CI SKIP] Ê∑[ÂâçÁ´Ø]Ê∑ªÂä†ÊØîËÂêéÂè∞ÊØî˵õÂàóË°®[CI SKIP] [ÂâçÁ´Ø]Áªü‰∏ÄÈóÆÈ¢òÈá,ÊØî˵õÂàóË°®jsÁöÑÊñቪ∂Âêç_list.js. Ê∑ªÂ䆉∫ÜÊØî˵õÂàóË°®ÂíåÁºñËæëÊØî˵õÁöÑÈ°µÈù¢(§߉Ωì§ʆ∑ºè)[CI SKIP] Conflicts: contest/views.py
139 lines
5.3 KiB
Python
139 lines
5.3 KiB
Python
# coding=utf-8
|
|
import json
|
|
import redis
|
|
|
|
from django.shortcuts import render
|
|
|
|
from rest_framework.views import APIView
|
|
|
|
from judge.judger.result import result
|
|
from judge.judger_controller.tasks import judge
|
|
from judge.judger_controller.settings import redis_config
|
|
from account.decorators import login_required
|
|
from account.models import SUPER_ADMIN
|
|
from problem.models import Problem
|
|
from utils.shortcuts import serializer_invalid_response, error_response, success_response, error_page, paginate
|
|
from .models import Submission
|
|
from .serializers import CreateSubmissionSerializer, SubmissionSerializer
|
|
from django.core.paginator import Paginator
|
|
|
|
|
|
class SubmissionAPIView(APIView):
|
|
@login_required
|
|
def post(self, request):
|
|
"""
|
|
提交代码
|
|
---
|
|
request_serializer: CreateSubmissionSerializer
|
|
"""
|
|
serializer = CreateSubmissionSerializer(data=request.data)
|
|
if serializer.is_valid():
|
|
data = serializer.data
|
|
try:
|
|
problem = Problem.objects.get(id=data["problem_id"])
|
|
# 更新问题的总提交计数
|
|
problem.total_submit_number += 1
|
|
problem.save()
|
|
except Problem.DoesNotExist:
|
|
return error_response(u"题目不存在")
|
|
submission = Submission.objects.create(user_id=request.user.id, language=int(data["language"]),
|
|
code=data["code"], problem_id=problem.id)
|
|
|
|
try:
|
|
judge.delay(submission.id, problem.time_limit, problem.memory_limit, problem.test_case_id)
|
|
except Exception:
|
|
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")
|
|
|
|
return success_response({"submission_id": submission.id})
|
|
else:
|
|
return serializer_invalid_response(serializer)
|
|
|
|
@login_required
|
|
def get(self, request):
|
|
submission_id = request.GET.get("submission_id", None)
|
|
if not submission_id:
|
|
return error_response(u"参数错误")
|
|
try:
|
|
submission = Submission.objects.get(id=submission_id, user_id=request.user.id)
|
|
except Submission.DoesNotExist:
|
|
return error_response(u"提交不存在")
|
|
response_data = {"result": submission.result}
|
|
if submission.result == 0:
|
|
response_data["accepted_answer_time"] = submission.accepted_answer_time
|
|
return success_response(response_data)
|
|
|
|
|
|
@login_required
|
|
def problem_my_submissions_list_page(request, problem_id):
|
|
try:
|
|
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).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})
|
|
|
|
|
|
@login_required
|
|
def my_submission(request, submission_id):
|
|
try:
|
|
# 超级管理员可以查看所有的提交
|
|
if request.user.admin_type != SUPER_ADMIN:
|
|
submission = Submission.objects.get(id=submission_id, user_id=request.user.id)
|
|
else:
|
|
submission = Submission.objects.get(id=submission_id)
|
|
except Submission.DoesNotExist:
|
|
return error_page(request, u"提交不存在")
|
|
|
|
try:
|
|
problem = Problem.objects.get(id=submission.problem_id, visible=True)
|
|
except Problem.DoesNotExist:
|
|
return error_page(request, u"提交不存在")
|
|
if submission.info:
|
|
try:
|
|
info = json.loads(submission.info)
|
|
except Exception:
|
|
info = submission.info
|
|
else:
|
|
info = None
|
|
return render(request, "oj/problem/my_submission.html",
|
|
{"submission": submission, "problem": problem, "info": info})
|
|
|
|
|
|
class SubmissionAdminAPIView(APIView):
|
|
def get(self, request):
|
|
problem_id = request.GET.get("problem_id", None)
|
|
if not problem_id:
|
|
return error_response(u"参数错误")
|
|
submissions = Submission.objects.filter(problem_id=problem_id).order_by("-create_time")
|
|
return paginate(request, submissions, SubmissionSerializer)
|
|
|
|
|
|
@login_required
|
|
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")
|
|
paginator = Paginator(submissions, 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
|
|
try:
|
|
next_page = current_page.next_page_number()
|
|
except Exception:
|
|
pass
|
|
|
|
return render(request, "oj/submission/my_submissions_list.html",
|
|
{"submissions": current_page, "page": int(page),
|
|
"previous_page": previous_page, "next_page": next_page, "startId":int(page)*20-20})
|