Example #1
0
    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)
Example #2
0
    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)
Example #3
0
 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)
Example #4
0
    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)
Example #5
0
    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)
Example #6
0
    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)
Example #7
0
    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)
Example #8
0
    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)
Example #9
0
    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)
Example #10
0
File: views.py Project: mcmdhr/CSOJ
 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)
Example #11
0
 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)
Example #12
0
 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)
Example #13
0
 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)
Example #14
0
 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)
Example #15
0
    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)
Example #16
0
    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)
Example #17
0
    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)
Example #18
0
 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)
Example #19
0
    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)
Example #20
0
 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)
Example #21
0
 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)
Example #22
0
File: views.py Project: mcmdhr/CSOJ
 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)
Example #23
0
 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)
Example #24
0
 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)
Example #25
0
 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)
Example #26
0
File: views.py Project: mcmdhr/CSOJ
 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)
Example #27
0
    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)
Example #28
0
    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)
Example #29
0
 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)
Example #30
0
 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)
Example #31
0
 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)
Example #32
0
 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)
Example #33
0
 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)
Example #34
0
 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)
Example #35
0
    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)
Example #36
0
    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)
Example #37
0
 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)
Example #38
0
 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)
Example #39
0
    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)
Example #40
0
    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)
Example #41
0
 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)
Example #42
0
 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)
Example #43
0
 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)
Example #44
0
 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)
Example #45
0
    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)
Example #46
0
 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)
Example #47
0
 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)
Example #48
0
    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)
Example #49
0
 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)
Example #50
0
 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)
Example #51
0
    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)
Example #52
0
 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)
Example #53
0
    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)
Example #54
0
 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)
Example #55
0
    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)
Example #56
0
 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)
Example #57
0
    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)
Example #58
0
    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)
Example #59
0
    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)