Merge branch 'dev' into hohoTT-dev
This commit is contained in:
commit
7383b0f138
50 files changed
+117
-81
No files matched your search
+4
-1
@@ -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/
|
||||
+1
-1
@@ -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:
|
||||
|
||||
+11
-28
@@ -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"))
|
||||
@@ -294,7 +294,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)
|
||||
@@ -332,7 +332,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)
|
||||
@@ -388,39 +388,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:
|
||||
|
||||
+2
-2
@@ -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'
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
/**
|
||||
* Created by virusdefender on 8/25/15.
|
||||
*/
|
||||
@@ -1,30 +0,0 @@
|
||||
{% extends "oj_base.html" %}
|
||||
{% block body %}
|
||||
{% load contest %}
|
||||
<div class="container main">
|
||||
<div class="col-lg-12 contest-tab">
|
||||
<ul class="nav nav-tabs nav-tabs-google">
|
||||
<li role="presentation" class="active">
|
||||
<a href="/contest/{{ contest.id }}/">比赛详情</a>
|
||||
</li>
|
||||
<li role="presentation">
|
||||
<a href="/contest/{{ contest.id }}/problems/">题目</a>
|
||||
</li>
|
||||
<li role="presentation">
|
||||
<a href="/contest/{{ contest.id }}/submissions/">提交</a>
|
||||
</li>
|
||||
<li role="presentation">
|
||||
<a href="/contest/{{ contest.id }}/rank/">排名</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block js_block %}
|
||||
{% endblock %}
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+13
-18
@@ -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">
|
||||
File renamed without changes.
@@ -0,0 +1,59 @@
|
||||
{% extends "oj_base.html" %}
|
||||
{% block body %}
|
||||
{% load submission %}
|
||||
<div class="container main">
|
||||
<div class="col-lg-12 contest-tab">
|
||||
<ul class="nav nav-tabs nav-tabs-google">
|
||||
<li role="presentation">
|
||||
<a href="/contest/{{ contest.id }}/">比赛详情</a>
|
||||
</li>
|
||||
<li role="presentation">
|
||||
<a href="/contest/{{ contest.id }}/problems/">题目</a>
|
||||
</li>
|
||||
<li role="presentation">
|
||||
<a href="/contest/{{ contest.id }}/submissions/">提交</a>
|
||||
</li>
|
||||
<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>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block js_block %}
|
||||
{% endblock %}
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -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.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")
|
||||
Reference in new issue
Block a user