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