From 1746fe7184346d3fb3fceed709f4dbc72bc6f9a5 Mon Sep 17 00:00:00 2001
From: virusdefender <1670873886@qq.com>
Date: Tue, 25 Aug 2015 15:45:56 +0800
Subject: [PATCH 3/6] =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E5=AE=8C=E6=88=90?=
=?UTF-8?q?=E6=AF=94=E8=B5=9B=E6=8E=92=E5=90=8D=E7=9A=84=E5=8A=9F=E8=83=BD?=
=?UTF-8?q?=E5=92=8C=E9=A1=B5=E9=9D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
contest/views.py | 33 ++++++-------------------
mq/scripts/info.py | 3 +++
template/oj/contest/contest_rank.html | 35 ++++++++++++++++++++++++---
utils/templatetags/submission.py | 22 ++++++++++++++++-
4 files changed, 64 insertions(+), 29 deletions(-)
diff --git a/contest/views.py b/contest/views.py
index 92cbd785..67201933 100644
--- a/contest/views.py
+++ b/contest/views.py
@@ -300,7 +300,7 @@ def contest_problem_page(request, contest_id, contest_problem_id):
contest_problem = ContestProblem.objects.get(id=contest_problem_id, visible=True)
except ContestProblem.DoesNotExist:
return error_page(request, u"比赛题目不存在")
- warning = u"您已经提交过本题的正确答案!"
+ warning = u"您已经提交过本题的正确答案,重复提交可能造成时间累计。"
show_warning = False
try:
submission = ContestSubmission.objects.get(user=request.user, contest=contest, problem=contest_problem)
@@ -394,39 +394,22 @@ def _cmp(x, y):
@check_user_contest_permission
def contest_rank_page(request, contest_id):
+ contest = Contest.objects.get(id=contest_id)
+ contest_problems = ContestProblem.objects.filter(contest=contest).order_by("sort_index")
result = ContestSubmission.objects.values("user_id").annotate(total_submit=Count("user_id"))
for i in range(0, len(result)):
# 这个人所有的提交
submissions = ContestSubmission.objects.filter(user_id=result[i]["user_id"])
+ result[i]["submissions"] = {}
+ for item in submissions:
+ result[i]["submissions"][item.problem_id] = item
result[i]["total_ac"] = submissions.filter(ac=True).count()
result[i]["user"] = User.objects.get(id=result[i]["user_id"])
- result[i]["submissions"] = submissions.order_by("problem__sort_index")
result[i]["total_time"] = submissions.filter(ac=True).aggregate(total_time=Sum("total_time"))["total_time"]
- print result
- return render(request, "oj/contest/contest_rank.html")
- #
- #
- # return
- # contest = Contest.objects.get(id=contest_id)
- # contest_submissions = ContestSubmission.objects.filter(contest=contest)
- # result = {}
- # # 先把数据按照用户id 为 key 整理一下
- # # {1: {"submissions": [], "total_time": 0, "total_ac": 0}}
- # for item in contest_submissions:
- # if item.user.id not in contest_submissions:
- # result[item.user.id] = {"user": {"id": item.user.id, "username": item.user.username,
- # "real_name": item.user.real_name},
- # "submissions": [], "total_time": 0, "total_ac": 0}
- # result[item.user.id]["submissions"].append(ContestSubmissionSerializer(item).data)
- # if item.ac:
- # result[item.user.id]["total_time"] += item.total_time
- # result[item.user.id]["total_ac"] += 1
- # l = []
- # for k, v in result.iteritems():
- # l.append(v)
- # print sorted(l, cmp=_cmp, reverse=True)
+ return render(request, "oj/contest/contest_rank.html",
+ {"contest": contest, "contest_problems": contest_problems, "result": sorted(result, cmp=_cmp, reverse=True)})
diff --git a/mq/scripts/info.py b/mq/scripts/info.py
index 661c3ff6..6634b5b3 100644
--- a/mq/scripts/info.py
+++ b/mq/scripts/info.py
@@ -61,9 +61,12 @@ class MessageQueue(object):
logger.debug(contest.start_time)
logger.debug(submission.create_time)
logger.debug((submission.create_time - contest.start_time).total_seconds())
+ logger.debug(int((submission.create_time - contest.start_time).total_seconds() / 60))
contest_submission.total_time += int((submission.create_time - contest.start_time).total_seconds() / 60)
# 标记为已经通过
contest_submission.ac = True
+ # 提交次数加1
+ contest_submission.total_submission_number += 1
# contest problem ac 计数器加1
contest_problem.total_accepted_number += 1
else:
diff --git a/template/oj/contest/contest_rank.html b/template/oj/contest/contest_rank.html
index 89d1e409..823b021b 100644
--- a/template/oj/contest/contest_rank.html
+++ b/template/oj/contest/contest_rank.html
@@ -1,10 +1,10 @@
{% extends "oj_base.html" %}
{% block body %}
- {% load contest %}
+ {% load submission %}
+
+
+
+ # |
+ 用户名 |
+ AC / 总提交 |
+ 用时 + 罚时 |
+ {% for item in contest_problems %}
+ {{ item.sort_index }}
+ |
+ {% endfor %}
+
+
+
+ {% for item in result %}
+
+ {{ forloop.counter }} |
+ {{ item.user.username }} |
+ {{ item.total_ac }} / {{ item.total_submit }} |
+ {% if item.total_time %}{{ item.total_time }} min{% else %}--{% endif %} |
+ {% for problem in contest_problems %}
+
+ {% submission_problem problem item.submissions %}
+ |
+ {% endfor %}
+
+ {% endfor %}
+
+
diff --git a/utils/templatetags/submission.py b/utils/templatetags/submission.py
index a80c25e6..b1f43d2d 100644
--- a/utils/templatetags/submission.py
+++ b/utils/templatetags/submission.py
@@ -29,7 +29,27 @@ def translate_result_class(value):
return "danger"
+def get_contest_submission_problem_detail(contest_problem, my_submission):
+ if contest_problem.id in my_submission:
+ submission = my_submission[contest_problem.id]
+ if submission.ac:
+ return u"\n 时间: " + str(submission.total_time) + u" min"
+ return ""
+
+
+def get_submission_problem_result_class(contest_problem, my_submission):
+ if contest_problem.id in my_submission:
+ submission = my_submission[contest_problem.id]
+ if submission.ac:
+ return "success"
+ else:
+ return "danger"
+ else:
+ return ""
+
register = template.Library()
register.filter("translate_result", translate_result)
register.filter("translate_language", translate_language)
-register.filter("translate_result_class", translate_result_class)
\ No newline at end of file
+register.filter("translate_result_class", translate_result_class)
+register.simple_tag(get_contest_submission_problem_detail, name="submission_problem")
+register.simple_tag(get_submission_problem_result_class, name="submission_problem_result_class")
\ No newline at end of file
From 89c42dac8544021a345b80e4b9cc761d3b835253 Mon Sep 17 00:00:00 2001
From: virusdefender <1670873886@qq.com>
Date: Tue, 25 Aug 2015 16:11:04 +0800
Subject: [PATCH 4/6] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20fis-conf?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 5 ++++-
static/release/fis-conf.js | 3 +++
2 files changed, 7 insertions(+), 1 deletion(-)
create mode 100644 static/release/fis-conf.js
diff --git a/.gitignore b/.gitignore
index 73adda50..285cfd82 100644
--- a/.gitignore
+++ b/.gitignore
@@ -55,6 +55,9 @@ db.db
db.sqlite3
.DS_Store
log/
-release/
+static/release/css
+static/release/js
+static/release/img
+build.txt
tmp/
test_case/
\ No newline at end of file
diff --git a/static/release/fis-conf.js b/static/release/fis-conf.js
new file mode 100644
index 00000000..ce128cdd
--- /dev/null
+++ b/static/release/fis-conf.js
@@ -0,0 +1,3 @@
+/**
+ * Created by virusdefender on 8/25/15.
+ */
From f5bca2428bd22a63b51a9ca9be082d756fb45900 Mon Sep 17 00:00:00 2001
From: virusdefender <1670873886@qq.com>
Date: Tue, 25 Aug 2015 16:18:24 +0800
Subject: [PATCH 5/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=BA=90=E7=A0=81?=
=?UTF-8?q?=E6=A8=A1=E6=9D=BF=E8=B7=AF=E5=BE=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
admin/views.py | 2 +-
oj/settings.py | 4 ++--
template/{ => src}/404.html | 0
template/{ => src}/500.html | 0
template/{ => src}/admin/admin.html | 0
template/{ => src}/admin/announcement/announcement.html | 0
template/{ => src}/admin/contest/add_contest.html | 0
template/{ => src}/admin/contest/contest_list.html | 0
template/{ => src}/admin/contest/edit_problem.html | 0
template/{ => src}/admin/group/group.html | 0
template/{ => src}/admin/group/group_detail.html | 0
template/{ => src}/admin/group/join_group_request_list.html | 0
template/{ => src}/admin/index/index.html | 0
template/{ => src}/admin/monitor/monitor.html | 0
template/{ => src}/admin/problem/add_problem.html | 0
template/{ => src}/admin/problem/edit_problem.html | 0
template/{ => src}/admin/problem/problem_list.html | 0
template/{ => src}/admin/problem/submission_list.html | 0
template/{ => src}/admin/user/user_list.html | 0
template/{ => src}/oj/account/change_password.html | 0
template/{ => src}/oj/account/login.html | 0
template/{ => src}/oj/account/register.html | 0
template/{ => src}/oj/account/reset_password.html | 0
template/{ => src}/oj/announcement/_announcement_panel.html | 0
template/{ => src}/oj/announcement/announcement.html | 0
template/{ => src}/oj/contest/_contest_header.html | 0
template/{ => src}/oj/contest/contest_index.html | 0
template/{ => src}/oj/contest/contest_list.html | 0
template/{ => src}/oj/contest/contest_problem.html | 0
template/{ => src}/oj/contest/contest_problems_list.html | 0
template/{ => src}/oj/contest/contest_rank.html | 0
template/{ => src}/oj/contest/my_submission.html | 0
template/{ => src}/oj/contest/my_submissions_list.html | 0
template/{ => src}/oj/contest/no_contest_permission.html | 0
template/{ => src}/oj/contest/submissions_list.html | 0
template/{ => src}/oj/index.html | 0
template/{ => src}/oj/problem/_problem_header.html | 0
template/{ => src}/oj/problem/my_submission.html | 0
template/{ => src}/oj/problem/my_submissions_list.html | 0
template/{ => src}/oj/problem/problem.html | 0
template/{ => src}/oj/problem/problem_list.html | 0
template/{ => src}/oj/submission/my_submissions_list.html | 0
template/{ => src}/oj_base.html | 0
template/{ => src}/utils/error.html | 0
44 files changed, 3 insertions(+), 3 deletions(-)
rename template/{ => src}/404.html (100%)
rename template/{ => src}/500.html (100%)
rename template/{ => src}/admin/admin.html (100%)
rename template/{ => src}/admin/announcement/announcement.html (100%)
rename template/{ => src}/admin/contest/add_contest.html (100%)
rename template/{ => src}/admin/contest/contest_list.html (100%)
rename template/{ => src}/admin/contest/edit_problem.html (100%)
rename template/{ => src}/admin/group/group.html (100%)
rename template/{ => src}/admin/group/group_detail.html (100%)
rename template/{ => src}/admin/group/join_group_request_list.html (100%)
rename template/{ => src}/admin/index/index.html (100%)
rename template/{ => src}/admin/monitor/monitor.html (100%)
rename template/{ => src}/admin/problem/add_problem.html (100%)
rename template/{ => src}/admin/problem/edit_problem.html (100%)
rename template/{ => src}/admin/problem/problem_list.html (100%)
rename template/{ => src}/admin/problem/submission_list.html (100%)
rename template/{ => src}/admin/user/user_list.html (100%)
rename template/{ => src}/oj/account/change_password.html (100%)
rename template/{ => src}/oj/account/login.html (100%)
rename template/{ => src}/oj/account/register.html (100%)
rename template/{ => src}/oj/account/reset_password.html (100%)
rename template/{ => src}/oj/announcement/_announcement_panel.html (100%)
rename template/{ => src}/oj/announcement/announcement.html (100%)
rename template/{ => src}/oj/contest/_contest_header.html (100%)
rename template/{ => src}/oj/contest/contest_index.html (100%)
rename template/{ => src}/oj/contest/contest_list.html (100%)
rename template/{ => src}/oj/contest/contest_problem.html (100%)
rename template/{ => src}/oj/contest/contest_problems_list.html (100%)
rename template/{ => src}/oj/contest/contest_rank.html (100%)
rename template/{ => src}/oj/contest/my_submission.html (100%)
rename template/{ => src}/oj/contest/my_submissions_list.html (100%)
rename template/{ => src}/oj/contest/no_contest_permission.html (100%)
rename template/{ => src}/oj/contest/submissions_list.html (100%)
rename template/{ => src}/oj/index.html (100%)
rename template/{ => src}/oj/problem/_problem_header.html (100%)
rename template/{ => src}/oj/problem/my_submission.html (100%)
rename template/{ => src}/oj/problem/my_submissions_list.html (100%)
rename template/{ => src}/oj/problem/problem.html (100%)
rename template/{ => src}/oj/problem/problem_list.html (100%)
rename template/{ => src}/oj/submission/my_submissions_list.html (100%)
rename template/{ => src}/oj_base.html (100%)
rename template/{ => src}/utils/error.html (100%)
diff --git a/admin/views.py b/admin/views.py
index b37d22d1..f8bc0c5d 100644
--- a/admin/views.py
+++ b/admin/views.py
@@ -7,7 +7,7 @@ from rest_framework.views import APIView
class AdminTemplateView(APIView):
def get(self, request, template_dir, template_name):
- path = settings.TEMPLATE_DIRS[0] + "/admin/" + template_dir + "/" + template_name + ".html"
+ path = settings.TEMPLATES[0]["DIRS"][0] + "/admin/" + template_dir + "/" + template_name + ".html"
try:
return HttpResponse(open(path).read(), content_type="text/html")
except IOError:
diff --git a/oj/settings.py b/oj/settings.py
index c3883ae0..cf4dafcf 100644
--- a/oj/settings.py
+++ b/oj/settings.py
@@ -78,7 +78,7 @@ ROOT_URLCONF = 'oj.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
- 'DIRS': [os.path.join(BASE_DIR, 'template')],
+ 'DIRS': [os.path.join(BASE_DIR, 'template/src')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
@@ -116,7 +116,7 @@ STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, "static/src/"),)
TEMPLATE_DIRS = (
- os.path.join(BASE_DIR, "template"),
+ os.path.join(BASE_DIR, "template/src"),
)
AUTH_USER_MODEL = 'account.User'
diff --git a/template/404.html b/template/src/404.html
similarity index 100%
rename from template/404.html
rename to template/src/404.html
diff --git a/template/500.html b/template/src/500.html
similarity index 100%
rename from template/500.html
rename to template/src/500.html
diff --git a/template/admin/admin.html b/template/src/admin/admin.html
similarity index 100%
rename from template/admin/admin.html
rename to template/src/admin/admin.html
diff --git a/template/admin/announcement/announcement.html b/template/src/admin/announcement/announcement.html
similarity index 100%
rename from template/admin/announcement/announcement.html
rename to template/src/admin/announcement/announcement.html
diff --git a/template/admin/contest/add_contest.html b/template/src/admin/contest/add_contest.html
similarity index 100%
rename from template/admin/contest/add_contest.html
rename to template/src/admin/contest/add_contest.html
diff --git a/template/admin/contest/contest_list.html b/template/src/admin/contest/contest_list.html
similarity index 100%
rename from template/admin/contest/contest_list.html
rename to template/src/admin/contest/contest_list.html
diff --git a/template/admin/contest/edit_problem.html b/template/src/admin/contest/edit_problem.html
similarity index 100%
rename from template/admin/contest/edit_problem.html
rename to template/src/admin/contest/edit_problem.html
diff --git a/template/admin/group/group.html b/template/src/admin/group/group.html
similarity index 100%
rename from template/admin/group/group.html
rename to template/src/admin/group/group.html
diff --git a/template/admin/group/group_detail.html b/template/src/admin/group/group_detail.html
similarity index 100%
rename from template/admin/group/group_detail.html
rename to template/src/admin/group/group_detail.html
diff --git a/template/admin/group/join_group_request_list.html b/template/src/admin/group/join_group_request_list.html
similarity index 100%
rename from template/admin/group/join_group_request_list.html
rename to template/src/admin/group/join_group_request_list.html
diff --git a/template/admin/index/index.html b/template/src/admin/index/index.html
similarity index 100%
rename from template/admin/index/index.html
rename to template/src/admin/index/index.html
diff --git a/template/admin/monitor/monitor.html b/template/src/admin/monitor/monitor.html
similarity index 100%
rename from template/admin/monitor/monitor.html
rename to template/src/admin/monitor/monitor.html
diff --git a/template/admin/problem/add_problem.html b/template/src/admin/problem/add_problem.html
similarity index 100%
rename from template/admin/problem/add_problem.html
rename to template/src/admin/problem/add_problem.html
diff --git a/template/admin/problem/edit_problem.html b/template/src/admin/problem/edit_problem.html
similarity index 100%
rename from template/admin/problem/edit_problem.html
rename to template/src/admin/problem/edit_problem.html
diff --git a/template/admin/problem/problem_list.html b/template/src/admin/problem/problem_list.html
similarity index 100%
rename from template/admin/problem/problem_list.html
rename to template/src/admin/problem/problem_list.html
diff --git a/template/admin/problem/submission_list.html b/template/src/admin/problem/submission_list.html
similarity index 100%
rename from template/admin/problem/submission_list.html
rename to template/src/admin/problem/submission_list.html
diff --git a/template/admin/user/user_list.html b/template/src/admin/user/user_list.html
similarity index 100%
rename from template/admin/user/user_list.html
rename to template/src/admin/user/user_list.html
diff --git a/template/oj/account/change_password.html b/template/src/oj/account/change_password.html
similarity index 100%
rename from template/oj/account/change_password.html
rename to template/src/oj/account/change_password.html
diff --git a/template/oj/account/login.html b/template/src/oj/account/login.html
similarity index 100%
rename from template/oj/account/login.html
rename to template/src/oj/account/login.html
diff --git a/template/oj/account/register.html b/template/src/oj/account/register.html
similarity index 100%
rename from template/oj/account/register.html
rename to template/src/oj/account/register.html
diff --git a/template/oj/account/reset_password.html b/template/src/oj/account/reset_password.html
similarity index 100%
rename from template/oj/account/reset_password.html
rename to template/src/oj/account/reset_password.html
diff --git a/template/oj/announcement/_announcement_panel.html b/template/src/oj/announcement/_announcement_panel.html
similarity index 100%
rename from template/oj/announcement/_announcement_panel.html
rename to template/src/oj/announcement/_announcement_panel.html
diff --git a/template/oj/announcement/announcement.html b/template/src/oj/announcement/announcement.html
similarity index 100%
rename from template/oj/announcement/announcement.html
rename to template/src/oj/announcement/announcement.html
diff --git a/template/oj/contest/_contest_header.html b/template/src/oj/contest/_contest_header.html
similarity index 100%
rename from template/oj/contest/_contest_header.html
rename to template/src/oj/contest/_contest_header.html
diff --git a/template/oj/contest/contest_index.html b/template/src/oj/contest/contest_index.html
similarity index 100%
rename from template/oj/contest/contest_index.html
rename to template/src/oj/contest/contest_index.html
diff --git a/template/oj/contest/contest_list.html b/template/src/oj/contest/contest_list.html
similarity index 100%
rename from template/oj/contest/contest_list.html
rename to template/src/oj/contest/contest_list.html
diff --git a/template/oj/contest/contest_problem.html b/template/src/oj/contest/contest_problem.html
similarity index 100%
rename from template/oj/contest/contest_problem.html
rename to template/src/oj/contest/contest_problem.html
diff --git a/template/oj/contest/contest_problems_list.html b/template/src/oj/contest/contest_problems_list.html
similarity index 100%
rename from template/oj/contest/contest_problems_list.html
rename to template/src/oj/contest/contest_problems_list.html
diff --git a/template/oj/contest/contest_rank.html b/template/src/oj/contest/contest_rank.html
similarity index 100%
rename from template/oj/contest/contest_rank.html
rename to template/src/oj/contest/contest_rank.html
diff --git a/template/oj/contest/my_submission.html b/template/src/oj/contest/my_submission.html
similarity index 100%
rename from template/oj/contest/my_submission.html
rename to template/src/oj/contest/my_submission.html
diff --git a/template/oj/contest/my_submissions_list.html b/template/src/oj/contest/my_submissions_list.html
similarity index 100%
rename from template/oj/contest/my_submissions_list.html
rename to template/src/oj/contest/my_submissions_list.html
diff --git a/template/oj/contest/no_contest_permission.html b/template/src/oj/contest/no_contest_permission.html
similarity index 100%
rename from template/oj/contest/no_contest_permission.html
rename to template/src/oj/contest/no_contest_permission.html
diff --git a/template/oj/contest/submissions_list.html b/template/src/oj/contest/submissions_list.html
similarity index 100%
rename from template/oj/contest/submissions_list.html
rename to template/src/oj/contest/submissions_list.html
diff --git a/template/oj/index.html b/template/src/oj/index.html
similarity index 100%
rename from template/oj/index.html
rename to template/src/oj/index.html
diff --git a/template/oj/problem/_problem_header.html b/template/src/oj/problem/_problem_header.html
similarity index 100%
rename from template/oj/problem/_problem_header.html
rename to template/src/oj/problem/_problem_header.html
diff --git a/template/oj/problem/my_submission.html b/template/src/oj/problem/my_submission.html
similarity index 100%
rename from template/oj/problem/my_submission.html
rename to template/src/oj/problem/my_submission.html
diff --git a/template/oj/problem/my_submissions_list.html b/template/src/oj/problem/my_submissions_list.html
similarity index 100%
rename from template/oj/problem/my_submissions_list.html
rename to template/src/oj/problem/my_submissions_list.html
diff --git a/template/oj/problem/problem.html b/template/src/oj/problem/problem.html
similarity index 100%
rename from template/oj/problem/problem.html
rename to template/src/oj/problem/problem.html
diff --git a/template/oj/problem/problem_list.html b/template/src/oj/problem/problem_list.html
similarity index 100%
rename from template/oj/problem/problem_list.html
rename to template/src/oj/problem/problem_list.html
diff --git a/template/oj/submission/my_submissions_list.html b/template/src/oj/submission/my_submissions_list.html
similarity index 100%
rename from template/oj/submission/my_submissions_list.html
rename to template/src/oj/submission/my_submissions_list.html
diff --git a/template/oj_base.html b/template/src/oj_base.html
similarity index 100%
rename from template/oj_base.html
rename to template/src/oj_base.html
diff --git a/template/utils/error.html b/template/src/utils/error.html
similarity index 100%
rename from template/utils/error.html
rename to template/src/utils/error.html
From 4e649d54e4bb274ffe870f99af94bb4d1b29c08e Mon Sep 17 00:00:00 2001
From: virusdefender <1670873886@qq.com>
Date: Tue, 25 Aug 2015 22:56:07 +0800
Subject: [PATCH 6/6] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=AF=94=E8=B5=9B?=
=?UTF-8?q?=E5=88=97=E8=A1=A8=E9=A1=B5=E9=A1=BA=E5=BA=8F=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
contest/views.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/contest/views.py b/contest/views.py
index 67201933..e23b50ec 100644
--- a/contest/views.py
+++ b/contest/views.py
@@ -338,7 +338,7 @@ def contest_list_page(request, page=1):
所有比赛的列表页
"""
# 正常情况
- contests = Contest.objects.filter(visible=True)
+ contests = Contest.objects.filter(visible=True).order_by("-create_time")
# 搜索的情况
keyword = request.GET.get("keyword", None)