diff --git a/contest/views.py b/contest/views.py index d00bee5a..0f0cf708 100644 --- a/contest/views.py +++ b/contest/views.py @@ -1,15 +1,18 @@ # coding=utf-8 import json +import datetime from django.shortcuts import render from django.db import IntegrityError from django.utils import dateparse from django.db.models import Q +from django.core.paginator import Paginator from rest_framework.views import APIView from utils.shortcuts import (serializer_invalid_response, error_response, success_response, paginate, rand_str, error_page) from account.models import REGULAR_USER, ADMIN, SUPER_ADMIN from group.models import Group +from announcement.models import Announcement from .models import Contest, ContestProblem from .serializers import (CreateContestSerializer, ContestSerializer, EditContestSerializer, @@ -17,7 +20,11 @@ from .serializers import (CreateContestSerializer, ContestSerializer, EditContes def contest_page(request, contest_id): - pass + try: + contest = Contest.objects.get(id=contest_id, visible=True) + except Contest.DoesNotExist: + return error_page(request, u"比赛不存在") + return render(request, "oj/contest/problems.html", {"contest": contest}) class ContestAdminAPIView(APIView): @@ -220,4 +227,42 @@ class ContestProblemAdminAPIView(APIView): contest_problem = contest_problem.filter(Q(title__contains=keyword) | Q(description__contains=keyword)) - return paginate(request, contest_problem, ContestProblemSerializer) \ No newline at end of file + return paginate(request, contest_problem, ContestProblemSerializer) + + +def contest_list_page(request, page=1): + # 正常情况 + contests = Contest.objects.filter(visible=True) + + # 搜索的情况 + keyword = request.GET.get("keyword", None) + if keyword: + contests = contests.filter(title__contains=keyword) + + paginator = Paginator(contests, 20) + try: + current_page = paginator.page(int(page)) + except Exception: + return error_page(request, u"不存在的页码") + + previous_page = next_page = None + + try: + previous_page = current_page.previous_page_number() + except Exception: + pass + + try: + next_page = current_page.next_page_number() + except Exception: + pass + + # 右侧的公告列表 + announcements = Announcement.objects.filter(is_global=True, visible=True).order_by("-create_time") + # 系统当前时间 + now = datetime.datetime.now() + return render(request, "oj/contest/contest_list.html", + {"problems": current_page, "page": int(page), + "previous_page": previous_page, "next_page": next_page, + "keyword": keyword, "announcements": announcements, + "now": now}) diff --git a/oj/urls.py b/oj/urls.py index 6dc76064..106b9663 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -40,12 +40,15 @@ urlpatterns = [ url(r'^api/admin/contest/$', ContestAdminAPIView.as_view(), name="contest_admin_api"), url(r'^api/admin/user/$', UserAdminAPIView.as_view(), name="user_admin_api"), url(r'^problem/(?P\d+)/$', "problem.views.problem_page", name="problem_page"), + url(r'^contest/(?P\d+)/$', "contest.views.contest_page", name="contest_page"), url(r'^announcement/(?P\d+)/$', "announcement.views.announcement_page", name="announcement_page"), url(r'^admin/contest/$', TemplateView.as_view(template_name="admin/contest/add_contest.html"), name="add_contest_page"), url(r'^problems/$', "problem.views.problem_list_page", name="problem_list_page"), url(r'^problems/(?P\d+)/$', "problem.views.problem_list_page", name="problem_list_page"), + url(r'^contests/$', "contest.views.contest_list_page", name="contest_list_page"), + url(r'^contests/(?P\d+)/$', "contest.views.contest_list_page", name="contest_list_page"), url(r'^admin/template/(?P\w+)/(?P\w+).html$', AdminTemplateView.as_view(), name="admin_template"), url(r'^api/admin/group/$', GroupAdminAPIView.as_view(), name="group_admin_api"), diff --git a/template/oj/contest/contest_list.html b/template/oj/contest/contest_list.html new file mode 100644 index 00000000..3233a6e4 --- /dev/null +++ b/template/oj/contest/contest_list.html @@ -0,0 +1,106 @@ +{% extends "oj_base.html" %} +{% block body %} + {% load problem %} +
+
+
+
+
+
+
+ + +
+
+
+
+
+ + + + + + + + + + + + + + {% for item in contests %} + + + + + + {% ifequal item.mode 0 %} + + {% endifequal %} + {% ifequal item.mode 1 %} + + {% endifequal %} + {% ifequal item.mode 2 %} + + {% endifequal %} + + {% ifequal item.contest_type 0 %} + + {% endifequal %} + {% ifequal item.contest_type 1 %} + + {% endifequal %} + {% ifequal item.contest_type 2 %} + + {% endifequal %} + + {% if now < item_start_time %} + + {% elif item.start_time <= now and now <= item_end_time %} + + {% else %} + + {% endif %} + + {% endfor %} + +
#比赛名称开始时间比赛模式比赛类型状态
{{ item.id }}{{ item.title }}{{ item.start_time }}acm模式AC数量模式AC总分排名模式小组赛公开赛公开赛(密码保护)比赛还未开始比赛正在进行比赛已结束
+ +
+
+ +
+
+
+

+ + 公告 +

+
+ {% for item in announcements %} + {{ forloop.counter }}.  {{ item.title }} +
+ {% endfor %} +
+
+
+
+
+{% endblock %} + +{% block js_block %} + +{% endblock %} \ No newline at end of file