Example #1
0
    def get(self, request):
        # 获得比赛题目
        problem_id = request.GET.get("id")
        contest_id = request.GET.get("contest_id")
        user = request.user
        # 题目ID非空就返回题目信息,但是如果之传入contest_id则不会经过这个判断,会现在执行
        if problem_id:
            # 查找竞赛问题时候,其实这里及传入问题的 id又传入比赛的id,因为要查找的是问题本身,
            # 虽然问题包含在题目里面,但是只需要返回问题即可,程序在这个判断完成之后返回
            try:
                problem = Problem.objects.get(id=problem_id)
                ensure_created_by(problem.contest, user)
            except Problem.DoesNotExist:
                return self.error("Problem does not exist")
            return self.success(ProblemAdminSerializer(problem).data)

        if not contest_id:
            return self.error("Contest id is required")
        try:
            contest = Contest.objects.get(id=contest_id)
            ensure_created_by(contest, user)
        except Contest.DoesNotExist:
            return self.error("Contest does not exist")
        problems = Problem.objects.filter(contest=contest).order_by("-create_time")
        if user.is_admin():
            problems = problems.filter(contest__created_by=user)
        keyword = request.GET.get("keyword")
        if keyword:
            problems = problems.filter(title__contains=keyword)
        return self.success(self.paginate_data(request, problems, ProblemAdminSerializer))
Example #2
0
    def get(self, request):
        problem_id = request.GET.get("id")
        contest_id = request.GET.get("contest_id")
        user = request.user
        if problem_id:
            try:
                problem = Problem.objects.get(id=problem_id)
                ensure_created_by(problem.contest, user)
            except Problem.DoesNotExist:
                return self.error("Problem does not exist")
            return self.success(ProblemAdminSerializer(problem).data)

        if not contest_id:
            return self.error("Contest id is required")
        try:
            contest = Contest.objects.get(id=contest_id)
            ensure_created_by(contest, user)
        except Contest.DoesNotExist:
            return self.error("Contest does not exist")
        problems = Problem.objects.filter(
            contest=contest).order_by("-create_time")
        if user.is_admin():
            problems = problems.filter(contest__created_by=user)
        keyword = request.GET.get("keyword")
        if keyword:
            problems = problems.filter(title__contains=keyword)
        return self.success(
            self.paginate_data(request, problems, ProblemAdminSerializer))
Example #3
0
    def get(self, request):
        # 使用get方法获取题目,
        problem_id = request.GET.get("id")
        rule_type = request.GET.get("rule_type")
        user = request.user
        if problem_id:
            try:
                # 获取题目要保证是该管理员创建的题目才可以,返回序列化的题目信息
                problem = Problem.objects.get(id=problem_id)
                ensure_created_by(problem, request.user)
                return self.success(ProblemAdminSerializer(problem).data)
            except Problem.DoesNotExist:
                return self.error("Problem does not exist")
        # 如果不提供问题的ID,同时比赛的ID也是空,就按照创建的事件先后来获取
        problems = Problem.objects.filter(contest_id__isnull=True).order_by("-create_time")
        if rule_type:
            if rule_type not in ProblemRuleType.choices():
                return self.error("Invalid rule_type")
            else:
                problems = problems.filter(rule_type=rule_type)

        # 安关键字查找
        keyword = request.GET.get("keyword", "").strip()
        if keyword:
            problems = problems.filter(Q(title__icontains=keyword) | Q(_id__icontains=keyword))
        # 如果该用户不能管理所有的问题,就查找返回该用户自己创建的题目
        if not user.can_mgmt_all_problem():
            problems = problems.filter(created_by=user)
        # 经过分层的查找之后,返回分页数据(Problems-> problems)
        return self.success(self.paginate_data(request, problems, ProblemAdminSerializer))
Example #4
0
    def put(self, request):
        # 修改比赛数据
        data = request.data
        try:
            # 根据传入的ID查找数据库,同时确保比赛是该用户创建的时候才能修改
            contest = Contest.objects.get(id=data.pop("id"))
            ensure_created_by(contest, request.user)
        except Contest.DoesNotExist:
            return self.error("Contest does not exist")
        # 重新配置信息
        data["start_time"] = dateutil.parser.parse(data["start_time"])
        data["end_time"] = dateutil.parser.parse(data["end_time"])
        if data["end_time"] <= data["start_time"]:
            return self.error("Start time must occur earlier than end time")
        # 传入的数据没有密码就默认比赛是公开的
        if not data["password"]:
            data["password"] = None
        # IP地址有效性检测
        for ip_range in data["allowed_ip_ranges"]:
            try:
                ip_network(ip_range, strict=False)
            except ValueError:
                return self.error(f"{ip_range} is not a valid cidr network")

        # 不需要实时比赛排名就删除缓存关键字
        if not contest.real_time_rank and data.get("real_time_rank"):
            cache_key = f"{CacheKey.contest_rank_cache}:{contest.id}"
            cache.delete(cache_key)

        # 对于每一个在data里面的键值对,将对应的属性更新到contest里面去,保存到数据库
        for k, v in data.items():
            setattr(contest, k, v)
        contest.save()
        # 成功之后返回将竞赛序列话的数据
        return self.success(ContestAdminSerializer(contest).data)
Example #5
0
    def get(self, request):
        """
        获得单个比赛通知或者比赛通知列表
        """
        contest_announcement_id = request.GET.get("id")
        if contest_announcement_id:
            try:
                contest_announcement = ContestAnnouncement.objects.get(
                    id=contest_announcement_id)
                ensure_created_by(contest_announcement, request.user)
                # 返回比赛通知的序列化信息,单挑,根据创建的ID,直接查找到指定的比赛通知信息
                return self.success(
                    ContestAnnouncementSerializer(contest_announcement).data)
            except ContestAnnouncement.DoesNotExist:
                return self.error("Contest announcement does not exist")

        contest_id = request.GET.get("contest_id")
        if not contest_id:
            return self.error("Parameter error")
        # 根据传入的比赛ID号查找到对应的用户,根据用户将其发表的所用比赛通知查出返回
        contest_announcements = ContestAnnouncement.objects.filter(
            contest_id=contest_id)
        if request.user.is_admin():
            contest_announcements = contest_announcements.filter(
                created_by=request.user)
        keyword = request.GET.get("keyword")
        if keyword:
            contest_announcements = contest_announcements.filter(
                title__contains=keyword)
        # many=True,说明是反悔一个列表
        return self.success(
            ContestAnnouncementSerializer(contest_announcements,
                                          many=True).data)
Example #6
0
    def get(self, request):
        problem_id = request.GET.get("id")
        rule_type = request.GET.get("rule_type")
        user = request.user
        if problem_id:
            try:
                problem = Problem.objects.get(id=problem_id)
                ensure_created_by(problem, request.user)
                return self.success(ProblemAdminSerializer(problem).data)
            except Problem.DoesNotExist:
                return self.error("Problem does not exist")

        problems = Problem.objects.filter(contest_id__isnull=True).order_by("-create_time")
        if rule_type:
            if rule_type not in ProblemRuleType.choices():
                return self.error("Invalid rule_type")
            else:
                problems = problems.filter(rule_type=rule_type)

        keyword = request.GET.get("keyword", "").strip()
        if keyword:
            problems = problems.filter(Q(title__icontains=keyword) | Q(_id__icontains=keyword))
        if not user.can_mgmt_all_problem():
            problems = problems.filter(created_by=user)
        return self.success(self.paginate_data(request, problems, ProblemAdminSerializer))
Example #7
0
    def post(self, request):
        data = request.data
        try:
            contest = Contest.objects.get(id=data.pop("contest_id"))
            ensure_created_by(contest, request.user)
        except Contest.DoesNotExist:
            return self.error("Соревнование не существует")

        if data["rule_type"] != contest.rule_type:
            return self.error("Invalid rule type")

        _id = data["_id"]
        if not _id:
            return self.error("Требуется отображаесый id")

        if Problem.objects.filter(_id=_id, contest=contest).exists():
            return self.error("Такой отображаемый id уже существует")

        error_info = self.common_checks(request)
        if error_info:
            return self.error(error_info)

        # todo check filename and score info
        data["contest"] = contest
        tags = data.pop("tags")
        data["created_by"] = request.user
        problem = Problem.objects.create(**data)

        for item in tags:
            try:
                tag = ProblemTag.objects.get(name=item)
            except ProblemTag.DoesNotExist:
                tag = ProblemTag.objects.create(name=item)
            problem.tags.add(tag)
        return self.success(ProblemAdminSerializer(problem).data)
Example #8
0
    def post(self, request):
        data = request.data
        try:
            contest = Contest.objects.get(id=data.pop("contest_id"))
            ensure_created_by(contest, request.user)
        except Contest.DoesNotExist:
            return self.error("Contest does not exist")

        if data["rule_type"] != contest.rule_type:
            return self.error("Invalid rule type")

        _id = data["_id"]
        if not _id:
            return self.error("Display ID is required")

        if Problem.objects.filter(_id=_id, contest=contest).exists():
            return self.error("Duplicate Display id")

        error_info = self.common_checks(request)
        if error_info:
            return self.error(error_info)

        # todo check filename and score info
        data["contest"] = contest
        tags = data.pop("tags")
        data["created_by"] = request.user
        problem = Problem.objects.create(**data)

        for item in tags:
            try:
                tag = ProblemTag.objects.get(name=item)
            except ProblemTag.DoesNotExist:
                tag = ProblemTag.objects.create(name=item)
            problem.tags.add(tag)
        return self.success(ProblemAdminSerializer(problem).data)
Example #9
0
    def get(self, request):
        problem_id = request.GET.get("problem_id")
        if not problem_id:
            return self.error("Parameter error, problem_id is required")
        try:
            problem = Problem.objects.get(id=problem_id)
        except Problem.DoesNotExist:
            return self.error("Problem does not exists")

        if problem.contest:
            ensure_created_by(problem.contest, request.user)
        else:
            ensure_created_by(problem, request.user)

        test_case_dir = os.path.join(settings.TEST_CASE_DIR,
                                     problem.test_case_id)
        if not os.path.isdir(test_case_dir):
            return self.error("Test case does not exists")
        name_list = self.filter_name_list(os.listdir(test_case_dir),
                                          problem.spj)
        name_list.append("info")
        file_name = os.path.join(test_case_dir, problem.test_case_id + ".zip")
        with zipfile.ZipFile(file_name, "w") as file:
            for test_case in name_list:
                file.write(f"{test_case_dir}/{test_case}", test_case)
        response = StreamingHttpResponse(
            FileWrapper(open(file_name, "rb")),
            content_type="application/octet-stream")

        response[
            "Content-Disposition"] = f"attachment; filename=problem_{problem.id}_test_cases.zip"
        response["Content-Length"] = os.path.getsize(file_name)
        return response
Example #10
0
    def get(self, request):
        problem_id = request.GET.get("problem_id")
        if not problem_id:
            return self.error("Параметрическая ошибка, необходим id задачи")
        try:
            problem = Problem.objects.get(id=problem_id)
        except Problem.DoesNotExist:
            return self.error("Задачи не существует")

        if problem.contest:
            ensure_created_by(problem.contest, request.user)
        else:
            ensure_created_by(problem, request.user)

        test_case_dir = os.path.join(settings.TEST_CASE_DIR, problem.test_case_id)
        if not os.path.isdir(test_case_dir):
            return self.error("Тесты для этой задачи не существуют. Попробуйте загрузить тесты ещё раз.")
        name_list = self.filter_name_list(os.listdir(test_case_dir), problem.spj)
        name_list.append("info")
        file_name = os.path.join(test_case_dir, problem.test_case_id + ".zip")
        with zipfile.ZipFile(file_name, "w") as file:
            for test_case in name_list:
                file.write(f"{test_case_dir}/{test_case}", test_case)
        response = StreamingHttpResponse(FileWrapper(open(file_name, "rb")),
                                         content_type="application/octet-stream")

        response["Content-Disposition"] = f"attachment; filename=problem_{problem.id}_test_cases.zip"
        response["Content-Length"] = os.path.getsize(file_name)
        return response
Example #11
0
    def post(self, request):
        data = request.data
        try:
            contest = Contest.objects.get(id=data.pop("contest_id"))
            ensure_created_by(contest, request.user)
        except Contest.DoesNotExist:
            return self.error("Contest does not exist")

        if data["rule_type"] != contest.rule_type:
            return self.error("Invalid rule type")

        _id = data["_id"]
        if not _id:
            return self.error("Display ID is required")

        if Problem.objects.filter(_id=_id, contest=contest).exists():
            return self.error("Duplicate Display id")

        error_info = self.common_checks(request)
        if error_info:
            return self.error(error_info)

        # todo check filename and score info
        data["contest"] = contest
        tags = data.pop("tags")
        data["created_by"] = request.user
        problem = Problem.objects.create(**data)

        for item in tags:
            try:
                tag = ProblemTag.objects.get(name=item)
            except ProblemTag.DoesNotExist:
                tag = ProblemTag.objects.create(name=item)
            problem.tags.add(tag)
        return self.success(ProblemAdminSerializer(problem).data)
Example #12
0
    def put(self, request):
        data = request.data
        try:
            contest = Contest.objects.get(id=data.pop("id"))
            ensure_created_by(contest, request.user)
        except Contest.DoesNotExist:
            return self.error("Соревнование не существует")
        data["start_time"] = dateutil.parser.parse(data["start_time"])
        data["end_time"] = dateutil.parser.parse(data["end_time"])
        if data["end_time"] <= data["start_time"]:
            return self.error(
                "Время начала должно быть раньше времени окончания")
        if not data["password"]:
            data["password"] = None
        for ip_range in data["allowed_ip_ranges"]:
            try:
                ip_network(ip_range, strict=False)
            except ValueError as e:
                return self.error(f"{ip_range} не подходит для cidr сети")
        if not contest.real_time_rank and data.get("real_time_rank"):
            cache_key = f"{CacheKey.contest_rank_cache}:{contest.id}"
            cache.delete(cache_key)

        for k, v in data.items():
            setattr(contest, k, v)
        contest.save()
        return self.success(ContestAdminSerializer(contest).data)
Example #13
0
    def get(self, request):
        problem_id = request.GET.get("problem_id")
        if not problem_id:
            return self.error("Parameter error, problem_id is required")
        try:
            problem = Problem.objects.get(id=problem_id)
        except Problem.DoesNotExist:
            return self.error("Problem does not exists")

        if problem.contest:
            ensure_created_by(problem.contest, request.user)
        else:
            ensure_created_by(problem, request.user)

        test_case_dir = os.path.join(settings.TEST_CASE_DIR, problem.test_case_id)
        if not os.path.isdir(test_case_dir):
            return self.error("Test case does not exists")
        name_list = self.filter_name_list(os.listdir(test_case_dir), problem.spj)
        name_list.append("info")
        file_name = os.path.join(test_case_dir, problem.test_case_id + ".zip")
        with zipfile.ZipFile(file_name, "w") as file:
            for test_case in name_list:
                file.write(f"{test_case_dir}/{test_case}", test_case)
        response = StreamingHttpResponse(FileWrapper(open(file_name, "rb")),
                                         content_type="application/octet-stream")

        response["Content-Disposition"] = f"attachment; filename=problem_{problem.id}_test_cases.zip"
        response["Content-Length"] = os.path.getsize(file_name)
        return response
Example #14
0
    def get(self, request):
        """
        Get one contest_announcement or contest_announcement list.
        """
        contest_announcement_id = request.GET.get("id")
        if contest_announcement_id:
            try:
                contest_announcement = ContestAnnouncement.objects.get(
                    id=contest_announcement_id)
                ensure_created_by(contest_announcement, request.user)
                return self.success(
                    ContestAnnouncementSerializer(contest_announcement).data)
            except ContestAnnouncement.DoesNotExist:
                return self.error("Анонс соревнования не сущестует")

        contest_id = request.GET.get("contest_id")
        if not contest_id:
            return self.error("Ошибка параметра")
        contest_announcements = ContestAnnouncement.objects.filter(
            contest_id=contest_id)
        if request.user.is_admin():
            contest_announcements = contest_announcements.filter(
                created_by=request.user)
        keyword = request.GET.get("keyword")
        if keyword:
            contest_announcements = contest_announcements.filter(
                title__contains=keyword)
        return self.success(
            ContestAnnouncementSerializer(contest_announcements,
                                          many=True).data)
Example #15
0
    def get(self, request):
        problem_id = request.GET.get("id")
        rule_type = request.GET.get("rule_type")
        user = request.user
        if problem_id:
            try:
                problem = Problem.objects.get(id=problem_id)
                ensure_created_by(problem, request.user)
                return self.success(ProblemAdminSerializer(problem).data)
            except Problem.DoesNotExist:
                return self.error("Problem does not exist")

        problems = Problem.objects.filter(
            contest_id__isnull=True).order_by("-create_time")
        if rule_type:
            if rule_type not in ProblemRuleType.choices():
                return self.error("Invalid rule_type")
            else:
                problems = problems.filter(rule_type=rule_type)

        keyword = request.GET.get("keyword", "").strip()
        if keyword:
            problems = problems.filter(
                Q(title__icontains=keyword) | Q(_id__icontains=keyword))
        if not user.can_mgmt_all_problem():
            problems = problems.filter(created_by=user)
        return self.success(
            self.paginate_data(request, problems, ProblemAdminSerializer))
Example #16
0
    def get(self, request):
        """
        Get one contest_announcement or contest_announcement list.
        """
        contest_announcement_id = request.GET.get("id")
        if contest_announcement_id:
            try:
                contest_announcement = ContestAnnouncement.objects.get(
                    id=contest_announcement_id)
                ensure_created_by(contest_announcement, request.user)
                return self.success(
                    ContestAnnouncementSerializer(contest_announcement).data)
            except ContestAnnouncement.DoesNotExist:
                return self.error("Contest announcement does not exist")

        contest_id = request.GET.get("contest_id")
        if not contest_id:
            return self.error("Parameter error")
        contest_announcements = ContestAnnouncement.objects.filter(
            contest_id=contest_id)
        if request.user.is_admin():
            contest_announcements = contest_announcements.filter(
                created_by=request.user)
        keyword = request.GET.get("keyword")
        if keyword:
            contest_announcements = contest_announcements.filter(
                title__contains=keyword)
        return self.success(
            ContestAnnouncementSerializer(contest_announcements,
                                          many=True).data)
Example #17
0
    def put(self, request):
        data = request.data
        course_id = data.pop("id")

        # 查询课程存不存在
        try:
            course = Course.objects.get(id=course_id)
            ensure_created_by(course, request.user)
        except Problem.DoesNotExist:
            return self.error("课程不存在")

        # 查询problems存不存在
        try:
            data, on_class_problems, after_class_problems = self.get_problems(
                data)
        except CustomError as e:
            raise e

        # put操作,更新这节课的信息
        for k, v in data.items():
            setattr(course, k, v)
        course.save()

        # 更新课堂题目
        course.on_class_problems.remove(*course.on_class_problems.all())
        for problem in on_class_problems:
            course.on_class_problems.add(problem)
        # 更新课后习题
        course.after_class_problems.remove(*course.after_class_problems.all())
        for problem in after_class_problems:
            course.after_class_problems.add(problem)

        return self.success()
Example #18
0
    def put(self, request):
        data = request.data
        try:
            contest = Contest.objects.get(id=data.pop("id"))
            ensure_created_by(contest, request.user)
        except Contest.DoesNotExist:
            return self.error("Contest does not exist")
        data["start_time"] = dateutil.parser.parse(data["start_time"])
        data["end_time"] = dateutil.parser.parse(data["end_time"])
        if data["end_time"] <= data["start_time"]:
            return self.error("Start time must occur earlier than end time")
        if not data["password"]:
            data["password"] = None
        for ip_range in data["allowed_ip_ranges"]:
            try:
                ip_network(ip_range, strict=False)
            except ValueError as e:
                return self.error(f"{ip_range} is not a valid cidr network")
        if not contest.real_time_rank and data.get("real_time_rank"):
            cache_key = f"{CacheKey.contest_rank_cache}:{contest.id}"
            cache.delete(cache_key)

        for k, v in data.items():
            setattr(contest, k, v)
        contest.save()
        return self.success(ContestAdminSerializer(contest).data)
Example #19
0
    def put(self, request):
        data = request.data
        try:
            contest = Contest.objects.get(id=data.pop("id"))
            ensure_created_by(contest, request.user)
        except Contest.DoesNotExist:
            return self.error("Contest does not exist")
        data["start_time"] = dateutil.parser.parse(data["start_time"])
        data["end_time"] = dateutil.parser.parse(data["end_time"])
        if data["end_time"] <= data["start_time"]:
            return self.error("Start time must occur earlier than end time")
        if not data["password"]:
            data["password"] = None
        for ip_range in data["allowed_ip_ranges"]:
            try:
                ip_network(ip_range, strict=False)
            except ValueError:
                return self.error(f"{ip_range} is not a valid cidr network")
        if not contest.real_time_rank and data.get("real_time_rank"):
            cache_key = f"{CacheKey.contest_rank_cache}:{contest.id}"
            cache.delete(cache_key)

        for k, v in data.items():
            setattr(contest, k, v)
        contest.save()
        return self.success(ContestAdminSerializer(contest).data)
Example #20
0
    def get(self, request):
        problem_id = request.GET.get("id")
        contest_id = request.GET.get("contest_id")
        user = request.user
        if problem_id:
            try:
                problem = Problem.objects.get(id=problem_id)
                ensure_created_by(problem.contest, user)
            except Problem.DoesNotExist:
                return self.error("Problem does not exist")
            return self.success(ProblemAdminSerializer(problem).data)

        if not contest_id:
            return self.error("Contest id is required")
        try:
            contest = Contest.objects.get(id=contest_id)
            ensure_created_by(contest, user)
        except Contest.DoesNotExist:
            return self.error("Contest does not exist")
        problems = Problem.objects.filter(contest=contest).order_by("-create_time")
        if user.is_admin():
            problems = problems.filter(contest__created_by=user)
        keyword = request.GET.get("keyword")
        if keyword:
            problems = problems.filter(title__contains=keyword)
        return self.success(self.paginate_data(request, problems, ProblemAdminSerializer))
Example #21
0
 def delete(self, request):
     course_id = request.GET.get("id")
     if not course_id:
         return self.error("缺少id号")
     try:
         course = Course.objects.get(id=course_id)
     except Course.DoesNotExist:
         return self.error("问题不存在")
     ensure_created_by(course, request.user)
     course.delete()
     return self.success()
Example #22
0
    def put(self, request):
        data = request.data
        user = request.user
        print(data)

        try:
            contest = Contest.objects.get(id=data.pop("contest_id"))
            ensure_created_by(contest, user)
        except Contest.DoesNotExist:
            return self.error("Contest does not exist")

        if data["rule_type"] != contest.rule_type:
            return self.error("Invalid rule type")

        try:
            temp = int(data["_id"])
        except Exception as e:
            return self.error("DispalyID must be integer")

        problem_id = data.pop("id")

        try:
            problem = Problem.objects.get(id=problem_id, contest=contest)
        except Problem.DoesNotExist:
            return self.error("Problem does not exist")

        _id = data["_id"]
        is_drag = data["is_drag"]  # add
        if not _id:
            return self.error("Display ID is required")
        if Problem.objects.exclude(id=problem_id).filter(_id=_id, contest=contest).exists() and is_drag is False:
            return self.error("Display ID already exists")

        error_info = self.common_checks(request)
        if error_info:
            return self.error(error_info)
        # todo check filename and score info
        tags = data.pop("tags")
        data["languages"] = list(data["languages"])

        for k, v in data.items():
            setattr(problem, k, v)
        problem.save()

        problem.tags.remove(*problem.tags.all())
        for tag in tags:
            try:
                tag = ProblemTag.objects.get(name=tag)
            except ProblemTag.DoesNotExist:
                tag = ProblemTag.objects.create(name=tag)
            problem.tags.add(tag)
        return self.success()
Example #23
0
 def put(self, request):
     """
     update contest_announcement
     """
     data = request.data
     try:
         contest_announcement = ContestAnnouncement.objects.get(id=data.pop("id"))
         ensure_created_by(contest_announcement, request.user)
     except ContestAnnouncement.DoesNotExist:
         return self.error("Contest announcement does not exist")
     for k, v in data.items():
         setattr(contest_announcement, k, v)
     contest_announcement.save()
     return self.success()
Example #24
0
 def delete(self, request):
     id = request.GET.get("id")
     if not id:
         return self.error("Invalid parameter, id is required")
     try:
         problem = Problem.objects.get(id=id, contest_id__isnull=True)
     except Problem.DoesNotExist:
         return self.error("Problem does not exists")
     ensure_created_by(problem, request.user)
     d = os.path.join(settings.TEST_CASE_DIR, problem.test_case_id)
     if os.path.isdir(d):
         shutil.rmtree(d, ignore_errors=True)
     problem.delete()
     return self.success()
Example #25
0
 def post(self, request):
     """
     Create one contest_announcement.
     """
     data = request.data
     try:
         contest = Contest.objects.get(id=data.pop("contest_id"))
         ensure_created_by(contest, request.user)
         data["contest"] = contest
         data["created_by"] = request.user
     except Contest.DoesNotExist:
         return self.error("Contest does not exist")
     announcement = ContestAnnouncement.objects.create(**data)
     return self.success(ContestAnnouncementSerializer(announcement).data)
Example #26
0
 def post(self, request):
     """
     Create one contest_announcement.
     """
     data = request.data
     try:
         contest = Contest.objects.get(id=data.pop("contest_id"))
         ensure_created_by(contest, request.user)
         data["contest"] = contest
         data["created_by"] = request.user
     except Contest.DoesNotExist:
         return self.error("Contest does not exist")
     announcement = ContestAnnouncement.objects.create(**data)
     return self.success(ContestAnnouncementSerializer(announcement).data)
Example #27
0
 def put(self, request):
     """
     update contest_announcement
     """
     data = request.data
     try:
         contest_announcement = ContestAnnouncement.objects.get(id=data.pop("id"))
         ensure_created_by(contest_announcement, request.user)
     except ContestAnnouncement.DoesNotExist:
         return self.error("Contest announcement does not exist")
     for k, v in data.items():
         setattr(contest_announcement, k, v)
     contest_announcement.save()
     return self.success()
Example #28
0
 def post(self, request):
     """
     创建一个比赛的通知,这个是要在现有比赛的基础之上创建的
     解析传入的数据创建比赛通知,然后返回比赛通知序列化的数据
     """
     data = request.data
     try:
         # 获得比赛的ID和确保比赛是有该用户创建的
         contest = Contest.objects.get(id=data.pop("contest_id"))
         ensure_created_by(contest, request.user)
         data["contest"] = contest
         data["created_by"] = request.user
     except Contest.DoesNotExist:
         return self.error("Contest does not exist")
     announcement = ContestAnnouncement.objects.create(**data)
     return self.success(ContestAnnouncementSerializer(announcement).data)
Example #29
0
 def delete(self, request):
     id = request.GET.get("id")
     if not id:
         return self.error("Invalid parameter, id is required")
     try:
         problem = Problem.objects.get(id=id, contest_id__isnull=False)
     except Problem.DoesNotExist:
         return self.error("Problem does not exists")
     ensure_created_by(problem.contest, request.user)
     if Submission.objects.filter(problem=problem).exists():
         return self.error("Can't delete the problem as it has submissions")
     d = os.path.join(settings.TEST_CASE_DIR, problem.test_case_id)
     if os.path.isdir(d):
         shutil.rmtree(d, ignore_errors=True)
     problem.delete()
     return self.success()
Example #30
0
 def get(self, request):
     problems = Problem.objects.filter(id__in=request.data["problem_id"])
     for problem in problems:
         if problem.contest:
             ensure_created_by(problem.contest, request.user)
         else:
             ensure_created_by(problem, request.user)
     path = f"/tmp/{rand_str()}.zip"
     with zipfile.ZipFile(path, "w") as zip_file:
         for index, problem in enumerate(problems):
             self.process_one_problem(zip_file=zip_file, user=request.user, problem=problem, index=index + 1)
     delete_files.apply_async((path,), countdown=300)
     resp = FileResponse(open(path, "rb"))
     resp["Content-Type"] = "application/zip"
     resp["Content-Disposition"] = f"attachment;filename=problem-export.zip"
     return resp
Example #31
0
 def delete(self, request):
     id = request.GET.get("id")
     if not id:
         return self.error("Invalid parameter, id is required")
     try:
         problem = Problem.objects.get(id=id, contest_id__isnull=False)
     except Problem.DoesNotExist:
         return self.error("Problem does not exists")
     ensure_created_by(problem.contest, request.user)
     if Submission.objects.filter(problem=problem).exists():
         return self.error("Can't delete the problem as it has submissions")
     # d = os.path.join(settings.TEST_CASE_DIR, problem.test_case_id)
     # if os.path.isdir(d):
     #    shutil.rmtree(d, ignore_errors=True)
     problem.delete()
     return self.success()
Example #32
0
 def get(self, request):
     problems = Problem.objects.filter(id__in=request.data["problem_id"])
     for problem in problems:
         if problem.contest:
             ensure_created_by(problem.contest, request.user)
         else:
             ensure_created_by(problem, request.user)
     path = f"/tmp/{rand_str()}.zip"
     with zipfile.ZipFile(path, "w") as zip_file:
         for index, problem in enumerate(problems):
             self.process_one_problem(zip_file=zip_file, user=request.user, problem=problem, index=index + 1)
     delete_files.send_with_options(args=(path,), delay=300_000)
     resp = FileResponse(open(path, "rb"))
     resp["Content-Type"] = "application/zip"
     resp["Content-Disposition"] = f"attachment;filename=problem-export.zip"
     return resp
Example #33
0
    def get(self, request):
        contest_id = request.GET.get("contest_id")
        if not contest_id:
            return self.error("Parameter error")
        try:
            contest = Contest.objects.get(id=contest_id)
            ensure_created_by(contest, request.user)
        except Contest.DoesNotExist:
            return self.error("Contest does not exist")

        exclude_admin = request.GET.get("exclude_admin") == "1"
        zip_path = self._dump_submissions(contest, exclude_admin)
        delete_files.apply_async((zip_path,), countdown=300)
        resp = FileResponse(open(zip_path, "rb"))
        resp["Content-Type"] = "application/zip"
        resp["Content-Disposition"] = f"attachment;filename={os.path.basename(zip_path)}"
        return resp
Example #34
0
 def delete(self, request):
     id = request.GET.get("id")
     if not id:
         return self.error("Неверный параметр требуется id")
     try:
         problem = Problem.objects.get(id=id, contest_id__isnull=False)
     except Problem.DoesNotExist:
         return self.error("Задачи не существует")
     ensure_created_by(problem.contest, request.user)
     if Submission.objects.filter(problem=problem).exists():
         [submission.delete() for submission in Submission.objects.filter(problem=problem)]
         # return self.error("Can't delete the problem as it has submissions")
     d = os.path.join(settings.TEST_CASE_DIR, problem.test_case_id)
     if os.path.isdir(d):
         shutil.rmtree(d, ignore_errors=True)
     problem.delete()
     return self.success()
Example #35
0
    def get(self, request):
        contest_id = request.GET.get("contest_id")
        if not contest_id:
            return self.error("Parameter error")
        try:
            contest = Contest.objects.get(id=contest_id)
            ensure_created_by(contest, request.user)
        except Contest.DoesNotExist:
            return self.error("Contest does not exist")

        exclude_admin = request.GET.get("exclude_admin") == "1"
        zip_path = self._dump_submissions(contest, exclude_admin)
        delete_files.send_with_options(args=(zip_path,), delay=300_000)
        resp = FileResponse(open(zip_path, "rb"))
        resp["Content-Type"] = "application/zip"
        resp["Content-Disposition"] = f"attachment;filename={os.path.basename(zip_path)}"
        return resp
Example #36
0
    def put(self, request):
        data = request.data
        user = request.user

        try:
            contest = Contest.objects.get(id=data.pop("contest_id"))
            ensure_created_by(contest, user)
        except Contest.DoesNotExist:
            return self.error("Contest does not exist")

        if data["rule_type"] != contest.rule_type:
            return self.error("Invalid rule type")

        problem_id = data.pop("id")

        try:
            problem = Problem.objects.get(id=problem_id, contest=contest)
        except Problem.DoesNotExist:
            return self.error("Problem does not exist")

        _id = data["_id"]
        if not _id:
            return self.error("Display ID is required")
        if Problem.objects.exclude(id=problem_id).filter(_id=_id, contest=contest).exists():
            return self.error("Display ID already exists")

        error_info = self.common_checks(request)
        if error_info:
            return self.error(error_info)
        # todo check filename and score info
        tags = data.pop("tags")
        data["languages"] = list(data["languages"])

        for k, v in data.items():
            setattr(problem, k, v)
        problem.save()

        problem.tags.remove(*problem.tags.all())
        for tag in tags:
            try:
                tag = ProblemTag.objects.get(name=tag)
            except ProblemTag.DoesNotExist:
                tag = ProblemTag.objects.create(name=tag)
            problem.tags.add(tag)
        return self.success()
Example #37
0
    def put(self, request):
        data = request.data
        user = request.user

        try:
            contest = Contest.objects.get(id=data.pop("contest_id"))
            ensure_created_by(contest, user)
        except Contest.DoesNotExist:
            return self.error("Соревнование не существует")

        if data["rule_type"] != contest.rule_type:
            return self.error("Invalid rule type")

        problem_id = data.pop("id")

        try:
            problem = Problem.objects.get(id=problem_id, contest=contest)
        except Problem.DoesNotExist:
            return self.error("Задачи не существует")

        _id = data["_id"]
        if not _id:
            return self.error("Необходим отображаемый ID")
        if Problem.objects.exclude(id=problem_id).filter(_id=_id, contest=contest).exists():
            return self.error("Display ID already exists")

        error_info = self.common_checks(request)
        if error_info:
            return self.error(error_info)
        # todo check filename and score info
        tags = data.pop("tags")
        data["languages"] = list(data["languages"])

        for k, v in data.items():
            setattr(problem, k, v)
        problem.save()

        problem.tags.remove(*problem.tags.all())
        for tag in tags:
            try:
                tag = ProblemTag.objects.get(name=tag)
            except ProblemTag.DoesNotExist:
                tag = ProblemTag.objects.create(name=tag)
            problem.tags.add(tag)
        return self.success()
Example #38
0
    def get(self, request):
        contest_id = request.GET.get("id")
        if contest_id:
            try:
                contest = Contest.objects.get(id=contest_id)
                ensure_created_by(contest, request.user)
                return self.success(ContestAdminSerializer(contest).data)
            except Contest.DoesNotExist:
                return self.error("Contest does not exist")

        contests = Contest.objects.all().order_by("-create_time")
        if request.user.is_admin():
            contests = contests.filter(created_by=request.user)

        keyword = request.GET.get("keyword")
        if keyword:
            contests = contests.filter(title__contains=keyword)
        return self.success(self.paginate_data(request, contests, ContestAdminSerializer))
Example #39
0
    def get(self, request):
        contest_id = request.GET.get("contest_id")
        if not contest_id:
            return self.error("Параметрическая ошибка")
        try:
            contest = Contest.objects.get(id=contest_id)
            ensure_created_by(contest, request.user)
        except Contest.DoesNotExist:
            return self.error("Соревнование не существует")

        exclude_admin = request.GET.get("exclude_admin") == "1"
        zip_path = self._dump_submissions(contest, exclude_admin)
        delete_files.apply_async((zip_path, ), countdown=300)
        resp = FileResponse(open(zip_path, "rb"))
        resp["Content-Type"] = "application/zip"
        resp[
            "Content-Disposition"] = f"attachment;filename={os.path.basename(zip_path)}"
        return resp
Example #40
0
    def get(self, request):
        contest_id = request.GET.get("id")
        if contest_id:
            try:
                contest = Contest.objects.get(id=contest_id)
                ensure_created_by(contest, request.user)
                return self.success(ContestAdminSerializer(contest).data)
            except Contest.DoesNotExist:
                return self.error("Contest does not exist")

        contests = Contest.objects.all().order_by("-create_time")
        if request.user.is_admin():
            contests = contests.filter(created_by=request.user)

        keyword = request.GET.get("keyword")
        if keyword:
            contests = contests.filter(title__contains=keyword)
        return self.success(self.paginate_data(request, contests, ContestAdminSerializer))
Example #41
0
 def get(self, request):
     course_id = request.GET.get("id")
     user = request.user
     # 编辑这节课的页面
     if course_id:
         try:
             course = Course.objects.get(id=course_id)
             ensure_created_by(course, user)
             return self.success(CourseAdminSerializer(course).data)
         except Course.DoesNotExist:
             return self.error("课程不存在")
     # 课程列表页面
     # 从数据库取出所有课程
     courses = Course.objects.order_by("-create_time")
     # 根据权限筛选
     #        if not user.can_mgmt_all_course():
     #            courses = courses.filter(created_by=user)
     return self.success(CourseAdminSerializer(courses, many=True).data)
Example #42
0
    def put(self, request):
        # 修改题目
        # 接收数据同时获取该题目的ID
        data = request.data
        problem_id = data.pop("id")

        # 根据id查找题目,没有找到就返回不存在错误信息
        try:
            problem = Problem.objects.get(id=problem_id)
            ensure_created_by(problem, request.user)
        except Problem.DoesNotExist:
            return self.error("Problem does not exist")

        _id = data["_id"]
        if not _id:
            return self.error("Display ID is required")
        # 刚刚创建一个problem,有一个显示_id, 使用exclude,先排除一下这个问题,
        # 从而判定数据库里面是否存在这个显示_id,有就返回报错信息
        if Problem.objects.exclude(id=problem_id).filter(_id=_id, contest_id__isnull=True).exists():
            return self.error("Display ID already exists")

        # 一般新错误检测,有就返回错误信息
        error_info = self.common_checks(request)
        if error_info:
            return self.error(error_info)
        # todo check filename and score info
        tags = data.pop("tags")
        data["languages"] = list(data["languages"])

        # 键值使用for更新并保存到数据库
        for k, v in data.items():
            setattr(problem, k, v)
        problem.save()

        # 先将该问题的标签清空,更新数据库同时在将标签附加到问题
        problem.tags.remove(*problem.tags.all())
        for tag in tags:
            try:
                tag = ProblemTag.objects.get(name=tag)
            except ProblemTag.DoesNotExist:
                tag = ProblemTag.objects.create(name=tag)
            problem.tags.add(tag)

        return self.success()
Example #43
0
    def get(self, request):
        """
        Get one contest_announcement or contest_announcement list.
        """
        contest_announcement_id = request.GET.get("id")
        if contest_announcement_id:
            try:
                contest_announcement = ContestAnnouncement.objects.get(id=contest_announcement_id)
                ensure_created_by(contest_announcement, request.user)
                return self.success(ContestAnnouncementSerializer(contest_announcement).data)
            except ContestAnnouncement.DoesNotExist:
                return self.error("Contest announcement does not exist")

        contest_id = request.GET.get("contest_id")
        if not contest_id:
            return self.error("Parameter error")
        contest_announcements = ContestAnnouncement.objects.filter(contest_id=contest_id)
        if request.user.is_admin():
            contest_announcements = contest_announcements.filter(created_by=request.user)
        keyword = request.GET.get("keyword")
        if keyword:
            contest_announcements = contest_announcements.filter(title__contains=keyword)
        return self.success(ContestAnnouncementSerializer(contest_announcements, many=True).data)