修正contest_submission逻辑

This commit is contained in:
zemal 2017-08-15 20:02:36 +08:00
parent 14b850c652
commit 7d11a596e5
3 changed files with 37 additions and 25 deletions

View File

@ -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)

View File

@ -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.")
# 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, 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)