diff --git a/judge/dispatcher.py b/judge/dispatcher.py index 7ad1dc45..489825fd 100644 --- a/judge/dispatcher.py +++ b/judge/dispatcher.py @@ -1,19 +1,19 @@ -import json -import requests import hashlib +import json import logging from urllib.parse import urljoin +import requests +from django.core.cache import cache from django.db import transaction from django.db.models import F from django_redis import get_redis_connection -from django.core.cache import cache -from judge.languages import languages from account.models import User from conf.models import JudgeServer, JudgeServerToken -from problem.models import Problem, ProblemRuleType, ContestProblem 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 logger = logging.getLogger(__name__) @@ -25,7 +25,7 @@ WAITING_QUEUE = "waiting_queue" def process_pending_task(redis_conn): 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)) judge_task.delay(**data) diff --git a/submission/tasks.py b/judge/tasks.py similarity index 100% rename from submission/tasks.py rename to judge/tasks.py diff --git a/submission/views/oj.py b/submission/views/oj.py index 0fe8819d..83583909 100644 --- a/submission/views/oj.py +++ b/submission/views/oj.py @@ -1,16 +1,17 @@ from django_redis import get_redis_connection from account.decorators import login_required, check_contest_permission +from judge.tasks import judge_task from problem.models import Problem, ProblemRuleType, ContestProblem -from submission.tasks import judge_task -# from judge.dispatcher import JudgeDispatcher - +from contest.models import Contest, ContestStatus +from utils.api import APIView, validate_serializer +from utils.throttling import TokenBucket, BucketController from ..models import Submission from ..serializers import CreateSubmissionSerializer, SubmissionModelSerializer 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): @@ -50,6 +51,13 @@ class SubmissionAPI(APIView): @login_required def post(self, request): 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")) @login_required @@ -64,7 +72,16 @@ class SubmissionAPI(APIView): if not submission.check_user_permission(request.user): return self.error("No permission for this submission.") - # check problem'rule is ACM or IO. + if submission.contest_id: + # 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, visible=True, rule_type=ProblemRuleType.ACM @@ -75,23 +92,18 @@ class SubmissionAPI(APIView): class SubmissionListAPI(APIView): 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) + 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 - def get(self, request): + def _get_contest_submission_list(self, request): 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") if problem_id: subs = subs.filter(problem_id=problem_id)