diff --git a/oj/urls.py b/oj/urls.py index b0ca69f5..909d6bb0 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -40,8 +40,8 @@ urlpatterns = [ url(r'^api/announcements/$', AnnouncementAPIView.as_view(), name="announcement_list_api"), url(r'^admin/contest/$', TemplateView.as_view(template_name="admin/contest/add_contest.html"), name="add_contest_page"), - url(r'^problems/$', TemplateView.as_view(template_name="oj/problem/problem_list.html"), - name="problem_list_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'^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/problem/views.py b/problem/views.py index 4d13d44e..0730502a 100644 --- a/problem/views.py +++ b/problem/views.py @@ -7,6 +7,7 @@ import json from django.shortcuts import render from django.db.models import Q +from django.core.paginator import Paginator from rest_framework.views import APIView @@ -208,7 +209,8 @@ class TestCaseUploadAPIView(APIView): file_info["test_cases"][str(i + 1)] = {"input_name": str(i + 1) + ".in", "output_name": str(i + 1) + ".out", "output_md5": md5.hexdigest(), - "output_size": os.path.getsize(test_case_dir + str(i + 1) + ".out")} + "output_size": os.path.getsize( + test_case_dir + str(i + 1) + ".out")} # 写入配置文件 open(test_case_dir + "info", "w").write(json.dumps(file_info)) @@ -216,4 +218,28 @@ class TestCaseUploadAPIView(APIView): "file_list": {"input": l[0::2], "output": l[1::2]}}) else: - return error_response(u"测试用例压缩文件格式错误,请保证测试用例文件在根目录下直接压缩") \ No newline at end of file + return error_response(u"测试用例压缩文件格式错误,请保证测试用例文件在根目录下直接压缩") + + +def problem_list_page(request, page=1): + problems = Problem.objects.all() + paginator = Paginator(problems, 20) + try: + current_page = paginator.page(int(page)) + except Exception: + return error_response(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 + + return render(request, "oj/problem/problem_list.html", {"problems": current_page, "page": int(page), + "previous_page": previous_page, "next_page": next_page}) diff --git a/template/oj/problem/problem_list.html b/template/oj/problem/problem_list.html index 4dcd5f1f..85712129 100644 --- a/template/oj/problem/problem_list.html +++ b/template/oj/problem/problem_list.html @@ -1,11 +1,17 @@ {% extends "oj_base.html" %} {% block body %} + {% load problem %}
-
- +
+
+
+ + +
+
@@ -19,28 +25,31 @@ - - 1 - Mark - Otto - @mdo - - - 2 - Jacob - Thornton - @fat - - - 3 - Larry - the Bird - @twitter - + {% for item in problems %} + + {{ item.id }} + {{ item.title }} + {{ item.difficulty }} + {{ item|accepted_radio }} + + {% endfor %} +
+
@@ -87,5 +96,5 @@ {% endblock %} {% block js_block %} - + {% endblock %} \ No newline at end of file diff --git a/utils/templatetags/problem.py b/utils/templatetags/problem.py new file mode 100644 index 00000000..70550f43 --- /dev/null +++ b/utils/templatetags/problem.py @@ -0,0 +1,14 @@ +# coding=utf-8 + + +def get_problem_accepted_radio(problem): + if problem.total_accepted_number: + return int((problem.total_accepted_number * 100) / problem.total_submit_number) + return 0 + + +from django import template + + +register = template.Library() +register.filter("accepted_radio", get_problem_accepted_radio)