def user_index_page(request, username): try: user = User.objects.get(username=username) except User.DoesNotExist: return error_page(request, u"用户不存在") blog_link = "" if user.userprofile.blog: blog_link = user.userprofile.blog.replace("http://", "").replace("https://", "") messages = Message.objects.filter(leave_to=user).order_by("-created_time") page = request.GET.get('page', 1) try: page = int(page) except: return error_page(request, u"不存在的页码") current_page, previous_page, next_page, page_range, error, one_page = do_pages(messages, 5, page) if error: return error_page(request, u"不存在的页码") return render(request, "oj/account/user_index.html", {"user": user, "blog_link": blog_link, "messages": current_page, "previous_page": previous_page, "next_page": next_page, "page_range": page_range, "one_page": one_page})
def discussion_page(request, problem_id): """ 题目讨论区 """ try: problem = Problem.objects.get(id=problem_id, visible=True) except Problem.DoesNotExist: return error_page(request, u"题目不存在") problem_discussion_list = ProblemDiscussion.objects.filter( problem=problem).order_by("-created_time") page = request.GET.get('page', 1) try: page = int(page) except: return error_page(request, u"不存在的页码") current_page, previous_page, next_page, page_range, error, one_page = do_pages( problem_discussion_list, 10, page) if error: return error_page(request, u"不存在的页码") return render( request, "oj/problem/problem_discussion_list.html", { "problem_discussion_list": current_page, "problem": problem, "previous_page": previous_page, "next_page": next_page, "page_range": page_range, "one_page": one_page })
def problem_list_page(request, page=1): """ 前台的问题列表 """ # 正常情况 problems = Problem.objects.filter(visible=True) # 搜索的情况 keyword = request.GET.get("keyword", "").strip() if keyword: problems = problems.filter( Q(title__contains=keyword) | Q(description__contains=keyword)) difficulty_order = request.GET.get("order_by", None) if difficulty_order: if difficulty_order[0] == "-": problems = problems.order_by("-difficulty") difficulty_order = "difficulty" else: problems = problems.order_by("difficulty") difficulty_order = "-difficulty" else: difficulty_order = "difficulty" # 按照标签筛选 tag_text = request.GET.get("tag", None) if tag_text: try: tag = ProblemTag.objects.get(name=tag_text) except ProblemTag.DoesNotExist: return error_page(request, u"标签不存在") problems = tag.problem_set.all().filter(visible=True) try: page = int(page) except: return error_page(request, u"不存在的页码") current_page, previous_page, next_page, page_range, error, one_page = do_pages( problems, 40, page) if error: return error_page(request, u"不存在的页码") # 右侧标签列表 按照关联的题目的数量排序 排除题目数量为0的 tags = ProblemTag.objects.annotate(problem_number=Count("problem")).filter( problem_number__gt=0).order_by("-problem_number") return render( request, "oj/problem/problem_list.html", { "problems": current_page, "page": int(page), "previous_page": previous_page, "next_page": next_page, "keyword": keyword, "tag": tag_text, "tags": tags, "difficulty_order": difficulty_order, "page_range": page_range, "one_page": one_page })
def user_rank_page(request, page=1): ranks = UserProfile.objects.filter(submission_number__gt=0).order_by("-accepted_problem_number", "submission_number") try: page = int(page) except: return error_page(request, u"不存在的页码") current_page, previous_page, next_page, page_range, error, one_page = do_pages(ranks, 20, page) if error: return error_page(request, u"不存在的页码") return render(request, "utils/rank.html", {"ranks": current_page, "page": page, "previous_page": previous_page, "next_page": next_page, "start_id": int(page) * 20 - 20, "page_range": page_range, "one_page": one_page})
def contest_list_page(request, page=1): """ 所有比赛的列表页 """ # 正常情况 contests = Contest.objects.filter(visible=True).order_by("-create_time") # 搜索的情况 keyword = request.GET.get("keyword", "").strip() if keyword: contests = contests.filter( Q(title__contains=keyword) | Q(description__contains=keyword)) # 筛选我能参加的比赛 join = request.GET.get("join", None) if request.user.is_authenticated() and join: contests = contests.filter(Q(contest_type__in=[1, 2]) | Q(groups__in=request.user.group_set.all())). \ filter(end_time__gt=datetime.datetime.now(), start_time__lt=datetime.datetime.now()) try: page = int(page) except: return error_page(request, u"不存在的页码") current_page, previous_page, next_page, page_range, error, one_page = do_pages( contests, 10, page) if error: return error_page(request, u"不存在的页码") return render( request, "oj/contest/contest_list.html", { "contests": current_page, "page": int(page), "previous_page": previous_page, "next_page": next_page, "keyword": keyword, "join": join, "page_range": page_range, "one_page": one_page, "start_id": page * 10 - 10 })
def submission_list_page(request, page=1): """ 所有提交的列表页 """ submission_filter = {"my": None, "user_id": None} # 是否显示所有人的提交 show_all = True # url中如果存在user_id参数,说明只显示这个人的提交,忽略其他参数 user_id = request.GET.get("user_id", None) if user_id and request.user.admin_type == SUPER_ADMIN: submission_filter["user_id"] = user_id submissions = Submission.objects.filter(user_id=user_id, contest_id__isnull=True) else: try: show_all = settings.SHOW_ALL_SUBMISSIONS_LIST except Exception: pass # url中my=true可以只显示自己的 if request.GET.get("my", None) == "true": submission_filter["my"] = "true" show_all = False if show_all: submissions = Submission.objects.filter(contest_id__isnull=True) else: submissions = Submission.objects.filter(user_id=request.user.id, contest_id__isnull=True) submissions = submissions.values("id", "user_id", "problem_id", "result", "create_time", "accepted_answer_time", "language").order_by("-create_time") language = request.GET.get("language", None) if language: submissions = submissions.filter(language=int(language)) submission_filter["language"] = language result = request.GET.get("result", None) if result: submissions = submissions.filter(result=int(result)) submission_filter["result"] = result try: page = int(page) except: return error_page(request, u"不存在的页码") submissions, previous_page, next_page, page_range, error, one_page = do_pages( submissions, 20, page) if error: return error_page(request, u"不存在的页码") # 因为提交页面经常会有重复的题目和用户,缓存一下查询结果 cache_result = {"problem": {}, "user": {}} for item in submissions: problem_id = item["problem_id"] if problem_id not in cache_result["problem"]: problem = Problem.objects.get(id=problem_id) cache_result["problem"][problem_id] = problem.title item["title"] = cache_result["problem"][problem_id] user_id = item["user_id"] if user_id not in cache_result["user"]: user = User.objects.get(id=user_id) cache_result["user"][user_id] = user item["user"] = cache_result["user"][user_id] if item["user_id"] == request.user.id or request.user.admin_type == SUPER_ADMIN: item["show_link"] = True else: item["show_link"] = False return render( request, "oj/submission/submissions_list.html", { "submissions": submissions, "page": int(page), "previous_page": previous_page, "next_page": next_page, "start_id": int(page) * 20 - 20, "query": build_query_string(submission_filter), "submission_filter": submission_filter, "show_all": show_all, "page_range": page_range, "one_page": one_page })
def group_list_page(request, page=1): groups = Group.objects.filter(visible=True, join_group_setting__lte=2) # 搜索的情况 keyword = request.GET.get("keyword", None) if keyword: groups = groups.filter( Q(name__contains=keyword) | Q(description__contains=keyword)) join = request.GET.get("join", None) if join: groups = groups.filter(join_group_setting=int(join)) # 写的巨臭的状态筛选,等待更新 for group in groups: try: AdminGroupRelation.objects.get(group=group, user=request.user) group.is_joined = 2 except: try: UserGroupRelation.objects.get(group=group, user=request.user) group.is_joined = 1 except: if JoinGroupRequest.objects.filter(group=group, user=request.user): group.is_joined = 3 else: group.is_joined = 0 status = request.GET.get('status', None) if status: for group in groups: if group.is_joined != int(status) - 1: groups = groups.exclude(pk=group.id) for group in groups: try: AdminGroupRelation.objects.get(group=group, user=request.user) group.is_joined = 2 except: try: UserGroupRelation.objects.get(group=group, user=request.user) group.is_joined = 1 except: if JoinGroupRequest.objects.filter(group=group, user=request.user): group.is_joined = 3 else: group.is_joined = 0 # end 等待更新 try: page = int(page) except: return error_page(request, u"不存在的页码") current_page, previous_page, next_page, page_range, error, one_page = do_pages( groups, 20, page) if error: return error_page(request, u"不存在的页码") return render( request, "oj/group/group_list.html", { "groups": current_page, "contests": current_page, "page": int(page), "previous_page": previous_page, "next_page": next_page, "keyword": keyword, "page_range": page_range, "one_page": one_page, "join": join, "status": status })