mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2024-09-21 08:23:20 +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
|
||||
"""
|
||||
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:
|
||||
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)
|
||||
if visible:
|
||||
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)
|
||||
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)})
|
||||
|
||||
|
||||
|
||||
|
@ -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:
|
||||
|
@ -1,11 +1,13 @@
|
||||
{% extends 'oj_base.html' %}
|
||||
|
||||
{% block body %}
|
||||
<div class="container main">
|
||||
<div class="container main">
|
||||
<ul class="nav nav-tabs nav-tabs-google">
|
||||
<li role="presentation" class="active">
|
||||
<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>
|
||||
<h2 class="text-center">{{ contest_problem.title }}</h2>
|
||||
|
||||
@ -15,29 +17,22 @@
|
||||
</p>
|
||||
|
||||
<div>
|
||||
<div class="problem-section">
|
||||
<label class="problem-label">描述</label>
|
||||
<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.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">
|
||||
<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">
|
||||
<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>
|
||||
{% for item in samples %}
|
||||
<div class="problem-section">
|
||||
|
@ -1,10 +1,10 @@
|
||||
{% extends "oj_base.html" %}
|
||||
{% block body %}
|
||||
{% load contest %}
|
||||
{% load submission %}
|
||||
<div class="container main">
|
||||
<div class="col-lg-12 contest-tab">
|
||||
<ul class="nav nav-tabs nav-tabs-google">
|
||||
<li role="presentation" class="active">
|
||||
<li role="presentation">
|
||||
<a href="/contest/{{ contest.id }}/">比赛详情</a>
|
||||
</li>
|
||||
<li role="presentation">
|
||||
@ -13,13 +13,42 @@
|
||||
<li role="presentation">
|
||||
<a href="/contest/{{ contest.id }}/submissions/">提交</a>
|
||||
</li>
|
||||
<li role="presentation">
|
||||
<li role="presentation" class="active">
|
||||
<a href="/contest/{{ contest.id }}/rank/">排名</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="row">
|
||||
<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>
|
||||
|
@ -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)
|
||||
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