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)
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)
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})
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()
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()
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})
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()
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})
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()
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()
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)
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})