修正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 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)

View File

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