mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2025-11-04 14:49:58 +08:00
增加了题目列表页
This commit is contained in:
parent
489bbb841a
commit
d031f14a68
@ -40,8 +40,8 @@ urlpatterns = [
|
|||||||
url(r'^api/announcements/$', AnnouncementAPIView.as_view(), name="announcement_list_api"),
|
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"),
|
url(r'^admin/contest/$', TemplateView.as_view(template_name="admin/contest/add_contest.html"),
|
||||||
name="add_contest_page"),
|
name="add_contest_page"),
|
||||||
url(r'^problems/$', TemplateView.as_view(template_name="oj/problem/problem_list.html"),
|
url(r'^problems/$', "problem.views.problem_list_page", name="problem_list_page"),
|
||||||
name="problem_list_page"),
|
url(r'^problems/(?P<page>\d+)/$', "problem.views.problem_list_page", name="problem_list_page"),
|
||||||
url(r'^admin/template/(?P<template_dir>\w+)/(?P<template_name>\w+).html$', AdminTemplateView.as_view(),
|
url(r'^admin/template/(?P<template_dir>\w+)/(?P<template_name>\w+).html$', AdminTemplateView.as_view(),
|
||||||
name="admin_template"),
|
name="admin_template"),
|
||||||
url(r'^api/admin/group/$', GroupAdminAPIView.as_view(), name="group_admin_api"),
|
url(r'^api/admin/group/$', GroupAdminAPIView.as_view(), name="group_admin_api"),
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import json
|
|||||||
|
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
|
from django.core.paginator import Paginator
|
||||||
|
|
||||||
from rest_framework.views import APIView
|
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",
|
file_info["test_cases"][str(i + 1)] = {"input_name": str(i + 1) + ".in",
|
||||||
"output_name": str(i + 1) + ".out",
|
"output_name": str(i + 1) + ".out",
|
||||||
"output_md5": md5.hexdigest(),
|
"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))
|
open(test_case_dir + "info", "w").write(json.dumps(file_info))
|
||||||
|
|
||||||
@ -216,4 +218,28 @@ class TestCaseUploadAPIView(APIView):
|
|||||||
"file_list": {"input": l[0::2],
|
"file_list": {"input": l[0::2],
|
||||||
"output": l[1::2]}})
|
"output": l[1::2]}})
|
||||||
else:
|
else:
|
||||||
return error_response(u"测试用例压缩文件格式错误,请保证测试用例文件在根目录下直接压缩")
|
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})
|
||||||
|
|||||||
@ -1,11 +1,17 @@
|
|||||||
{% extends "oj_base.html" %}
|
{% extends "oj_base.html" %}
|
||||||
{% block body %}
|
{% block body %}
|
||||||
|
{% load problem %}
|
||||||
<div class="container main" ms-controller="problem_list">
|
<div class="container main" ms-controller="problem_list">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-9">
|
<div class="col-lg-9">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-3 col-lg-offset-9">
|
<div style="float: right;">
|
||||||
<input type="text" class="form-control" placeholder="搜索题号,标题">
|
<form class="form-inline" onsubmit="return false;">
|
||||||
|
<div class="form-group-sm">
|
||||||
|
<input name="keyWord" class="form-control" placeholder="请输入关键词" ms-duplex="key_word">
|
||||||
|
<input type="submit" value="搜索" class="btn btn-primary" ms-click="getPage(1)">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
@ -19,28 +25,31 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
{% for item in problems %}
|
||||||
<th scope="row"><a href="/problem/1/">1</a></th>
|
<tr>
|
||||||
<td><a href="/problem/1/">Mark</a></td>
|
<th scope="row"><a href="/problem/{{ item.id }}/">{{ item.id }}</a></th>
|
||||||
<td>Otto</td>
|
<td><a href="/problem/1/">{{ item.title }}</a></td>
|
||||||
<td>@mdo</td>
|
<td>{{ item.difficulty }}</td>
|
||||||
</tr>
|
<td>{{ item|accepted_radio }}</td>
|
||||||
<tr>
|
</tr>
|
||||||
<th scope="row">2</th>
|
{% endfor %}
|
||||||
<td>Jacob</td>
|
|
||||||
<td>Thornton</td>
|
|
||||||
<td>@fat</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row">3</th>
|
|
||||||
<td>Larry</td>
|
|
||||||
<td>the Bird</td>
|
|
||||||
<td>@twitter</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<nav>
|
||||||
|
<ul class="pager">
|
||||||
|
{% if previous_page %}
|
||||||
|
<li class="previous"><a href="/problems/{{ previous_page }}/"><span
|
||||||
|
aria-hidden="true">←</span> 上一页</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if next_page %}
|
||||||
|
<li class="next"><a href="/problems/{{ next_page }}/">下一页 <span
|
||||||
|
aria-hidden="true">→</span></a></li>
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-lg-3">
|
<div class="col-lg-3">
|
||||||
<div class="panel panel-info">
|
<div class="panel panel-info">
|
||||||
<div class="panel-heading">
|
<div class="panel-heading">
|
||||||
@ -87,5 +96,5 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block js_block %}
|
{% block js_block %}
|
||||||
<script src="/static/js/app/oj/problem/problem_list.js"></script>
|
<script src="/static/js/app/oj/problem/problem_list.js"></script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
14
utils/templatetags/problem.py
Normal file
14
utils/templatetags/problem.py
Normal file
@ -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)
|
||||||
Loading…
Reference in New Issue
Block a user