mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2024-09-21 00:13:18 +00:00
修正contest_submission逻辑
This commit is contained in:
parent
14b850c652
commit
7d11a596e5
@ -1,19 +1,19 @@
|
|||||||
import json
|
|
||||||
import requests
|
|
||||||
import hashlib
|
import hashlib
|
||||||
|
import json
|
||||||
import logging
|
import logging
|
||||||
from urllib.parse import urljoin
|
from urllib.parse import urljoin
|
||||||
|
|
||||||
|
import requests
|
||||||
|
from django.core.cache import cache
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
from django.db.models import F
|
from django.db.models import F
|
||||||
from django_redis import get_redis_connection
|
from django_redis import get_redis_connection
|
||||||
from django.core.cache import cache
|
|
||||||
|
|
||||||
from judge.languages import languages
|
|
||||||
from account.models import User
|
from account.models import User
|
||||||
from conf.models import JudgeServer, JudgeServerToken
|
from conf.models import JudgeServer, JudgeServerToken
|
||||||
from problem.models import Problem, ProblemRuleType, ContestProblem
|
|
||||||
from contest.models import ContestRuleType, ACMContestRank, OIContestRank
|
from contest.models import ContestRuleType, ACMContestRank, OIContestRank
|
||||||
|
from judge.languages import languages
|
||||||
|
from problem.models import Problem, ProblemRuleType, ContestProblem
|
||||||
from submission.models import JudgeStatus, Submission
|
from submission.models import JudgeStatus, Submission
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@ -25,7 +25,7 @@ WAITING_QUEUE = "waiting_queue"
|
|||||||
def process_pending_task(redis_conn):
|
def process_pending_task(redis_conn):
|
||||||
if redis_conn.llen(WAITING_QUEUE):
|
if redis_conn.llen(WAITING_QUEUE):
|
||||||
# 防止循环引入
|
# 防止循环引入
|
||||||
from submission.tasks import judge_task
|
from judge.tasks import judge_task
|
||||||
data = json.loads(redis_conn.rpop(WAITING_QUEUE))
|
data = json.loads(redis_conn.rpop(WAITING_QUEUE))
|
||||||
judge_task.delay(**data)
|
judge_task.delay(**data)
|
||||||
|
|
||||||
|
@ -1,16 +1,17 @@
|
|||||||
from django_redis import get_redis_connection
|
from django_redis import get_redis_connection
|
||||||
|
|
||||||
from account.decorators import login_required, check_contest_permission
|
from account.decorators import login_required, check_contest_permission
|
||||||
|
from judge.tasks import judge_task
|
||||||
from problem.models import Problem, ProblemRuleType, ContestProblem
|
from problem.models import Problem, ProblemRuleType, ContestProblem
|
||||||
from submission.tasks import judge_task
|
from contest.models import Contest, ContestStatus
|
||||||
# from judge.dispatcher import JudgeDispatcher
|
from utils.api import APIView, validate_serializer
|
||||||
|
from utils.throttling import TokenBucket, BucketController
|
||||||
from ..models import Submission
|
from ..models import Submission
|
||||||
from ..serializers import CreateSubmissionSerializer, SubmissionModelSerializer
|
from ..serializers import CreateSubmissionSerializer, SubmissionModelSerializer
|
||||||
from ..serializers import SubmissionSafeSerializer, SubmissionListSerializer
|
from ..serializers import SubmissionSafeSerializer, SubmissionListSerializer
|
||||||
|
|
||||||
from utils.api import APIView, validate_serializer
|
|
||||||
from utils.throttling import TokenBucket, BucketController
|
# from judge.dispatcher import JudgeDispatcher
|
||||||
|
|
||||||
|
|
||||||
def _submit(response, user, problem_id, language, code, contest_id):
|
def _submit(response, user, problem_id, language, code, contest_id):
|
||||||
@ -50,6 +51,13 @@ class SubmissionAPI(APIView):
|
|||||||
@login_required
|
@login_required
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
data = request.data
|
data = request.data
|
||||||
|
if data.get("contest_id"):
|
||||||
|
try:
|
||||||
|
contest = Contest.objects.get(id=data["contest_id"])
|
||||||
|
except Contest.DoesNotExist:
|
||||||
|
return self.error("Contest doesn't exist.")
|
||||||
|
if contest.status != ContestStatus.CONTEST_UNDERWAY and request.user != contest.created_by:
|
||||||
|
return self.error("You have no permission to submit code.")
|
||||||
return _submit(self, request.user, data["problem_id"], data["language"], data["code"], data.get("contest_id"))
|
return _submit(self, request.user, data["problem_id"], data["language"], data["code"], data.get("contest_id"))
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@ -64,7 +72,16 @@ class SubmissionAPI(APIView):
|
|||||||
if not submission.check_user_permission(request.user):
|
if not submission.check_user_permission(request.user):
|
||||||
return self.error("No permission for this submission.")
|
return self.error("No permission for this submission.")
|
||||||
|
|
||||||
|
if submission.contest_id:
|
||||||
# check problem'rule is ACM or IO.
|
# check problem'rule is ACM or IO.
|
||||||
|
if ContestProblem.objects.filter(contest_id=submission.contest_id,
|
||||||
|
_id=submission.problem_id,
|
||||||
|
visible=True,
|
||||||
|
rule_type=ProblemRuleType.ACM
|
||||||
|
).exists():
|
||||||
|
return self.success(SubmissionSafeSerializer(submission).data)
|
||||||
|
return self.success(SubmissionModelSerializer(submission).data)
|
||||||
|
|
||||||
if Problem.objects.filter(_id=submission.problem_id,
|
if Problem.objects.filter(_id=submission.problem_id,
|
||||||
visible=True,
|
visible=True,
|
||||||
rule_type=ProblemRuleType.ACM
|
rule_type=ProblemRuleType.ACM
|
||||||
@ -75,23 +92,18 @@ class SubmissionAPI(APIView):
|
|||||||
|
|
||||||
class SubmissionListAPI(APIView):
|
class SubmissionListAPI(APIView):
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
|
if request.GET.get("contest_id"):
|
||||||
|
return self._get_contest_submission_list(request)
|
||||||
|
|
||||||
subs = Submission.objects.filter(contest_id__isnull=True)
|
subs = Submission.objects.filter(contest_id__isnull=True)
|
||||||
|
return self.process_submissions(request, subs)
|
||||||
|
|
||||||
problem_id = request.GET.get("problem_id")
|
|
||||||
if problem_id:
|
|
||||||
subs = subs.filter(problem_id=problem_id)
|
|
||||||
|
|
||||||
if request.GET.get("myself") and request.GET["myself"] == "1":
|
|
||||||
subs = subs.filter(user_id=request.user.id)
|
|
||||||
data = self.paginate_data(request, subs)
|
|
||||||
data["results"] = SubmissionListSerializer(data["results"], many=True, user=request.user).data
|
|
||||||
return self.success(data)
|
|
||||||
|
|
||||||
|
|
||||||
class ContestSubmissionListAPI(APIView):
|
|
||||||
@check_contest_permission
|
@check_contest_permission
|
||||||
def get(self, request):
|
def _get_contest_submission_list(self, request):
|
||||||
subs = Submission.objects.filter(contest_id=self.contest.id)
|
subs = Submission.objects.filter(contest_id=self.contest.id)
|
||||||
|
return self.process_submissions(request, subs)
|
||||||
|
|
||||||
|
def process_submissions(self, request, subs):
|
||||||
problem_id = request.GET.get("problem_id")
|
problem_id = request.GET.get("problem_id")
|
||||||
if problem_id:
|
if problem_id:
|
||||||
subs = subs.filter(problem_id=problem_id)
|
subs = subs.filter(problem_id=problem_id)
|
||||||
|
Loading…
Reference in New Issue
Block a user