Esempio n. 1
0
def process_pending_task():
    print ("begin")
    if cache.llen(CacheKey.waiting_queue):
        # 防止循环引入
        from judge.tasks import judge_task
        data = json.loads(cache.rpop(CacheKey.waiting_queue).decode("utf-8"))
        judge_task.delay(**data)
Esempio n. 2
0
def process_pending_task():
    # 如果llen:"Return the length of the list ``name``"返回的waiting_queue名字长度不空,
    # 队列中还有任务,导入评判任务judge_task,加载在队列里面等待的任务到异步队列
    if cache.llen(CacheKey.waiting_queue):
        # 防止循环引入
        from judge.tasks import judge_task
        data = json.loads(cache.rpop(CacheKey.waiting_queue).decode("utf-8"))
        judge_task.delay(**data)
Esempio n. 3
0
    def post(self, request):
        data = request.data
        hide_id = False
        if data.get("contest_id"):
            try:
                contest = Contest.objects.get(id=data["contest_id"],
                                              visible=True)
            except Contest.DoesNotExist:
                return self.error("Contest doesn't exist.")
            if contest.status == ContestStatus.CONTEST_ENDED:
                return self.error("The contest have ended")
            if not request.user.is_contest_admin(contest):
                if contest.status == ContestStatus.CONTEST_NOT_START:
                    return self.error("Contest have not started")
                user_ip = ipaddress.ip_address(request.session.get("ip"))
                if contest.allowed_ip_ranges:
                    if not any(
                            user_ip in ipaddress.ip_network(cidr, strict=False)
                            for cidr in contest.allowed_ip_ranges):
                        return self.error(
                            "Your IP is not allowed in this contest")

            if not contest.problem_details_permission(request.user):
                hide_id = True

        if data.get("captcha"):
            if not Captcha(request).check(data["captcha"]):
                return self.error("Invalid captcha")
        error = self.throttling(request)
        if error:
            return self.error(error)

        try:
            problem = Problem.objects.get(id=data["problem_id"],
                                          contest_id=data.get("contest_id"),
                                          visible=True)
        except Problem.DoesNotExist:
            return self.error("Problem not exist")
        if data["language"] not in problem.languages:
            return self.error(
                f"{data['language']} is now allowed in the problem")
        submission = Submission.objects.create(
            user_id=request.user.id,
            username=request.user.username,
            language=data["language"],
            code=data["code"],
            problem_id=problem.id,
            ip=request.session["ip"],
            contest_id=data.get("contest_id"))
        # use this for debug
        # JudgeDispatcher(submission.id, problem.id).judge()
        judge_task.delay(submission.id, problem.id)
        if hide_id:
            return self.success()
        else:
            return self.success({"submission_id": submission.id})
Esempio n. 4
0
    def get(self, request):
        id = request.GET.get("id")
        if not id:
            return self.error("Parameter error, id is required")
        try:
            submission = Submission.objects.select_related("problem").get(id=id, contest_id__isnull=True)
        except Submission.DoesNotExist:
            return self.error("Submission does not exists")
        submission.statistic_info = {}
        submission.save()

        judge_task.delay(submission.id, submission.problem.id)
        return self.success()
Esempio n. 5
0
    def get(self, request):
        id = request.GET.get("id")
        # 获取重新评测的提交信息ID
        if not id:
            return self.error("Parameter error, id is required")
        try:
            submission = Submission.objects.select_related("problem").get(id=id, contest_id__isnull=True)
        except Submission.DoesNotExist:
            return self.error("Submission does not exists")
        submission.statistic_info = {}
        submission.save()

        judge_task.delay(submission.id, submission.problem.id)
        return self.success()
Esempio n. 6
0
    def post(self, request):
        # 创建提交信息,
        data = request.data
        #
        hide_id = False
        if data.get("contest_id"):
            error = self.check_contest_permission(request)
            if error:
                return error
            contest = self.contest
            if not contest.problem_details_permission(request.user):

                hide_id = True
        # 检查验证码
        if data.get("captcha"):
            if not Captcha(request).check(data["captcha"]):
                return self.error("Invalid captcha")
        error = self.throttling(request)
        if error:
            return self.error(error)

        try:
            # 检查对应的提交信息中的题目是否存在
            problem = Problem.objects.get(id=data["problem_id"],
                                          contest_id=data.get("contest_id"),
                                          visible=True)
        except Problem.DoesNotExist:
            return self.error("Problem not exist")
        # 检查语言是否在允许的范围内
        if data["language"] not in problem.languages:
            return self.error(
                f"{data['language']} is now allowed in the problem")
        # 将提交信息写入数据库
        submission = Submission.objects.create(
            user_id=request.user.id,
            username=request.user.username,
            language=data["language"],
            code=data["code"],
            problem_id=problem.id,
            ip=request.session["ip"],
            contest_id=data.get("contest_id"))
        # use this for debug
        # JudgeDispatcher(submission.id, problem.id).judge()
        # 提交到判题异步队列里面去
        judge_task.delay(submission.id, problem.id)
        if hide_id:
            return self.success()
        else:
            return self.success({"submission_id": submission.id})
Esempio n. 7
0
    def get(self, request):
        id = request.GET.get("id")
        if not id:
            return self.error("Параметрическая ошибка, введите id")
        try:
            submission = Submission.objects.select_related("problem").get(
                id=id, contest_id__isnull=True)
        except Submission.DoesNotExist:
            return self.error("Submission does not exists")
        submission.info = {}
        submission.statistic_info = {}
        submission.save()

        judge_task.delay(submission.id, submission.problem.id)
        return self.success()
Esempio n. 8
0
    def post(self, request):
        data = request.data
        hide_id = False
        if data.get("contest_id"):
            try:
                contest = Contest.objects.get(id=data["contest_id"], visible=True)
            except Contest.DoesNotExist:
                return self.error("Contest doesn't exist.")
            if contest.status == ContestStatus.CONTEST_ENDED:
                return self.error("The contest have ended")
            if not request.user.is_contest_admin(contest):
                if contest.status == ContestStatus.CONTEST_NOT_START:
                    return self.error("Contest have not started")
                user_ip = ipaddress.ip_address(request.session.get("ip"))
                if contest.allowed_ip_ranges:
                    if not any(user_ip in ipaddress.ip_network(cidr, strict=False) for cidr in contest.allowed_ip_ranges):
                        return self.error("Your IP is not allowed in this contest")

            if not contest.problem_details_permission(request.user):
                hide_id = True

        if data.get("captcha"):
            if not Captcha(request).check(data["captcha"]):
                return self.error("Invalid captcha")
        error = self.throttling(request)
        if error:
            return self.error(error)

        try:
            problem = Problem.objects.get(id=data["problem_id"], contest_id=data.get("contest_id"), visible=True)
        except Problem.DoesNotExist:
            return self.error("Problem not exist")
        if data["language"] not in problem.languages:
            return self.error(f"{data['language']} is now allowed in the problem")
        submission = Submission.objects.create(user_id=request.user.id,
                                               username=request.user.username,
                                               language=data["language"],
                                               code=data["code"],
                                               problem_id=problem.id,
                                               ip=request.session["ip"],
                                               contest_id=data.get("contest_id"))
        # use this for debug
        # JudgeDispatcher(submission.id, problem.id).judge()
        judge_task.delay(submission.id, problem.id)
        if hide_id:
            return self.success()
        else:
            return self.success({"submission_id": submission.id})
Esempio n. 9
0
 def get(self, request):
     problem_id = request.GET.get("problem_id")
     if not problem_id:
         return self.error("Parameter error, problem id is required")
     try:
         problem = Problem.objects.get(id=problem_id,
                                       contest_id__isnull=True)
     except Problem.DoesNotExist:
         return self.error("Problem does not exists")
     try:
         submissions = Submission.objects.filter(problem_id=problem_id,
                                                 contest_id__isnull=True)
     except Submission.DoesNotExist:
         return self.error("Submission does not exists")
     for submission in submissions:
         submission.statistic_info = {}
         submission.save()
         judge_task.delay(submission.id, submission.problem.id)
     return self.success()
Esempio n. 10
0
 def get(self, request):
     # -- todo -- ?????? I don't know why two field is swapped?
     problem_id = request.GET.get("contest_id")
     contest_id = request.GET.get("problem_id")
     if (not problem_id) or (not contest_id):
         return self.error("Parameter error, id is required")
     try:
         problem = Problem.objects.select_related("contest").get(
             _id=problem_id, contest_id=contest_id)
     except Problem.DoesNotExist:
         return self.error(
             "Problem does not exists Contest: %s, Problem: %s" %
             (contest_id, problem_id))
     try:
         submissions = Submission.objects.filter(
             problem_id=problem.id, contest_id=problem.contest_id)
     except Submission.DoesNotExist:
         return self.error("Submission does not exists")
     for submission in submissions:
         submission.statistic_info = {}
         submission.save()
         judge_task.delay(submission.id, submission.problem.id)
     return self.success()
Esempio n. 11
0
def process_pending_task():
    if cache.llen(CacheKey.waiting_queue):
        # 防止循环引入
        from judge.tasks import judge_task
        data = json.loads(cache.rpop(CacheKey.waiting_queue).decode("utf-8"))
        judge_task.delay(**data)
Esempio n. 12
0
    def post(self, request):
        data = request.data
        hide_id = False
        if data.get("contest_id"):
            try:
                contest = Contest.objects.get(id=data["contest_id"],
                                              visible=True)
            except Contest.DoesNotExist:
                return self.error("Contest doesn't exist.")
            if contest.status == ContestStatus.CONTEST_ENDED:
                return self.error("The contest have ended")
            if not request.user.is_contest_admin(contest):
                if contest.status == ContestStatus.CONTEST_NOT_START:
                    return self.error("Contest have not started")
                user_ip = ipaddress.ip_address(request.session.get("ip"))
                if contest.allowed_ip_ranges:
                    if not any(
                            user_ip in ipaddress.ip_network(cidr, strict=False)
                            for cidr in contest.allowed_ip_ranges):
                        return self.error(
                            "Your IP is not allowed in this contest")

            if not contest.problem_details_permission(request.user):
                hide_id = True

        if data.get("captcha"):
            if not Captcha(request).check(data["captcha"]):
                return self.error("Invalid captcha")
        error = self.throttling(request)
        if error:
            return self.error(error)

        try:
            problem = Problem.objects.get(id=data["problem_id"],
                                          contest_id=data.get("contest_id"),
                                          visible=True)
        except Problem.DoesNotExist:
            return self.error("Problem not exist")

        # new code for O/X test 18.9.20
        ox_result_jsonb = None
        if str(data["language"]) == "PlainText":
            template_str = problem.template["PlainText"]
            labels = hidden_template_parser(str(template_str))
            preds = pred_parser(str(data["code"]))
            evals = get_evals_json(preds, labels)
            ox_result_jsonb = evals
        """
        # 같은 시험을 본적이 있는지 체크한다.

        values = {  
                    'user_id': request.user.id,
                    'username': request.user.username,
                    'language': data["language"],
                    'code': data["code"],
                    'problem_id': problem.id,
                    'ip': request.session["ip"],
                    'contest_id': data.get("contest_id"),
                    'ox_result_jsonb': ox_result_jsonb
                }
        submission, created = Submission.objects.update_or_create(user_id=request.user.id, problem_id=problem.id, defaults=values)
        """

        submission = Submission.objects.create(
            user_id=request.user.id,
            username=request.user.username,
            language=data["language"],
            code=data["code"],
            problem_id=problem.id,
            ip=request.session["ip"],
            contest_id=data.get("contest_id"),
            ox_result_jsonb=ox_result_jsonb)
        # use this for debug
        # JudgeDispatcher(submission.id, problem.id).judge()
        judge_task.delay(submission.id, problem.id)
        if hide_id:
            return self.success()
        else:
            return self.success({"submission_id": submission.id})