From 4d701e0239628fbd587b5456ab8602942d50c251 Mon Sep 17 00:00:00 2001 From: hohoTT <609029365@qq.com> Date: Sun, 23 Aug 2015 18:25:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=89=8D=E5=8F=B0=E6=AF=94?= =?UTF-8?q?=E8=B5=9B=E9=A2=98=E7=9B=AE=E5=88=97=E8=A1=A8=E4=B8=8E=E5=8D=95?= =?UTF-8?q?=E4=B8=AA=E9=A2=98=E7=9B=AE=E7=9A=84=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest/views.py | 34 +++++- oj/urls.py | 11 ++ submission/views.py | 17 +++ template/oj/contest/contest_problem.html | 100 ++++++++++++++++++ .../oj/contest/contest_problems_list.html | 64 +++++++++++ template/oj/contest/my_submissions_list.html | 52 +++++++++ template/oj/problem/problem_list.html | 2 +- utils/templatetags/problem.py | 8 +- 8 files changed, 280 insertions(+), 8 deletions(-) create mode 100644 template/oj/contest/contest_problem.html create mode 100644 template/oj/contest/contest_problems_list.html create mode 100644 template/oj/contest/my_submissions_list.html diff --git a/contest/views.py b/contest/views.py index fd816f63..924b0eb7 100644 --- a/contest/views.py +++ b/contest/views.py @@ -263,6 +263,31 @@ def contest_page(request, contest_id): return render(request, "oj/contest/contest_index.html", {"contest": contest}) +def contest_problem_page(request, contest_id, contest_problem_id): + try: + Contest.objects.get(id=contest_id) + except Contest.DoesNotExist: + return error_page(request, u"比赛不存在") + try: + contest_problem = ContestProblem.objects.get(id=contest_problem_id, visible=True) + except ContestProblem.DoesNotExist: + return error_page(request, u"比赛题目不存在") + return render(request, "oj/contest/contest_problem.html", {"contest_problem": contest_problem, + "samples": json.loads(contest_problem.samples)}) + + +@check_user_contest_permission +def contest_problems_list_page(request, contest_id): + try: + contest_problems = ContestProblem.objects.filter(contest=Contest.objects.get(id=contest_id)).order_by("sort_index") + except Contest.DoesNotExist: + return error_page(request, u"比赛题目不存在") + # 右侧的公告列表 + announcements = Announcement.objects.filter(is_global=True, visible=True).order_by("-create_time") + return render(request, "oj/contest/contest_problems_list.html", {"contest_problems": contest_problems, + "announcements": announcements}) + + def contest_list_page(request, page=1): # 正常情况 contests = Contest.objects.filter(visible=True) @@ -298,10 +323,13 @@ def contest_list_page(request, page=1): # 右侧的公告列表 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", {"contests": current_page, "page": int(page), "previous_page": previous_page, "next_page": next_page, "keyword": keyword, "announcements": announcements, - "join": join, "now": now}) \ No newline at end of file + "join": join}) + + + + diff --git a/oj/urls.py b/oj/urls.py index 08b0c938..805e9ec6 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -40,7 +40,14 @@ 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'^problem/(?P\d+)/$', "problem.views.problem_page", name="problem_page"), + + url(r'^contest/(?P\d+)/problem/(?P\d+)/$', "contest.views.contest_problem_page", + name="contest_problem_page"), + url(r'^contest/(?P\d+)/$', "contest.views.contest_page", name="contest_page"), + url(r'^contest/(?P\d+)/problems/$', "contest.views.contest_problems_list_page", + name="contest_problems_list_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"), @@ -60,6 +67,10 @@ urlpatterns = [ url(r'^api/admin/tag/$', ProblemTagAdminAPIView.as_view(), name="problem_tag_admin_api"), url(r'^problem/(?P\d+)/my_submissions/$', "submission.views.problem_my_submissions_list_page", name="problem_my_submissions_page"), + + url(r'^contest/(?P\d+)/problem/(?P\d+)/my_submissions/$', + "submission.views.contest_problem_my_submissions_list_page", name="contest_problem_my_submissions_list_page"), + url(r'^my_submission/(?P\w+)/$', "submission.views.my_submission", name="my_submission_page"), url(r'^api/admin/join_group_request/$', JoinGroupRequestAdminAPIView.as_view(), diff --git a/submission/views.py b/submission/views.py index ab8fb712..026b6198 100644 --- a/submission/views.py +++ b/submission/views.py @@ -12,6 +12,7 @@ from judge.judger_controller.settings import redis_config from account.decorators import login_required from account.models import SUPER_ADMIN from problem.models import Problem +from contest.models import Contest, ContestProblem from utils.shortcuts import serializer_invalid_response, error_response, success_response, error_page, paginate from .models import Submission from .serializers import CreateSubmissionSerializer, SubmissionSerializer @@ -79,6 +80,22 @@ def problem_my_submissions_list_page(request, problem_id): {"submissions": submissions, "problem": problem}) +@login_required +def contest_problem_my_submissions_list_page(request, contest_id, contest_problem_id): + try: + Contest.objects.get(id=contest_id) + except Contest.DoesNotExist: + return error_page(request, u"比赛不存在") + try: + contest_problem = ContestProblem.objects.get(id=contest_problem_id, visible=True) + except Problem.DoesNotExist: + return error_page(request, u"比赛问题不存在") + submissions = Submission.objects.filter(user_id=request.user.id, problem_id=contest_problem.id).order_by("-create_time"). \ + values("id", "result", "create_time", "accepted_answer_time", "language") + return render(request, "oj/contest/my_submissions_list.html", + {"submissions": submissions, "contest_problem": contest_problem}) + + @login_required def my_submission(request, submission_id): try: diff --git a/template/oj/contest/contest_problem.html b/template/oj/contest/contest_problem.html new file mode 100644 index 00000000..69991adb --- /dev/null +++ b/template/oj/contest/contest_problem.html @@ -0,0 +1,100 @@ + +{% extends 'oj_base.html' %} + +{% block body %} +
+ +

{{ contest_problem.title }}

+ +

发布时间 : {{ contest_problem.create_time }}   + 时间限制 : {{ contest_problem.time_limit }}ms   + 内存限制 : {{ contest_problem.memory_limit }}M +

+ +
+
+ + +

{{ contest_problem.description|safe }}

+
+
+ + +

{{ contest_problem.input_description }}

+
+
+ + +

{{ contest_problem.output_description }}k

+
+ {% for item in samples %} +
+ +
+{{ item.input }}
+ +
+
+ + +
+{{ item.output }}
+
+ {% endfor %} + {% if problem.hint %} +
+ + +

{{ contest_problem.hint|safe }}

+
+ {% endif %} + {% if contest_problem.hint %} +
+ + +

{{ contest_problem.hint|safe }}

+
+ {% endif %} + +
+ + +
+ + + +
+
+ +
+ + +
+
+
+ + + +
+ +
+
+
+
+
+{% endblock %} +{% block js_block %} + +{% endblock %} \ No newline at end of file diff --git a/template/oj/contest/contest_problems_list.html b/template/oj/contest/contest_problems_list.html new file mode 100644 index 00000000..543135dd --- /dev/null +++ b/template/oj/contest/contest_problems_list.html @@ -0,0 +1,64 @@ +{% extends "oj_base.html" %} +{% block body %} + {% load problem %} +
+
+
+
+
+
+
+ + +
+
+
+
+
+ + + + + + + + + + + {% for item in contest_problems %} + + + + + + + {% endfor %} + +
#题目通过率
{{ item.sort_index }}{{ item.title }}{{ item|accepted_radio }}
+ +
+
+ +
+ {% include "oj/announcement/_announcement_panel.html" %} +
+
+
+{% endblock %} + +{% block js_block %} + +{% endblock %} \ No newline at end of file diff --git a/template/oj/contest/my_submissions_list.html b/template/oj/contest/my_submissions_list.html new file mode 100644 index 00000000..dc4f5f53 --- /dev/null +++ b/template/oj/contest/my_submissions_list.html @@ -0,0 +1,52 @@ +{% extends 'oj_base.html' %} + +{% block body %} + + {% load submission %} +
+ +

{{ contest_problem.title }}

+ +

发布时间: {{ contest_problem.create_time }}   + 时间限制: {{ contest_problem.time_limit }}ms   + 内存限制: {{ contest_problem.memory_limit }}M

+ + + + + + + + + + + + {% for item in submissions %} + + + + + + + + {% endfor %} + + +
#提交时间结果运行时间语言
{{ forloop.counter }}{{ item.create_time }}{{ item.result|translate_result }} + {% if item.accepted_answer_time %} + {{ item.accepted_answer_time }}ms + {% else %} + -- + {% endif %} + + {{ item.language|translate_language }} +
+
+{% endblock %} \ No newline at end of file diff --git a/template/oj/problem/problem_list.html b/template/oj/problem/problem_list.html index 21833a77..6c106e9a 100644 --- a/template/oj/problem/problem_list.html +++ b/template/oj/problem/problem_list.html @@ -32,7 +32,7 @@ {{ item.id }} {{ item.title }} {{ item.difficulty }} - {{ item|accepted_radio }}% + {{ item|accepted_radio }} {% endfor %} diff --git a/utils/templatetags/problem.py b/utils/templatetags/problem.py index 70550f43..78ee4ea1 100644 --- a/utils/templatetags/problem.py +++ b/utils/templatetags/problem.py @@ -2,13 +2,13 @@ def get_problem_accepted_radio(problem): - if problem.total_accepted_number: - return int((problem.total_accepted_number * 100) / problem.total_submit_number) - return 0 + if problem.total_submit_number: + return str(int((problem.total_accepted_number * 100) / problem.total_submit_number)) \ + + "% (" + str(problem.total_accepted_number) + "/" + str(problem.total_submit_number) + ")" + return "0%" from django import template - register = template.Library() register.filter("accepted_radio", get_problem_accepted_radio)