def put(self, request): """ 同意或者拒绝加入小组请求 --- request_serializer: PutJoinGroupRequestSerializer """ serializer = PutJoinGroupRequestSerializer(data=request.data) if serializer.is_valid(): data = serializer.data try: join_request = JoinGroupRequest.objects.get(id=data["request_id"], group__admin=request.user, status=False) except JoinGroupRequest.DoesNotExist: return error_response(u"请求不存在") join_request.status = True join_request.save() if data["status"]: if join_group(join_request.user, join_request.group): join_request.accepted = True join_request.save() return success_response(u"加入成功") else: return error_response(u"加入失败,已经在本小组内") else: return success_response(u"已拒绝") else: return serializer_invalid_response(serializer)
def put(self, request): """ 修改判题服务器信息 json api接口 --- request_serializer: EditJudgesSerializer response_serializer: JudgesSerializer """ serializer = EditJudgesSerializer(data=request.data) if serializer.is_valid(): data = serializer.data try: judge_server = JudgeServer.objects.get(pk=data["id"]) except JudgeServer.DoesNotExist: return error_response(u"此判题服务器不存在!") judge_server.name = data["name"] judge_server.ip = data["ip"] judge_server.port = data["port"] judge_server.max_instance_number = data["max_instance_number"] # 强制reset为0, 因为celery可能部分情况下进程挂掉, 导致这个值增加后无法减少, 在编辑的时候重置为0算是一种临时解决方案。 judge_server.used_instance_number = 0 judge_server.token = data["token"] judge_server.status = data["status"] judge_server.save() return success_response(JudgesSerializer(judge_server).data) else: return serializer_invalid_response(serializer)
def post(self, request): """ 创建比赛的提交 --- request_serializer: CreateContestSubmissionSerializer """ serializer = CreateContestSubmissionSerializer(data=request.data) if serializer.is_valid(): data = serializer.data contest = Contest.objects.get(id=data["contest_id"]) try: problem = ContestProblem.objects.get(contest=contest, id=data["problem_id"]) # 更新题目提交计数器 problem.total_submit_number += 1 problem.save() except ContestProblem.DoesNotExist: return error_response(u"题目不存在") submission = Submission.objects.create(user_id=request.user.id, language=int(data["language"]), contest_id=contest.id, code=data["code"], problem_id=problem.id) try: judge.delay(submission.id, problem.time_limit, problem.memory_limit, problem.test_case_id) except Exception: return error_response(u"提交判题任务失败") # 增加redis 中判题队列长度的计数器 r = redis.Redis(host=redis_config["host"], port=redis_config["port"], db=redis_config["db"]) r.incr("judge_queue_length") return success_response({"submission_id": submission.id}) else: return serializer_invalid_response(serializer)
def post(self, request): """ 用户登录json api接口 --- request_serializer: UserLoginSerializer """ serializer = UserLoginSerializer(data=request.data) if serializer.is_valid(): data = serializer.data user = auth.authenticate(username=data["username"], password=data["password"]) # 用户名或密码错误的话 返回None if user: if not user.two_factor_auth: auth.login(request, user) return success_response(u"登录成功") # 没有输入两步验证的验证码 if user.two_factor_auth and "tfa_code" not in data: return success_response("tfa_required") if OtpAuth(user.tfa_token).valid_totp(data["tfa_code"]): auth.login(request, user) return success_response(u"登录成功") else: return error_response(u"验证码错误") else: return error_response(u"用户名或密码错误") else: return serializer_invalid_response(serializer)
def post(self, request): """ 用户登录json api接口 --- request_serializer: UserLoginSerializer """ serializer = UserLoginSerializer(data=request.data) if serializer.is_valid(): data = serializer.data if "captcha" not in data: return error_response(u"请填写验证码!") captcha = Captcha(request) if not captcha.check(data["captcha"]): return error_response(u"验证码错误") user = auth.authenticate(username=data["username"], password=data["password"]) # 用户名或密码错误的话 返回None if user: auth.login(request, user) return success_response(u"登录成功") else: return error_response(u"用户名或密码错误") else: return serializer_invalid_response(serializer)
def post(self, request): """ 提交请求重置密码 --- request_serializer: ApplyResetPasswordSerializer """ serializer = ApplyResetPasswordSerializer(data=request.data) if serializer.is_valid(): data = serializer.data captcha = Captcha(request) if not captcha.check(data["captcha"]): return error_response(u"验证码错误") try: user = User.objects.get(email=data["email"]) except User.DoesNotExist: return error_response(u"用户不存在") if user.reset_password_token_create_time and (now() - user.reset_password_token_create_time).total_seconds() < 20 * 60: return error_response(u"20分钟内只能找回一次密码") user.reset_password_token = rand_str() user.reset_password_token_create_time = now() user.save() email_template = codecs.open(settings.TEMPLATES[0]["DIRS"][0] + "utils/reset_password_email.html", "r", "utf-8").read() email_template = email_template.replace("{{ username }}", user.username).\ replace("{{ website_name }}", settings.WEBSITE_INFO["website_name"]).\ replace("{{ link }}", request.scheme + "://" + request.META['HTTP_HOST'] + "/reset_password/t/" + user.reset_password_token) send_email(settings.WEBSITE_INFO["website_name"], user.email, user.username, settings.WEBSITE_INFO["website_name"] + u" 登录信息找回邮件", email_template) return success_response(u"邮件发送成功,请前往您的邮箱查收") else: return serializer_invalid_response(serializer)
def post(self, request): serializer = SubmissionRejudgeSerializer(data=request.data) if serializer.is_valid(): submission_id = serializer.data["submission_id"] try: submission = Submission.objects.get(id=submission_id) except Submission.DoesNotExist: return error_response(u"提交不存在") # 目前只考虑前台公开题目的重新判题 try: problem = Problem.objects.get(id=submission.problem_id) except Problem.DoesNotExist: return error_response(u"题目不存在") try: judge.delay(submission_id, problem.time_limit, problem.memory_limit, problem.test_case_id) except Exception as e: logger.error(e) return error_response(u"提交判题任务失败") # 增加redis 中判题队列长度的计数器 r = redis.Redis(host=redis_config["host"], port=redis_config["port"], db=redis_config["db"]) r.incr("judge_queue_length") return success_response(u"任务提交成功") else: return serializer_invalid_response(serializer)
def post(self, request): """ 提交请求重置密码 --- request_serializer: ApplyResetPasswordSerializer """ serializer = ApplyResetPasswordSerializer(data=request.data) if serializer.is_valid(): data = serializer.data captcha = Captcha(request) if not captcha.check(data["captcha"]): return error_response(u"验证码错误") try: user = User.objects.get(username=data["username"], email=data["email"]) except User.DoesNotExist: return error_response(u"用户不存在") user.reset_password_token = rand_str() user.save() email_template = codecs.open(settings.TEMPLATES[0]["DIRS"][0] + "utils/reset_password_email.html", "r", "utf-8").read() email_template = email_template.replace("{{ username }}", user.username).replace("{{ link }}", request.scheme + "://" + request.META['HTTP_HOST'] + "/reset_password/?token=" + user.reset_password_token) send_email(user.email, user.username, u"qduoj 密码找回邮件", email_template) return success_response(u"邮件发生成功") else: return serializer_invalid_response(serializer)
def put(self, request): """ 修改小组信息的api --- request_serializer: EditGroupSerializer response_serializer: GroupSerializer """ serializer = EditGroupSerializer(data=request.data) if serializer.is_valid(): data = serializer.data try: group = self.get_group(request, data["group_id"]) except Group.DoesNotExist: return error_response(u"小组不存在") try: group.name = data["name"] group.description = data["description"] group.join_group_setting = data["join_group_setting"] group.visible = data["visible"] group.save() except IntegrityError: return error_response(u"小组名已经存在") return success_response(GroupSerializer(group).data) else: return serializer_invalid_response(serializer)
def post(self, request): """ 创建比赛的提交 --- request_serializer: CreateContestSubmissionSerializer """ serializer = CreateContestSubmissionSerializer(data=request.data) if serializer.is_valid(): data = serializer.data contest = Contest.objects.get(id=data["contest_id"]) try: problem = ContestProblem.objects.get(contest=contest, id=data["problem_id"]) except ContestProblem.DoesNotExist: return error_response(u"题目不存在") submission = Submission.objects.create(user_id=request.user.id, language=int(data["language"]), contest_id=contest.id, code=data["code"], problem_id=problem.id) try: _judge.delay(submission.id, problem.time_limit, problem.memory_limit, problem.test_case_id, problem.spj, problem.spj_language, problem.spj_code, problem.spj_version) except Exception as e: logger.error(e) return error_response(u"提交判题任务失败") return success_response({"submission_id": submission.id}) else: return serializer_invalid_response(serializer)
def post(self, request): """ 比赛题目发布json api接口 --- request_serializer: CreateContestProblemSerializer response_serializer: ContestProblemSerializer """ serializer = CreateContestProblemSerializer(data=request.data) if serializer.is_valid(): data = serializer.data try: contest = Contest.objects.get(id=data["contest_id"]) if request.user.admin_type != SUPER_ADMIN: contest_set = Contest.objects.filter(groups__in=request.user.managed_groups.all()) if contest not in contest_set: return error_response(u"比赛不存在") except Contest.DoesNotExist: return error_response(u"比赛不存在") contest_problem = ContestProblem.objects.create(title=data["title"], description=data["description"], input_description=data["input_description"], output_description=data["output_description"], test_case_id=data["test_case_id"], samples=json.dumps(data["samples"]), time_limit=data["time_limit"], memory_limit=data["memory_limit"], created_by=request.user, hint=data["hint"], contest=contest, sort_index=data["sort_index"]) return success_response(ContestProblemSerializer(contest_problem).data) else: return serializer_invalid_response(serializer)
def post(self, request): """ 题目发布json api接口 --- request_serializer: CreateProblemSerializer response_serializer: ProblemSerializer """ serializer = CreateProblemSerializer(data=request.data) if serializer.is_valid(): data = serializer.data problem = Problem.objects.create(title=data["title"], description=data["description"], input_description=data["input_description"], output_description=data["output_description"], test_case_id=data["test_case_id"], source=data["source"], samples=json.dumps(data["samples"]), time_limit=data["time_limit"], memory_limit=data["memory_limit"], difficulty=data["difficulty"], created_by=request.user, hint=data["hint"], visible=data["visible"]) for tag in data["tags"]: try: tag = ProblemTag.objects.get(name=tag) except ProblemTag.DoesNotExist: tag = ProblemTag.objects.create(name=tag) problem.tags.add(tag) return success_response(ProblemSerializer(problem).data) else: return serializer_invalid_response(serializer)
def put(self, request): """ 用户编辑json api接口 --- request_serializer: EditUserSerializer response_serializer: UserSerializer """ serializer = EditUserSerializer(data=request.data) if serializer.is_valid(): data = serializer.data try: user = User.objects.get(id=data["id"]) except User.DoesNotExist: return error_response(u"该用户不存在!") try: user = User.objects.get(username=data["username"]) if user.id != data["id"]: return error_response(u"昵称已经存在") except User.DoesNotExist: pass user.username = data["username"] user.real_name = data["real_name"] user.email = data["email"] user.admin_type = data["admin_type"] if data["password"]: user.set_password(data["password"]) user.save() return success_response(UserSerializer(user).data) else: return serializer_invalid_response(serializer)
def post(self, request): """ 加入某个小组的api --- request_serializer: CreateJoinGroupRequestSerializer """ serializer = CreateJoinGroupRequestSerializer(data=request.data) if serializer.is_valid(): data = serializer.data try: group = Group.objects.get(id=data["group_id"]) except Group.DoesNotExist: return error_response(u"小组不存在") if group.join_group_setting == 0: if join_group(request.user, group): return success_response(u"你已经成功的加入该小组") else: return error_response(u"你已经是小组成员了") elif group.join_group_setting == 1: if not data["message"]: return error_response(u"message : 该字段是必填项。") try: JoinGroupRequest.objects.get(user=request.user, group=group, status=False) return error_response(u"你已经提交过申请了,请等待审核") except JoinGroupRequest.DoesNotExist: JoinGroupRequest.objects.create(user=request.user, group=group, message=data["message"]) return success_response(u"申请提交成功,请等待审核") elif group.join_group_setting == 2: return error_response(u"该小组不允许任何人加入") else: return serializer_invalid_response(serializer)
def put(self, request): """ 比赛题目编辑json api接口 --- request_serializer: EditContestProblemSerializer response_serializer: ContestProblemSerializer """ serializer = EditContestProblemSerializer(data=request.data) if serializer.is_valid(): data = serializer.data try: contest_problem = ContestProblem.objects.get(id=data["id"]) except ContestProblem.DoesNotExist: return error_response(u"该比赛题目不存在!") contest = Contest.objects.get(id=contest_problem.contest_id) if request.user.admin_type != SUPER_ADMIN and contest.created_by != request.user: return error_response(u"比赛不存在") contest_problem.title = data["title"] contest_problem.description = data["description"] contest_problem.input_description = data["input_description"] contest_problem.output_description = data["output_description"] contest_problem.test_case_id = data["test_case_id"] contest_problem.time_limit = data["time_limit"] contest_problem.memory_limit = data["memory_limit"] contest_problem.samples = json.dumps(data["samples"]) contest_problem.hint = data["hint"] contest_problem.visible = data["visible"] contest_problem.sort_index = data["sort_index"] contest_problem.last_update_time = now() contest_problem.save() return success_response(ContestProblemSerializer(contest_problem).data) else: return serializer_invalid_response(serializer)
def post(self, request): """ 提交代码 --- request_serializer: CreateSubmissionSerializer """ serializer = CreateSubmissionSerializer(data=request.data) if serializer.is_valid(): data = serializer.data try: problem = Problem.objects.get(id=data["problem_id"]) except Problem.DoesNotExist: return error_response(u"题目不存在") submission = Submission.objects.create(user_id=request.user.id, language=int(data["language"]), code=data["code"], problem_id=problem.id) try: judge.delay(submission.id, problem.time_limit, problem.memory_limit, problem.test_case_id) except Exception as e: logger.error(e) return error_response(u"提交判题任务失败") r = redis.Redis(host=redis_config["host"], port=redis_config["port"], db=redis_config["db"]) r.incr("judge_queue_length") return success_response({"submission_id": submission.id}) else: return serializer_invalid_response(serializer)
def post(self, request): """ 公告发布json api接口 --- request_serializer: CreateAnnouncementSerializer """ serializer = CreateAnnouncementSerializer(data=request.data) if serializer.is_valid(): data = serializer.data groups = [] # 如果不是全局公告,就去查询一下小组的id 列表中的内容,注意用户身份 if not data["is_global"]: if request.user.admin_type == SUPER_ADMIN: groups = Group.objects.filter(id__in=data["groups"]) else: groups = Group.objects.filter(id__in=data["groups"], admin=request.user) if not groups.count(): return error_response(u"至少选择一个小组") else: if request.user.admin_type != SUPER_ADMIN: return error_response(u"只有超级管理员可以创建全局公告") announcement = Announcement.objects.create(title=data["title"], content=data["content"], created_by=request.user, is_global=data["is_global"]) announcement.groups.add(*groups) return success_response(u"公告发布成功!") else: return serializer_invalid_response(serializer)
def post(self, request): """ 用户注册json api接口 --- request_serializer: UserRegisterSerializer """ serializer = UserRegisterSerializer(data=request.data) if serializer.is_valid(): data = serializer.data captcha = Captcha(request) if not captcha.check(data["captcha"]): return error_response(u"验证码错误") try: User.objects.get(username=data["username"]) return error_response(u"用户名已存在") except User.DoesNotExist: pass try: User.objects.get(email=data["email"]) return error_response(u"该邮箱已被注册,请换其他邮箱进行注册") except User.DoesNotExist: user = User.objects.create(username=data["username"], real_name=data["real_name"], email=data["email"]) user.set_password(data["password"]) user.save() return success_response(u"注册成功!") else: return serializer_invalid_response(serializer)
def put(self, request): """ 比赛编辑json api接口 --- request_serializer: EditContestSerializer response_serializer: ContestSerializer """ serializer = EditContestSerializer(data=request.data) if serializer.is_valid(): data = serializer.data groups = [] try: # 超级管理员可以编辑所有的 contest = Contest.objects.get(id=data["id"]) if request.user.admin_type != SUPER_ADMIN: contest = contest.get(created_by=request.user) except Contest.DoesNotExist: return error_response(u"该比赛不存在!") try: contest = Contest.objects.get(title=data["title"]) if contest.id != data["id"]: return error_response(u"该比赛名称已经存在") except Contest.DoesNotExist: pass if data["contest_type"] in [PUBLIC_CONTEST, PASSWORD_PROTECTED_CONTEST]: if request.user.admin_type != SUPER_ADMIN: return error_response(u"只有超级管理员才可创建公开赛") if data["contest_type"] == PASSWORD_PROTECTED_CONTEST: if not data["password"]: return error_response(u"此比赛为有密码的公开赛,密码不可为空") elif data["contest_type"] == GROUP_CONTEST: if request.user.admin_type == SUPER_ADMIN: groups = Group.objects.filter(id__in=data["groups"]) else: groups = Group.objects.filter(id__in=data["groups"], admin=request.user) if not groups.count(): return error_response(u"请至少选择一个小组") if data["start_time"] >= data["end_time"]: return error_response(u"比赛的开始时间必须早于比赛结束的时间") contest.title = data["title"] contest.description = data["description"] contest.mode = data["mode"] contest.contest_type = data["contest_type"] contest.real_time_rank = data["real_time_rank"] contest.show_user_submission = data["show_user_submission"] contest.start_time = dateparse.parse_datetime(data["start_time"]) contest.end_time = dateparse.parse_datetime(data["end_time"]) contest.visible = data["visible"] contest.password = data["password"] contest.save() contest.groups.clear() contest.groups.add(*groups) return success_response(ContestSerializer(contest).data) else: return serializer_invalid_response(serializer)
def post(self, request): serializer = SSOSerializer(data=request.data) if serializer.is_valid(): try: user = User.objects.get(auth_token=serializer.data["token"]) return success_response({"username": user.username}) except User.DoesNotExist: return error_response(u"用户不存在") else: return serializer_invalid_response(serializer)
def put(self, request): serializer = TwoFactorAuthCodeSerializer(data=request.data) if serializer.is_valid(): user = request.user code = serializer.data["code"] if OtpAuth(user.tfa_token).valid_totp(code): user.two_factor_auth = False user.save() else: return error_response(u"验证码错误") else: return serializer_invalid_response(serializer)
def post(self, request): """ 提交代码 --- request_serializer: CreateSubmissionSerializer """ serializer = CreateSubmissionSerializer(data=request.data) if serializer.is_valid(): data = serializer.data return _submit_code(request.user, data["problem_id"], data["language"], data["code"]) else: return serializer_invalid_response(serializer)
def post(self, request): """ 公告发布json api接口 --- request_serializer: CreateAnnouncementSerializer """ serializer = CreateAnnouncementSerializer(data=request.data) if serializer.is_valid(): data = serializer.data Announcement.objects.create(title=data["title"], content=data["content"], created_by=request.user) return success_response(u"公告发布成功!") else: return serializer_invalid_response(serializer)
def post(self, request): serializer = SSOSerializer(data=request.data) if serializer.is_valid(): try: user = User.objects.get(auth_token=serializer.data["token"]) user.auth_token = None user.save() return success_response( {"username": user.username, "admin_type": user.admin_type, "avatar": user.userprofile.avatar}) except User.DoesNotExist: return error_response(u"用户不存在") else: return serializer_invalid_response(serializer)
def post(self, request): serializer = SubmissionhareSerializer(data=request.data) if serializer.is_valid(): submission_id = serializer.data["submission_id"] try: submission = _get_submission(submission_id, request.user) except Submission.DoesNotExist: return error_response(u"提交不存在") submission.shared = not submission.shared submission.save() return success_response(submission.shared) else: return serializer_invalid_response(serializer)
def post(self, request): """ openapi 创建提交 """ serializer = OpenAPICreateSubmissionSerializer(data=request.data) if serializer.is_valid(): data = serializer.data try: user = User.objects.get(openapi_appkey=data["appkey"]) except User.DoesNotExist: return error_response(u"appkey无效") return _submit_code(user, data["problem_id"], data["language"], data["code"]) else: return serializer_invalid_response(serializer)
def post(self, request): """ 比赛发布json api接口 --- request_serializer: CreateContestSerializer response_serializer: ContestSerializer """ serializer = CreateContestSerializer(data=request.data) if serializer.is_valid(): data = serializer.data groups = [] # 首先判断比赛的类型: 0 即为是小组赛(GROUP_CONTEST),1 即为是无密码的公开赛(PUBLIC_CONTEST), # 2 即为是有密码的公开赛(PASSWORD_PUBLIC_CONTEST) # 此时为有密码的公开赛,并且此时只能超级管理员才有权限此创建比赛 if data["contest_type"] in [PUBLIC_CONTEST, PASSWORD_PROTECTED_CONTEST]: if request.user.admin_type != SUPER_ADMIN: return error_response(u"只有超级管理员才可创建公开赛") if data["contest_type"] == PASSWORD_PROTECTED_CONTEST: if not data["password"]: return error_response(u"此比赛为有密码的公开赛,密码不可为空") # 没有密码的公开赛 没有密码的小组赛 elif data["contest_type"] == GROUP_CONTEST: if request.user.admin_type == SUPER_ADMIN: groups = Group.objects.filter(id__in=data["groups"]) else: groups = Group.objects.filter(id__in=data["groups"], admin=request.user) if not groups.count(): return error_response(u"请至少选择一个小组") if data["start_time"] >= data["end_time"]: return error_response(u"比赛的开始时间必须早于比赛结束的时间") try: contest = Contest.objects.create( title=data["title"], description=data["description"], contest_type=data["contest_type"], real_time_rank=data["real_time_rank"], password=data["password"], start_time=dateparse.parse_datetime(data["start_time"]), end_time=dateparse.parse_datetime(data["end_time"]), created_by=request.user, visible=data["visible"], ) except IntegrityError: return error_response(u"比赛名已经存在") contest.groups.add(*groups) return success_response(ContestSerializer(contest).data) else: return serializer_invalid_response(serializer)
def put(self, request): """ 用户编辑json api接口 --- request_serializer: EditUserSerializer response_serializer: UserSerializer """ serializer = EditUserSerializer(data=request.data) if serializer.is_valid(): data = serializer.data try: user = User.objects.get(id=data["id"]) except User.DoesNotExist: return error_response(u"该用户不存在!") try: user = User.objects.get(username=data["username"]) if user.id != data["id"]: return error_response(u"昵称已经存在") except User.DoesNotExist: pass user.username = data["username"] user.real_name = data["real_name"] user.email = data["email"] user.admin_type = data["admin_type"] if data["password"]: user.set_password(data["password"]) # 后台控制用户是否可以使用openapi if data["openapi"] is False: user.openapi_appkey = None elif data["openapi"] and user.openapi_appkey is None: user.openapi_appkey = rand_str() # 后台控制用户是否使用两步验证 # 注意:用户没开启,后台开启的话,用户没有绑定过两步验证token,会造成无法登陆的! if data["tfa_auth"] is False: user.two_factor_auth = False elif data["tfa_auth"] and user.two_factor_auth is False: user.two_factor_auth = True user.tfa_token = rand_str() # 后台控制用户是否被禁用 user.is_forbidden = data["is_forbidden"] user.save() return success_response(UserSerializer(user).data) else: return serializer_invalid_response(serializer)
def post(self, request): """ openapi 创建提交 """ serializer = OpenAPICreateSubmissionSerializer(data=request.data) if serializer.is_valid(): data = serializer.data try: user = User.objects.get(openapi_appkey=data["appkey"]) except User.DoesNotExist: return error_response(u"appkey无效") return _submit_code(user, data["problem_id"], data["language"], data["code"]) else: return serializer_invalid_response(serializer)
def post(self, request): """ 检测邮箱是否存在,存在返回True,不存在返回False --- request_serializer: EmailCheckSerializer """ serializer = EmailCheckSerializer(data=request.data) if serializer.is_valid(): try: User.objects.get(email=serializer.data["email"]) return success_response(True) except User.DoesNotExist: return success_response(False) else: return serializer_invalid_response(serializer)
def post(self, request): serializer = SSOSerializer(data=request.data) if serializer.is_valid(): try: user = User.objects.get(auth_token=serializer.data["token"]) user.auth_token = None user.save() return success_response({ "username": user.username, "admin_type": user.admin_type, "avatar": user.userprofile.avatar }) except User.DoesNotExist: return error_response(u"用户不存在") else: return serializer_invalid_response(serializer)
def post(self, request): """ 开启两步验证 """ serializer = TwoFactorAuthCodeSerializer(data=request.data) if serializer.is_valid(): code = serializer.data["code"] user = request.user if OtpAuth(user.tfa_token).valid_totp(code): user.two_factor_auth = True user.save() return success_response(u"开启两步验证成功") else: return error_response(u"验证码错误") else: return serializer_invalid_response(serializer)
def post(self, request): serializer = SubmissionhareSerializer(data=request.data) if serializer.is_valid(): submission_id = serializer.data["submission_id"] try: result = _get_submission(submission_id, request.user) except Submission.DoesNotExist: return error_response(u"提交不存在") if not result["can_share"]: return error_page(request, u"提交不存在") submission = result["submission"] submission.shared = not submission.shared submission.save() return success_response(submission.shared) else: return serializer_invalid_response(serializer)
def post(self, request): """ 添加判题服务器 json api接口 --- request_serializer: CreateJudgesSerializer response_serializer: JudgesSerializer """ serializer = CreateJudgesSerializer(data=request.data) if serializer.is_valid(): data = serializer.data judge_server = JudgeServer.objects.create(name=data["name"], ip=data["ip"], port=data["port"], max_instance_number=data["max_instance_number"], token=data["token"]) return success_response(JudgesSerializer(judge_server).data) else: return serializer_invalid_response(serializer)
def put(self, request): """ 用户编辑json api接口 --- request_serializer: EditUserSerializer response_serializer: UserSerializer """ serializer = EditUserSerializer(data=request.data) if serializer.is_valid(): data = serializer.data try: user = User.objects.get(id=data["id"]) except User.DoesNotExist: return error_response(u"该用户不存在!") try: user = User.objects.get(username=data["username"]) if user.id != data["id"]: return error_response(u"昵称已经存在") except User.DoesNotExist: pass user.username = data["username"] user.real_name = data["real_name"] user.email = data["email"] user.admin_type = data["admin_type"] if data["password"]: user.set_password(data["password"]) # 后台控制用户是否可以使用openapi if data["openapi"] is False: user.openapi_appkey = None elif data["openapi"] and user.openapi_appkey is None: user.openapi_appkey = rand_str() # 后台控制用户是否使用两步验证 # 注意:用户没开启,后台开启的话,用户没有绑定过两步验证token,会造成无法登陆的! if data["tfa_auth"] is False: user.two_factor_auth = False elif data["tfa_auth"] and user.two_factor_auth is False: user.two_factor_auth = True user.tfa_token = rand_str() user.save() return success_response(UserSerializer(user).data) else: return serializer_invalid_response(serializer)
def put(self, request): """ 题目编辑json api接口 --- request_serializer: EditProblemSerializer response_serializer: ProblemSerializer """ serializer = EditProblemSerializer(data=request.data) if serializer.is_valid(): data = serializer.data problem = Problem.objects.get(id=data["id"]) problem.title = data["title"] problem.description = data["description"] problem.input_description = data["input_description"] problem.output_description = data["output_description"] problem.test_case_id = data["test_case_id"] problem.source = data["source"] problem.time_limit = data["time_limit"] problem.memory_limit = data["memory_limit"] problem.spj = data["spj"] problem.spj_language = data["spj_language"] problem.spj_code = data["spj_code"] problem.spj_version = self._spj_version(data["spj_code"]) problem.difficulty = data["difficulty"] problem.samples = json.dumps(data["samples"]) problem.hint = data["hint"] problem.visible = data["visible"] problem.last_update_time = now() # 删除原有的标签的对应关系 problem.tags.remove(*problem.tags.all()) # 重新添加所有的标签 for tag in data["tags"]: try: tag = ProblemTag.objects.get(name=tag) except ProblemTag.DoesNotExist: tag = ProblemTag.objects.create(name=tag) problem.tags.add(tag) problem.save() return success_response(ProblemSerializer(problem).data) else: return serializer_invalid_response(serializer)
def put(self, request): """ 删除小组成员的api接口 --- request_serializer: EditGroupMemberSerializer """ serializer = EditGroupMemberSerializer(data=request.data) if serializer.is_valid(): try: group = self.get_group(request, serializer.data["group_id"]) except Group.DoesNotExist: return error_response(u"小组不存在") user_id_list = serializer.data["members"] UserGroupRelation.objects.filter( group=group, user__id__in=user_id_list).delete() return success_response(u"删除成功") else: return serializer_invalid_response(serializer)
def put(self, request): serializer = EditUserProfileSerializer(data=request.data) if serializer.is_valid(): data = serializer.data user_profile = request.user.userprofile if data["avatar"]: user_profile.avatar = data["avatar"] user_profile.mood = data["mood"] user_profile.hduoj_username = data["hduoj_username"] user_profile.bestcoder_username = data["bestcoder_username"] user_profile.codeforces_username = data["codeforces_username"] user_profile.blog = data["blog"] user_profile.school = data["school"] user_profile.phone_number = data["phone_number"] user_profile.save() return success_response(u"修改成功") else: return serializer_invalid_response(serializer)
def post(self, request): """ 比赛发布json api接口 --- request_serializer: CreateContestSerializer response_serializer: ContestSerializer """ serializer = CreateContestSerializer(data=request.data) if serializer.is_valid(): data = serializer.data groups = [] # 首先判断比赛的类型: 0 即为是小组赛(GROUP_CONTEST),1 即为是无密码的公开赛(PUBLIC_CONTEST), # 2 即为是有密码的公开赛(PASSWORD_PUBLIC_CONTEST) # 此时为有密码的公开赛,并且此时只能超级管理员才有权限此创建比赛 if data["contest_type"] in [PUBLIC_CONTEST, PASSWORD_PROTECTED_CONTEST]: if request.user.admin_type != SUPER_ADMIN: return error_response(u"只有超级管理员才可创建公开赛") if data["contest_type"] == PASSWORD_PROTECTED_CONTEST: if not data["password"]: return error_response(u"此比赛为有密码的公开赛,密码不可为空") # 没有密码的公开赛 没有密码的小组赛 elif data["contest_type"] == GROUP_CONTEST: if request.user.admin_type == SUPER_ADMIN: groups = Group.objects.filter(id__in=data["groups"]) else: groups = Group.objects.filter(id__in=data["groups"], admin=request.user) if not groups.count(): return error_response(u"请至少选择一个小组") if data["start_time"] >= data["end_time"]: return error_response(u"比赛的开始时间必须早于比赛结束的时间") try: contest = Contest.objects.create(title=data["title"], description=data["description"], contest_type=data["contest_type"], real_time_rank=data["real_time_rank"], password=data["password"], start_time=dateparse.parse_datetime(data["start_time"]), end_time=dateparse.parse_datetime(data["end_time"]), created_by=request.user, visible=data["visible"]) except IntegrityError: return error_response(u"比赛名已经存在") contest.groups.add(*groups) return success_response(ContestSerializer(contest).data) else: return serializer_invalid_response(serializer)
def post(self, request): """ 提交代码 --- request_serializer: CreateSubmissionSerializer """ controller = BucketController( user_id=request.user.id, redis_conn=redis.Redis(host=settings.REDIS_CACHE["host"], port=settings.REDIS_CACHE["port"], db=settings.REDIS_CACHE["db"]), default_capacity=settings.TOKEN_BUCKET_DEFAULT_CAPACITY) bucket = TokenBucket(fill_rate=settings.TOKEN_BUCKET_FILL_RATE, capacity=settings.TOKEN_BUCKET_DEFAULT_CAPACITY, last_capacity=controller.last_capacity, last_timestamp=controller.last_timestamp) if bucket.consume(): controller.last_capacity -= 1 else: return error_response(u"您提交的频率过快, 请等待%d秒" % int(bucket.expected_time() + 1)) serializer = CreateSubmissionSerializer(data=request.data) if serializer.is_valid(): data = serializer.data try: problem = Problem.objects.get(id=data["problem_id"]) except Problem.DoesNotExist: return error_response(u"题目不存在") submission = Submission.objects.create(user_id=request.user.id, language=int( data["language"]), code=data["code"], problem_id=problem.id) try: _judge.delay(submission, problem.time_limit, problem.memory_limit, problem.test_case_id) except Exception as e: logger.error(e) return error_response(u"提交判题任务失败") return success_response({"submission_id": submission.id}) else: return serializer_invalid_response(serializer)
def put(self, request): serializer = EditPostSerializer(data=request.data) if serializer.is_valid(): data = serializer.data if str(request.data["dell"]) == '1': post=Post.objects.get(id=data["id"]) post.delete() return success_response(u"删除成功") else :#修改 try: post = Post.objects.get(id=data["id"]) except Post.DoesNotExist: return error_response(u"厉害了,没有这个id,sorry!") post.hidden = data["hidden"] post.content_raw = data["content_raw"] post.save() return success_response(PostSerializer(post).data) else : return serializer_invalid_response(serializer)
def post(self, request): """ 添加判题服务器 json api接口 --- request_serializer: CreateJudgesSerializer response_serializer: JudgesSerializer """ serializer = CreateJudgesSerializer(data=request.data) if serializer.is_valid(): data = serializer.data judge_server = JudgeServer.objects.create( name=data["name"], ip=data["ip"], port=data["port"], max_instance_number=data["max_instance_number"], token=data["token"]) return success_response(JudgesSerializer(judge_server).data) else: return serializer_invalid_response(serializer)
def post(self, request): serializer = ResetPasswordSerializer(data=request.data) if serializer.is_valid(): data = serializer.data captcha = Captcha(request) if not captcha.check(data["captcha"]): return error_response(u"验证码错误") try: user = User.objects.get(reset_password_token=data["token"]) except User.DoesNotExist: return error_response(u"token 不存在") if (now() - user.reset_password_token_create_time).total_seconds() > 30 * 60: return error_response(u"token 已经过期,请在30分钟内重置密码") user.reset_password_token = None user.set_password(data["password"]) user.save() return success_response(u"密码重置成功") else: return serializer_invalid_response(serializer)
def post(self, request): """ 题目发布json api接口 --- request_serializer: CreateProblemSerializer response_serializer: ProblemSerializer """ serializer = CreateProblemSerializer(data=request.data) if serializer.is_valid(): data = serializer.data try: Problem.objects.get(title=data["title"]) return error_response(u"添加失败,存在重复的题目") except Problem.DoesNotExist: pass problem = Problem.objects.create( title=data["title"], description=data["description"], input_description=data["input_description"], output_description=data["output_description"], test_case_id=data["test_case_id"], source=data["source"], samples=json.dumps(data["samples"]), time_limit=data["time_limit"], memory_limit=data["memory_limit"], spj=data["spj"], spj_language=data["spj_language"], spj_code=data["spj_code"], spj_version=self._spj_version(data["spj_code"]), difficulty=data["difficulty"], created_by=request.user, hint=data["hint"], visible=data["visible"]) for tag in data["tags"]: try: tag = ProblemTag.objects.get(name=tag) except ProblemTag.DoesNotExist: tag = ProblemTag.objects.create(name=tag) problem.tags.add(tag) return success_response(ProblemSerializer(problem).data) else: return serializer_invalid_response(serializer)
def post(self, request): """ 提交请求重置密码 --- request_serializer: ApplyResetPasswordSerializer """ serializer = ApplyResetPasswordSerializer(data=request.data) if serializer.is_valid(): data = serializer.data captcha = Captcha(request) if not captcha.check(data["captcha"]): return error_response(u"验证码错误") try: user = User.objects.get(email=data["email"]) except User.DoesNotExist: return error_response(u"用户不存在") if user.reset_password_token_create_time and ( now() - user.reset_password_token_create_time ).total_seconds() < 20 * 60: return error_response(u"20分钟内只能找回一次密码") user.reset_password_token = rand_str() user.reset_password_token_create_time = now() user.save() email_template = codecs.open( settings.TEMPLATES[0]["DIRS"][0] + "utils/reset_password_email.html", "r", "utf-8").read() email_template = email_template.replace("{{ username }}", user.username). \ replace("{{ website_name }}", settings.WEBSITE_INFO["website_name"]). \ replace("{{ link }}", request.scheme + "://" + request.META['HTTP_HOST'] + "/reset_password/t/" + user.reset_password_token) _send_email.delay( settings.WEBSITE_INFO["website_name"], user.email, user.username, settings.WEBSITE_INFO["website_name"] + u" 登录信息找回邮件", email_template) return success_response(u"邮件发送成功,请前往您的邮箱查收") else: return serializer_invalid_response(serializer)
def put(self, request): serializer = TopicSerializer(data=request.data) if serializer.is_valid(): data = serializer.data if str(request.data["dell"]) == '1': topic=Topic.objects.get(id=int(request.data['id'])) topic.delete() return success_response(u"删除成功") else :#修改 try: topic = Topic.objects.get(id=int(request.data['id'])) except Topic.DoesNotExist: return error_response(u"厉害了,没有这个id,sorry!") topic.title = data["title"] topic.hidden = data["hidden"] topic.closed = data["closed"] topic.content_raw = data["content_raw"] topic.save() return success_response(TopicSerializer(topic).data) else : return serializer_invalid_response(serializer)
def post(self, request): """ 用户登录json api接口 --- request_serializer: UserLoginSerializer """ serializer = UserLoginSerializer(data=request.data) if serializer.is_valid(): data = serializer.data captcha = Captcha(request) if not captcha.check(data["captcha"]): return error_response(u"验证码错误") user = auth.authenticate(username=data["username"], password=data["password"]) # 用户名或密码错误的话 返回None if user: auth.login(request, user) return success_response(u"登录成功") else: return error_response(u"用户名或密码错误") else: return serializer_invalid_response(serializer)
def post(self, request): serializer = ContestPasswordVerifySerializer(data=request.data) if serializer.is_valid(): data = request.data try: contest = Contest.objects.get(id=data["contest_id"], contest_type=PASSWORD_PROTECTED_CONTEST) except Contest.DoesNotExist: return error_response(u"比赛不存在") if data["password"] != contest.password: return error_response(u"密码错误") else: if "contests" not in request.session: request.session["contests"] = [] request.session["contests"].append(int(data["contest_id"])) # https://docs.djangoproject.com/en/dev/topics/http/sessions/#when-sessions-are-saved request.session.modified = True return success_response(True) else: return serializer_invalid_response(serializer)
def post(self, request): """ 创建小组的api --- request_serializer: CreateGroupSerializer response_serializer: GroupSerializer """ serializer = CreateGroupSerializer(data=request.data) if serializer.is_valid(): data = serializer.data try: group = Group.objects.create( name=data["name"], description=data["description"], join_group_setting=data["join_group_setting"], admin=request.user) except IntegrityError: return error_response(u"小组名已经存在") return success_response(GroupSerializer(group).data) else: return serializer_invalid_response(serializer)
def post(self, request): """ 比赛题目发布json api接口 --- request_serializer: CreateContestProblemSerializer response_serializer: ContestProblemSerializer """ serializer = CreateContestProblemSerializer(data=request.data) if serializer.is_valid(): data = serializer.data try: contest = Contest.objects.get(id=data["contest_id"]) if request.user.admin_type != SUPER_ADMIN: contest_set = Contest.objects.filter( groups__in=request.user.managed_groups.all()) if contest not in contest_set: return error_response(u"比赛不存在") except Contest.DoesNotExist: return error_response(u"比赛不存在") contest_problem = ContestProblem.objects.create( title=data["title"], description=data["description"], input_description=data["input_description"], output_description=data["output_description"], test_case_id=data["test_case_id"], samples=json.dumps(data["samples"]), time_limit=data["time_limit"], memory_limit=data["memory_limit"], spj=data["spj"], spj_language=data["spj_language"], spj_code=data["spj_code"], spj_version=self._spj_version(data["spj_code"]), created_by=request.user, hint=data["hint"], contest=contest, sort_index=data["sort_index"]) return success_response( ContestProblemSerializer(contest_problem).data) else: return serializer_invalid_response(serializer)
def put(self, request): """ 比赛题目编辑json api接口 --- request_serializer: EditContestProblemSerializer response_serializer: ContestProblemSerializer """ serializer = EditContestProblemSerializer(data=request.data) if serializer.is_valid(): data = serializer.data try: contest_problem = ContestProblem.objects.get(id=data["id"]) except ContestProblem.DoesNotExist: return error_response(u"该比赛题目不存在!") contest = Contest.objects.get(id=contest_problem.contest_id) if request.user.admin_type != SUPER_ADMIN and contest.created_by != request.user: return error_response(u"比赛不存在") contest_problem.title = data["title"] contest_problem.description = data["description"] contest_problem.input_description = data["input_description"] contest_problem.output_description = data["output_description"] contest_problem.test_case_id = data["test_case_id"] contest_problem.time_limit = data["time_limit"] contest_problem.memory_limit = data["memory_limit"] contest_problem.spj = data["spj"] contest_problem.spj_language = data["spj_language"] contest_problem.spj_code = data["spj_code"] contest_problem.spj_version = self._spj_version(data["spj_code"]) contest_problem.samples = json.dumps(data["samples"]) contest_problem.hint = data["hint"] contest_problem.visible = data["visible"] contest_problem.sort_index = data["sort_index"] contest_problem.last_update_time = now() contest_problem.save() return success_response( ContestProblemSerializer(contest_problem).data) else: return serializer_invalid_response(serializer)
def put(self, request): serializer = AppendixSerializer(data=request.data) if serializer.is_valid(): data = serializer.data if str(request.data["dell"]) == '1': try: appendix=Appendix.objects.get(id=int(request.data['id'])) appendix.delete() except Appendix.DoesNotExist: return error_response(u"厉害了,没有这个id,sorry!") return success_response(u"删除成功") else :#修改 try: appendix = Appendix.objects.get(id=int(request.data['id'])) except Appendix.DoesNotExist: return error_response(u"厉害了,没有这个id,sorry!") pass appendix.content_raw = data["content_raw"] appendix.save() return success_response(PostSerializer(appendix).data) else : return serializer_invalid_response(serializer)
def post(self, request): serializer = SubmissionRejudgeSerializer(data=request.data) if serializer.is_valid(): submission_id = serializer.data["submission_id"] # 目前只考虑前台公开题目的重新判题 try: submission = Submission.objects.get(id=submission_id, contest_id__isnull=True) except Submission.DoesNotExist: return error_response(u"提交不存在") try: problem = Problem.objects.get(id=submission.problem_id) except Problem.DoesNotExist: return error_response(u"题目不存在") try: _judge.delay(submission, problem.time_limit, problem.memory_limit, problem.test_case_id) except Exception as e: logger.error(e) return error_response(u"提交判题任务失败") return success_response(u"任务提交成功") else: return serializer_invalid_response(serializer)
def post(self, request): """ 用户修改密码json api接口 --- request_serializer: UserChangePasswordSerializer """ serializer = UserChangePasswordSerializer(data=request.data) if serializer.is_valid(): data = serializer.data captcha = Captcha(request) if not captcha.check(data["captcha"]): return error_response(u"验证码错误") username = request.user.username user = auth.authenticate(username=username, password=data["old_password"]) if user: user.set_password(data["new_password"]) user.save() return success_response(u"用户密码修改成功!") else: return error_response(u"密码不正确,请重新修改!") else: return serializer_invalid_response(serializer)
def put(self, request): """ 公告编辑json api接口 --- request_serializer: EditAnnouncementSerializer response_serializer: AnnouncementSerializer """ serializer = EditAnnouncementSerializer(data=request.data) if serializer.is_valid(): data = serializer.data try: announcement = Announcement.objects.get(id=data["id"]) except Announcement.DoesNotExist: return error_response(u"公告不存在") announcement.title = data["title"] announcement.content = data["content"] announcement.visible = data["visible"] announcement.save() return success_response(AnnouncementSerializer(announcement).data) else: return serializer_invalid_response(serializer)
def post(self, request): """ 创建小组管理员的api --- request_serializer: GroupPromoteAdminSerializer """ serializer = GroupPromoteAdminSerializer(data=request.data) if serializer.is_valid(): data = serializer.data try: group = Group.objects.get(id=data["group_id"]) except Group.DoesNotExist: return error_response(u"小组不存在") try: user = User.objects.get(id=data["user_id"]) except User.DoesNotExist: return error_response(u"用户不存在") try: AdminGroupRelation.objects.create(user=user, group=group) except IntegrityError: return error_response(u"该用户已经是管理员了") return success_response(u"操作成功") else: return serializer_invalid_response(serializer)
def post(self, request): """ 比赛发布json api接口 --- request_serializer: CreateContestSerializer response_serializer: ContestSerializer """ serializer = CreateContestSerializer(data=request.data) if serializer.is_valid(): data = serializer.data groups = [] # 首先判断比赛的类型: 0 即为是小组赛(GROUP_CONTEST),1 即为是无密码的公开赛(PUBLIC_CONTEST), # 2 即为是有密码的公开赛(PASSWORD_PUBLIC_CONTEST) # 此时为有密码的公开赛,并且此时只能超级管理员才有权限此创建比赛 if data["contest_type"] in [ PUBLIC_CONTEST, PASSWORD_PROTECTED_CONTEST ]: if request.user.admin_type != SUPER_ADMIN: return error_response(u"只有超级管理员才可创建公开赛") if data["contest_type"] in [ PASSWORD_PROTECTED_CONTEST, PASSWORD_PROTECTED_GROUP_CONTEST ]: if not data["password"]: return error_response(u"此比赛为有密码的比赛,密码不可为空") # 没有密码的公开赛 没有密码的小组赛 if data["contest_type"] == GROUP_CONTEST or data[ "contest_type"] == PASSWORD_PROTECTED_GROUP_CONTEST: if request.user.admin_type == SUPER_ADMIN: groups = Group.objects.filter(id__in=data["groups"]) else: groups = Group.objects.filter(id__in=data["groups"], admin=request.user) if not groups.count(): return error_response(u"请至少选择一个小组") if data["start_time"] >= data["end_time"]: return error_response(u"比赛的开始时间必须早于比赛结束的时间") try: contest = Contest.objects.create( title=data["title"], description=data["description"], contest_type=data["contest_type"], real_time_rank=data["real_time_rank"], password=data["password"], start_time=dateparse.parse_datetime(data["start_time"]), end_time=dateparse.parse_datetime(data["end_time"]), created_by=request.user, visible=data["visible"]) except IntegrityError: return error_response(u"比赛名已经存在") contest.groups.add(*groups) # 把题目逐个加入,如果已经存在对应contestproblem,那就创建title不同的备份 problem_list = data["problems"] problem_list = problem_list.split(',') #if len(problem_list) >= 26: # return error_response(u"太多题目啦,添加失败") sort_id = 'A' for problem_id in problem_list: pid = int(problem_id) linked_problem = Problem.objects.get(id=pid) linked_problem.visible = False linked_problem.save() titled = ContestProblem.objects.filter( title=linked_problem.title) if titled.count() == 0: contest_problem = ContestProblem.objects.create( title=linked_problem.title, description=linked_problem.description, input_description=linked_problem.input_description, output_description=linked_problem.output_description, test_case_id=linked_problem.test_case_id, samples=linked_problem.samples, time_limit=linked_problem.time_limit, memory_limit=linked_problem.memory_limit, spj=linked_problem.spj, spj_language=linked_problem.spj_language, spj_code=linked_problem.spj_code, spj_version=linked_problem.spj_version, created_by=request.user, hint=linked_problem.hint, contest=contest, sort_index=sort_id, is_public=True) else: is_include = False for preproblems in titled: if preproblems.contest == contest: is_include = True break if not is_include: titled = ContestProblem.objects.filter( title=linked_problem.title + '(' + contest.title + ')') if titled.count(): is_include = True if not is_include: contest_problem = ContestProblem.objects.create( title=linked_problem.title + '(' + contest.title + ')', description=linked_problem.description, input_description=linked_problem.input_description, output_description=linked_problem. output_description, test_case_id=linked_problem.test_case_id, samples=linked_problem.samples, time_limit=linked_problem.time_limit, memory_limit=linked_problem.memory_limit, spj=linked_problem.spj, spj_language=linked_problem.spj_language, spj_code=linked_problem.spj_code, spj_version=linked_problem.spj_version, created_by=request.user, hint=linked_problem.hint, contest=contest, sort_index=sort_id, is_public=True) sort_id = chr(ord(sort_id) + 1) contest.save() return success_response(ContestSerializer(contest).data) else: return serializer_invalid_response(serializer)
def post(self, request): """ 比赛编辑json api接口 --- request_serializer: EditContestSerializer response_serializer: ContestSerializer """ serializer = EditContestSerializer(data=request.data) if serializer.is_valid(): data = serializer.data groups = [] try: # 超级管理员可以编辑所有的 contest = Contest.objects.get(id=data["id"]) if request.user.admin_type != SUPER_ADMIN: contest_set = Contest.objects.filter( groups__in=request.user.managed_groups.all()) if contest not in contest_set: return error_response(u"无权访问!") except Contest.DoesNotExist: return error_response(u"该比赛不存在!") try: contest = Contest.objects.get(title=data["title"]) if contest.id != data["id"]: return error_response(u"该比赛名称已经存在") except Contest.DoesNotExist: pass if data["contest_type"] in [ PUBLIC_CONTEST, PASSWORD_PROTECTED_CONTEST ]: if request.user.admin_type != SUPER_ADMIN: return error_response(u"只有超级管理员才可创建公开赛") if data["contest_type"] == PASSWORD_PROTECTED_CONTEST: if not data["password"]: return error_response(u"此比赛为有密码的公开赛,密码不可为空") elif data["contest_type"] in [ GROUP_CONTEST, PASSWORD_PROTECTED_GROUP_CONTEST ]: if request.user.admin_type == SUPER_ADMIN: groups = Group.objects.filter(id__in=data["groups"]) else: groups = Group.objects.filter(id__in=data["groups"], admin=request.user) if not groups.count(): return error_response(u"请至少选择一个小组") if data["start_time"] >= data["end_time"]: return error_response(u"比赛的开始时间必须早于比赛结束的时间") # 之前是封榜,现在要开放,需要清除缓存 if contest.real_time_rank == False and data[ "real_time_rank"] == True: r = get_cache_redis() cache_key = str(contest.id) + "_rank_cache" r.delete(cache_key) contest.title = data["title"] contest.description = data["description"] contest.contest_type = data["contest_type"] contest.real_time_rank = data["real_time_rank"] contest.start_time = dateparse.parse_datetime(data["start_time"]) contest.end_time = dateparse.parse_datetime(data["end_time"]) contest.visible = data["visible"] contest.password = data["password"] contest.groups.clear() contest.groups.add(*groups) #把题目逐个加入,如果已经存在对应contestproblem,那就创建title不同的备份 #try: # problem_list = data["problems"] # if problem_list == None or problem_list == "": # contest.save() # return success_response(ContestSerializer(contest).data) # problem_list = problem_list.split(',') # contest_problem_list = ContestProblem.objects.filter(contest=contest, visible=True).select_related( # "contest").order_by("sort_index") # if len(problem_list) > 26: # return error_response(u"太多题目啦,添加失败") # sort_id = 'A' # for problem_id in problem_list: # pid = int(problem_id) # linked_problem = Problem.objects.get(id=pid) # linked_problem.visible = False # linked_problem.save() # titled = ContestProblem.objects.filter(title=linked_problem.title) # if titled.count() == 0: # contest_problem = ContestProblem.objects.create(title=linked_problem.title, # description=linked_problem.description, # input_description=linked_problem.input_description, # output_description=linked_problem.output_description, # test_case_id=linked_problem.test_case_id, # samples=linked_problem.samples, # time_limit=linked_problem.time_limit, # memory_limit=linked_problem.memory_limit, # spj=linked_problem.spj, # spj_language=linked_problem.spj_language, # spj_code=linked_problem.spj_code, # spj_version=linked_problem.spj_version, # created_by=request.user, # hint=linked_problem.hint, # contest=contest, # sort_index=sort_id, # is_public=True # ) # else: # is_include = False # for preproblems in titled: # if preproblems.contest == contest: # is_include = True # break # if not is_include: # titled = ContestProblem.objects.filter(title=linked_problem.title+ '('+contest.title + ')') # if titled.count(): # is_include = True # if not is_include: # contest_problem = ContestProblem.objects.create(title=linked_problem.title + '('+contest.title + ')', # description=linked_problem.description, # input_description=linked_problem.input_description, # output_description=linked_problem.output_description, # test_case_id=linked_problem.test_case_id, # samples=linked_problem.samples, # time_limit=linked_problem.time_limit, # memory_limit=linked_problem.memory_limit, # spj=linked_problem.spj, # spj_language=linked_problem.spj_language, # spj_code=linked_problem.spj_code, # spj_version=linked_problem.spj_version, # created_by=request.user, # hint=linked_problem.hint, # contest=contest, # sort_index=sort_id, # is_public=True # ) # sort_id = chr(ord(sort_id) + 1) # for existed_problem in contest_problem_list: # existed_problem.sort_index = str(sort_id) # existed_problem.save() # if sort_id == 'Z': # sort_id = 0; # elif sort_id.isalpha(): # sort_id = chr(ord(sort_id) + 1) # else: # sort_id += 1 contest.save() # #except: # # contest.save() # # return success_response(u"比赛已是部分问题解析错误") return success_response(ContestSerializer(contest).data) else: return serializer_invalid_response(serializer)
def put(self, request): """ 比赛编辑json api接口 --- request_serializer: EditContestSerializer response_serializer: ContestSerializer """ serializer = EditContestSerializer(data=request.data) if serializer.is_valid(): data = serializer.data groups = [] try: # 超级管理员可以编辑所有的 contest = Contest.objects.get(id=data["id"]) if request.user.admin_type != SUPER_ADMIN: contest_set = Contest.objects.filter( groups__in=request.user.managed_groups.all()) if contest not in contest_set: return error_response(u"无权访问!") except Contest.DoesNotExist: return error_response(u"该比赛不存在!") try: contest = Contest.objects.get(title=data["title"]) if contest.id != data["id"]: return error_response(u"该比赛名称已经存在") except Contest.DoesNotExist: pass if data["contest_type"] in [ PUBLIC_CONTEST, PASSWORD_PROTECTED_CONTEST ]: if request.user.admin_type != SUPER_ADMIN: return error_response(u"只有超级管理员才可创建公开赛") if data["contest_type"] == PASSWORD_PROTECTED_CONTEST: if not data["password"]: return error_response(u"此比赛为有密码的公开赛,密码不可为空") elif data["contest_type"] in [ GROUP_CONTEST, PASSWORD_PROTECTED_GROUP_CONTEST ]: if request.user.admin_type == SUPER_ADMIN: groups = Group.objects.filter(id__in=data["groups"]) else: groups = Group.objects.filter(id__in=data["groups"], admin=request.user) if not groups.count(): return error_response(u"请至少选择一个小组") if data["start_time"] >= data["end_time"]: return error_response(u"比赛的开始时间必须早于比赛结束的时间") # 之前是封榜,现在要开放,需要清除缓存 if contest.real_time_rank == False and data[ "real_time_rank"] == True: r = get_cache_redis() cache_key = str(contest.id) + "_rank_cache" r.delete(cache_key) contest.title = data["title"] contest.description = data["description"] contest.contest_type = data["contest_type"] contest.real_time_rank = data["real_time_rank"] contest.start_time = dateparse.parse_datetime(data["start_time"]) contest.end_time = dateparse.parse_datetime(data["end_time"]) contest.visible = data["visible"] contest.password = data["password"] contest.save() contest.groups.clear() contest.groups.add(*groups) return success_response(ContestSerializer(contest).data) else: return serializer_invalid_response(serializer)