mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2024-09-21 16:33:22 +00:00
Accept Merge Request #129 基本完成比赛排名功能 : (virusdefender-dev -> dev)
Merge Request: 基本完成比赛排名功能 Created By: @virusdefender Accepted By: @virusdefender URL: https://coding.net/u/virusdefender/p/qduoj/git/merge/129
This commit is contained in:
commit
7bd041d89e
@ -134,9 +134,9 @@ class ContestAdminAPIView(APIView):
|
|||||||
response_serializer: ContestSerializer
|
response_serializer: ContestSerializer
|
||||||
"""
|
"""
|
||||||
if request.user.admin_type == SUPER_ADMIN:
|
if request.user.admin_type == SUPER_ADMIN:
|
||||||
contest = Contest.objects.all().order_by("-last_updated_time")
|
contest = Contest.objects.all().order_by("-create_time")
|
||||||
else:
|
else:
|
||||||
contest = Contest.objects.filter(created_by=request.user).order_by("-last_updated_time")
|
contest = Contest.objects.filter(created_by=request.user).order_by("-create_time")
|
||||||
visible = request.GET.get("visible", None)
|
visible = request.GET.get("visible", None)
|
||||||
if visible:
|
if visible:
|
||||||
contest = contest.filter(visible=(visible == "true"))
|
contest = contest.filter(visible=(visible == "true"))
|
||||||
@ -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)
|
contest_problem = ContestProblem.objects.get(id=contest_problem_id, visible=True)
|
||||||
except ContestProblem.DoesNotExist:
|
except ContestProblem.DoesNotExist:
|
||||||
return error_page(request, u"比赛题目不存在")
|
return error_page(request, u"比赛题目不存在")
|
||||||
warning = u"您已经提交过本题的正确答案!"
|
warning = u"您已经提交过本题的正确答案,重复提交可能造成时间累计。"
|
||||||
show_warning = False
|
show_warning = False
|
||||||
try:
|
try:
|
||||||
submission = ContestSubmission.objects.get(user=request.user, contest=contest, problem=contest_problem)
|
submission = ContestSubmission.objects.get(user=request.user, contest=contest, problem=contest_problem)
|
||||||
@ -394,39 +394,22 @@ def _cmp(x, y):
|
|||||||
|
|
||||||
@check_user_contest_permission
|
@check_user_contest_permission
|
||||||
def contest_rank_page(request, contest_id):
|
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"))
|
result = ContestSubmission.objects.values("user_id").annotate(total_submit=Count("user_id"))
|
||||||
for i in range(0, len(result)):
|
for i in range(0, len(result)):
|
||||||
# 这个人所有的提交
|
# 这个人所有的提交
|
||||||
submissions = ContestSubmission.objects.filter(user_id=result[i]["user_id"])
|
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]["total_ac"] = submissions.filter(ac=True).count()
|
||||||
result[i]["user"] = User.objects.get(id=result[i]["user_id"])
|
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"]
|
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 render(request, "oj/contest/contest_rank.html",
|
||||||
#
|
{"contest": contest, "contest_problems": contest_problems, "result": sorted(result, cmp=_cmp, reverse=True)})
|
||||||
# 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)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -61,9 +61,12 @@ class MessageQueue(object):
|
|||||||
logger.debug(contest.start_time)
|
logger.debug(contest.start_time)
|
||||||
logger.debug(submission.create_time)
|
logger.debug(submission.create_time)
|
||||||
logger.debug((submission.create_time - contest.start_time).total_seconds())
|
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.total_time += int((submission.create_time - contest.start_time).total_seconds() / 60)
|
||||||
# 标记为已经通过
|
# 标记为已经通过
|
||||||
contest_submission.ac = True
|
contest_submission.ac = True
|
||||||
|
# 提交次数加1
|
||||||
|
contest_submission.total_submission_number += 1
|
||||||
# contest problem ac 计数器加1
|
# contest problem ac 计数器加1
|
||||||
contest_problem.total_accepted_number += 1
|
contest_problem.total_accepted_number += 1
|
||||||
else:
|
else:
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
{% extends 'oj_base.html' %}
|
{% extends 'oj_base.html' %}
|
||||||
|
|
||||||
{% block body %}
|
{% block body %}
|
||||||
<div class="container main">
|
<div class="container main">
|
||||||
<ul class="nav nav-tabs nav-tabs-google">
|
<ul class="nav nav-tabs nav-tabs-google">
|
||||||
<li role="presentation" class="active">
|
<li role="presentation" class="active">
|
||||||
<a href="/contest/{{ contest_problem.contest.id }}/problem/{{ contest_problem.id }}/">题目</a></li>
|
<a href="/contest/{{ contest_problem.contest.id }}/problem/{{ contest_problem.id }}/">题目</a></li>
|
||||||
<li role="presentation"><a href="/contest/{{ contest_problem.contest.id }}/problem/{{ contest_problem.id }}/submissions/">我的提交</a></li>
|
<li role="presentation"><a
|
||||||
|
href="/contest/{{ contest_problem.contest.id }}/problem/{{ contest_problem.id }}/submissions/">我的提交</a>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<h2 class="text-center">{{ contest_problem.title }}</h2>
|
<h2 class="text-center">{{ contest_problem.title }}</h2>
|
||||||
|
|
||||||
@ -15,29 +17,22 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div class="problem-section">
|
<div class="problem-section">
|
||||||
<label class="problem-label">描述</label>
|
<label class="problem-label">描述</label>
|
||||||
|
|
||||||
<p class="problem-detail">{{ contest_problem.description|safe }}</p>
|
<p class="problem-detail">{{ contest_problem.description|safe }}</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="problem-section">
|
<div class="problem-section">
|
||||||
<label class="problem-label">输入</label>
|
<label class="problem-label">输入</label>
|
||||||
|
|
||||||
|
<p class="problem-detail">{{ contest_problem.input_description }}</p>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div class="problem-section">
|
|
||||||
<label class="problem-label">描述</label>
|
|
||||||
|
|
||||||
<p class="problem-detail">{{ contest_problem.description|safe }}</p>
|
|
||||||
</div>
|
|
||||||
<div class="problem-section">
|
|
||||||
<label class="problem-label">输入</label>
|
|
||||||
|
|
||||||
<p class="problem-detail">{{ contest_problem.input_description }}</p>
|
|
||||||
</div>
|
|
||||||
<div class="problem-section">
|
<div class="problem-section">
|
||||||
<label class="problem-label">输出</label>
|
<label class="problem-label">输出</label>
|
||||||
|
|
||||||
<p class="problem-detail">{{ contest_problem.output_description }}k</p>
|
<p class="problem-detail">{{ contest_problem.output_description }}</p>
|
||||||
</div>
|
</div>
|
||||||
{% for item in samples %}
|
{% for item in samples %}
|
||||||
<div class="problem-section">
|
<div class="problem-section">
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
{% extends "oj_base.html" %}
|
{% extends "oj_base.html" %}
|
||||||
{% block body %}
|
{% block body %}
|
||||||
{% load contest %}
|
{% load submission %}
|
||||||
<div class="container main">
|
<div class="container main">
|
||||||
<div class="col-lg-12 contest-tab">
|
<div class="col-lg-12 contest-tab">
|
||||||
<ul class="nav nav-tabs nav-tabs-google">
|
<ul class="nav nav-tabs nav-tabs-google">
|
||||||
<li role="presentation" class="active">
|
<li role="presentation">
|
||||||
<a href="/contest/{{ contest.id }}/">比赛详情</a>
|
<a href="/contest/{{ contest.id }}/">比赛详情</a>
|
||||||
</li>
|
</li>
|
||||||
<li role="presentation">
|
<li role="presentation">
|
||||||
@ -13,13 +13,42 @@
|
|||||||
<li role="presentation">
|
<li role="presentation">
|
||||||
<a href="/contest/{{ contest.id }}/submissions/">提交</a>
|
<a href="/contest/{{ contest.id }}/submissions/">提交</a>
|
||||||
</li>
|
</li>
|
||||||
<li role="presentation">
|
<li role="presentation" class="active">
|
||||||
<a href="/contest/{{ contest.id }}/rank/">排名</a>
|
<a href="/contest/{{ contest.id }}/rank/">排名</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
|
<table class="table table-bordered">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>#</th>
|
||||||
|
<th>用户名</th>
|
||||||
|
<th>AC / 总提交</th>
|
||||||
|
<th>用时 + 罚时</th>
|
||||||
|
{% for item in contest_problems %}
|
||||||
|
<th><a href="/contest/{{ contest.id }}/problem/{{ item.id }}/">{{ item.sort_index }}</a>
|
||||||
|
</th>
|
||||||
|
{% endfor %}
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for item in result %}
|
||||||
|
<tr>
|
||||||
|
<th scope="row">{{ forloop.counter }}</th>
|
||||||
|
<td>{{ item.user.username }}</td>
|
||||||
|
<td>{{ item.total_ac }} / {{ item.total_submit }}</td>
|
||||||
|
<td>{% if item.total_time %}{{ item.total_time }} min{% else %}--{% endif %}</td>
|
||||||
|
{% for problem in contest_problems %}
|
||||||
|
<td class="{% submission_problem_result_class problem item.submissions %}">
|
||||||
|
{% submission_problem problem item.submissions %}
|
||||||
|
</td>
|
||||||
|
{% endfor %}
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -29,7 +29,27 @@ def translate_result_class(value):
|
|||||||
return "danger"
|
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 = template.Library()
|
||||||
register.filter("translate_result", translate_result)
|
register.filter("translate_result", translate_result)
|
||||||
register.filter("translate_language", translate_language)
|
register.filter("translate_language", translate_language)
|
||||||
register.filter("translate_result_class", translate_result_class)
|
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")
|
Loading…
Reference in New Issue
Block a user