def remote_judge_create_submission(uuid: str, client_session_id: str, code: str, language: str, uid: int, hj2_problem_id: str, public: bool, message: str, contest_id: int = -1, contest_problem_id: int = -1): print(locals()) """ 评测端向远程OJ提交代码成功后,创建相应的提交记录 """ if uuid not in config.JUDGERS: return make_response(-1, message="未认证评测机") import datetime if contest_id != -1: contest: Contest = Contest.by_id(contest_id) submission: Submission = Submission( uid=uid, language=language, problem_id=contest.problems[contest_problem_id]["id"], submit_time=datetime.datetime.now(), public=False, code=code, status="waiting", contest_id=contest_id) else: submission: Submission = Submission( uid=uid, language=language, problem_id=hj2_problem_id, submit_time=datetime.datetime.now(), public=public, code=code, status="waiting", ) db.session.add(submission) db.session.commit() print("Submit done. ", submission.id) emit("server_response", { "ok": True, "data": { "submission_id": submission.id } }, room=client_session_id, namespace="/ws/remote_judge") return make_response(0, data={"submission_id": submission.id})
def remote_judge_get_problem_info(problem_id: str, contest_id: int = -1, contest_problem_id: int = -1): """ { "code":0, "data":{ "isContest":"是否在比赛中", "problemData":{ "title":"题目名", "content":"题目内容", "background":"题目背景", "inputFormat":"输入格式", "outputFormat":'输出格式', "examples":[{"input":"样例输入","output":"样例输出"}], "createTime":"创建时间", "uploaderProfile":{ "uid":"用户ID", "username":"******" }, "remoteProblemID":"远程题目ID", "remoteOJ":{ "id":"远程OJID", "display":"远程OJ显示名", "availableLanguages":[ {"id":"0","display":"C++"} ] }, "public":"是否公开", "hint":"提示", "recentDiscussions":[ { "id":123, "title":"qw" } ], "acceptedCount":"", "submissionCount":"" }, "userData":{ "lastCode":"上次提交的代码", "lastLanguage":"上次选择的语言", "status":"qwq", "id":"", "accounts":{ "id":{ "username":"******", "oj":"OJ", "accountID":"ID" } } } } } """ # in_contest = contest_id != -1 contest: Contest = Contest.by_id(contest_id) if contest: # pass if not contest.running() and not permission_manager.has_permission( session.get("uid"), "contest.manage"): return make_response(-1, message="你没有权限查看此题目") print(contest_problem_id, "contest_problem_id") problem: Problem = db.session.query(Problem).filter( Problem.id == contest.problems[contest_problem_id] ["id"]).one_or_none() else: problem: Problem = db.session.query(Problem).filter( Problem.id == problem_id).one_or_none() if not permission_manager.has_permission( session.get("uid"), "remote_judge.use") and problem.uploader_id != int( session.get("uid")): return make_response(-1, message="你没有权限查看该题目") if not problem: return make_response(-1, message="未知题目ID") if problem.problem_type != "remote_judge": return make_response(-1, message="此题目非远程评测题目") uploader: User = db.session.query( User.id, User.username).filter(User.id == problem.uploader_id).one() last_submission: Submission = db.session.query(Submission).filter( and_(Submission.problem_id == problem.id, Submission.uid == session.get("uid"))).order_by( Submission.score.desc()).order_by(Submission.id.desc()) last_code, last_language, submission_id, status = "", next( iter(config.REMOTE_JUDGE_OJS[problem.remote_judge_oj] ["availableLanguages"].keys())), -1, None if last_submission.count(): last_submission = last_submission.first() last_code = last_submission.code last_language = last_submission.language status = last_submission.status submission_id = last_submission.id discussions = [] discussions_query = db.session.query( Discussion.id, Discussion.title).filter( Discussion.path == f"discussion.problem.{problem.id}").order_by( Discussion.id.desc()).limit(5) for item in discussions_query: discussions.append({"id": item.id, "title": item.title}) accounts = {} for item in db.session.query( RemoteAccount.account_id, RemoteAccount.username, RemoteAccount.oj).filter( and_(RemoteAccount.uid == session.get("uid", -1), RemoteAccount.oj == problem.remote_judge_oj)): accounts[item.account_id] = { "username": item.username, "oj": config.REMOTE_JUDGE_OJS[item.oj]["display"], "accountID": item.account_id } return make_response( 0, data={ "isContest": contest is not None, "problemData": { "title": problem.title, "content": problem.content, "background": problem.background, "inputFormat": problem.input_format, "outputFormat": problem.output_format, "examples": problem.example, "createTime": problem.create_time, "uploaderProfile": { "uid": uploader.id, "username": uploader.username } if not contest else None, "remoteProblemID": problem.remote_problem_id if not contest else None, "remoteOJ": { "id": problem.remote_judge_oj, **config.REMOTE_JUDGE_OJS[problem.remote_judge_oj] }, "public": problem.public if not contest else None, "hint": problem.hint, "recentDiscussions": discussions if not contest else None, "acceptedCount": db.session.query(Submission).filter( Submission.problem_id == problem.id).filter( Submission.status == "accepted").count() if not contest else None, "submissionCount": db.session.query(Submission).filter( Submission.problem_id == problem.id).count() if not contest else None, "id": problem.id }, "userData": { "lastCode": last_code, "lastLanguage": last_language, "status": status, "id": submission_id, "managable": permission_manager.has_permission(session.get("uid", None), "problem.manage"), "accounts": accounts } })