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:
virusdefender 2015-08-25 15:53:55 +08:00
commit 7bd041d89e
5 changed files with 79 additions and 49 deletions

View File

@ -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)

View File

@ -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:

View File

@ -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">

View File

@ -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>

View File

@ -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")