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