From bf2c41713a4cd95cab8e93ef41a4f600f5926f88 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Tue, 15 Sep 2015 13:14:46 +0800 Subject: [PATCH 01/19] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- judge/judger_controller/settings.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/judge/judger_controller/settings.py b/judge/judger_controller/settings.py index 92d17807..e141c525 100644 --- a/judge/judger_controller/settings.py +++ b/judge/judger_controller/settings.py @@ -1,7 +1,12 @@ # coding=utf-8 +""" +注意: +此文件包含 celery 的部分配置,但是 celery 并不是运行在docker 中的,所以本配置文件中的 redis和 MySQL 的地址就应该是 +运行 redis 和 MySQL 的 docker 容器的地址了。怎么获取这个地址见帮助文档。测试用例的路径和源代码路径同理。 +""" # 这个redis 是 celery 使用的,包括存储队列信息还有部分统计信息 redis_config = { - "host": "121.42.32.129", + "host": "192.168.42.23", "port": 6379, "db": 0 } @@ -9,23 +14,23 @@ redis_config = { # 判题的 docker 容器的配置参数 docker_config = { - "image_name": "3da0e526934e", + "image_name": "judger", "docker_path": "docker", "shell": True } # 测试用例的路径,是主机上的实际路径 -test_case_dir = "/var/mnt/source/test_case/" +test_case_dir = "/root/test_case/" # 源代码路径,也就是 manage.py 所在的实际路径 -source_code_dir = "/var/mnt/source/OnlineJudge/" +source_code_dir = "/root/qduoj/" # 日志文件夹路径 -log_dir = "/var/log/" +log_dir = "/root/log/" # 存储提交信息的数据库,是 celery 使用的,与 oj.settings/local_settings 等区分,那是 web 服务器访问的地址 submission_db = { - "host": "127.0.0.1", + "host": "192.168.42.32", "port": 3306, "db": "oj_submission", "user": "root", From 0683d0914b16df41be2e70be06866523b0263494 Mon Sep 17 00:00:00 2001 From: "sxw@401" Date: Tue, 15 Sep 2015 15:38:09 +0800 Subject: [PATCH 02/19] =?UTF-8?q?=E7=94=A8pre=E6=A0=87=E7=AD=BE=E5=8C=85?= =?UTF-8?q?=E8=A3=B9=E7=BC=96=E8=AF=91=E5=8F=82=E6=95=B0[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/src/utils/help.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/template/src/utils/help.html b/template/src/utils/help.html index c03b354e..2284da32 100644 --- a/template/src/utils/help.html +++ b/template/src/utils/help.html @@ -33,12 +33,12 @@

编译参数

From 2fe2d7b9ccc16dd1c53c4e01dde9a8ac3a147d03 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Tue, 15 Sep 2015 16:35:39 +0800 Subject: [PATCH 03/19] =?UTF-8?q?judger=20=E5=A2=9E=E5=8A=A0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E8=BF=9E=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- judge/judger_controller/tasks.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/judge/judger_controller/tasks.py b/judge/judger_controller/tasks.py index df1deaba..d120ee34 100644 --- a/judge/judger_controller/tasks.py +++ b/judge/judger_controller/tasks.py @@ -11,7 +11,8 @@ from settings import docker_config, source_code_dir, test_case_dir, log_dir, sub @app.task def judge(submission_id, time_limit, memory_limit, test_case_id): try: - command = "%s run -t -i --privileged --rm=true " \ + command = "%s run -t -i --privileged --rm " \ + "--link mysql " \ "-v %s:/var/judger/test_case/ " \ "-v %s:/var/judger/code/ " \ "-v %s:/var/judger/code/log/ " \ From 01215a71ad101e586230936f5c279c6c70e81004 Mon Sep 17 00:00:00 2001 From: "sxw@401" Date: Tue, 15 Sep 2015 16:41:13 +0800 Subject: [PATCH 04/19] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E9=A2=98?= =?UTF-8?q?=E7=9B=AE=E5=88=97=E8=A1=A8=E6=AF=8F=E4=B8=AA=E9=A2=98=E7=9B=AE?= =?UTF-8?q?=E5=89=8D=E8=BE=B9=E7=8A=B6=E6=80=81=E6=8C=87=E7=A4=BA=E6=A0=87?= =?UTF-8?q?=E5=BF=97=EF=BC=9Aac=20/=E6=B2=A1=E6=9C=89/=E6=AD=A3=E5=9C=A8?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=EF=BC=8C=E5=9B=A0=E4=B8=BA=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=98=AF=E5=AD=98=E5=9C=A8=E7=94=A8=E6=88=B7=E8=A1=A8=E9=87=8C?= =?UTF-8?q?=E7=9A=84=E6=89=80=E4=BB=A5=E7=BC=93=E5=AD=98=E7=9A=84=E6=97=B6?= =?UTF-8?q?=E5=80=99=E5=8F=AF=E4=BB=A5=E5=81=9A=E5=88=B0=E4=B8=8E=E9=A2=98?= =?UTF-8?q?=E7=9B=AE=E6=95=B0=E6=8D=AE=E5=88=86=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0002_user_problems_status.py | 19 +++++++++++++++++++ account/models.py | 3 +++ mq/scripts/info.py | 16 ++++++++++++++++ problem/views.py | 7 ++++++- submission/views.py | 9 ++++++++- template/src/oj/problem/problem_list.html | 2 +- utils/templatetags/problem.py | 9 +++++++++ 7 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 account/migrations/0002_user_problems_status.py diff --git a/account/migrations/0002_user_problems_status.py b/account/migrations/0002_user_problems_status.py new file mode 100644 index 00000000..58c8a31c --- /dev/null +++ b/account/migrations/0002_user_problems_status.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('account', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='problems_status', + field=models.TextField(blank=True), + ), + ] diff --git a/account/models.py b/account/models.py index df25329c..754e178d 100644 --- a/account/models.py +++ b/account/models.py @@ -30,6 +30,9 @@ class User(AbstractBaseUser): create_time = models.DateTimeField(auto_now_add=True) # 0代表不是管理员 1是普通管理员 2是超级管理员 admin_type = models.IntegerField(default=0) + # JSON字典用来表示该用户的问题的解决状态 1为ac,2为正在进行 + problems_status = models.TextField(blank=True) + USERNAME_FIELD = 'username' REQUIRED_FIELDS = [] diff --git a/mq/scripts/info.py b/mq/scripts/info.py index 01ef6b2d..41a21273 100644 --- a/mq/scripts/info.py +++ b/mq/scripts/info.py @@ -2,6 +2,7 @@ import logging import redis +import json from judge.judger_controller.settings import redis_config from judge.judger.result import result @@ -9,6 +10,7 @@ from submission.models import Submission from problem.models import Problem from contest.models import ContestProblem, Contest, ContestSubmission from account.models import User + logger = logging.getLogger("app_info") @@ -35,6 +37,20 @@ class MessageQueue(object): problem.save() except Problem.DoesNotExist: logger.warning("Submission problem does not exist, submission_id: " + submission_id) + # 更新该用户的解题状态 + try: + user = User.objects.get(pk=submission.user_id) + except User.DoesNotExist: + logger.warning("Submission user does not exist, submission_id: " + submission_id) + continue + if user.problems_status: + problems_status = json.loads(user.problems_status) + else: + problems_status = {} + problems_status[str(problem.id)] = 1 + user.problems_status = json.dumps(problems_status) + user.save() + # 普通题目的话,到这里就结束了 continue diff --git a/problem/views.py b/problem/views.py index c66b90ed..18d7adf4 100644 --- a/problem/views.py +++ b/problem/views.py @@ -282,11 +282,16 @@ def problem_list_page(request, page=1): except Exception: pass + if request.user.is_authenticated() and request.user.problems_status: + problems_status = json.loads(request.user.problems_status) + else: + problems_status = {} + print problems_status # 右侧标签列表 按照关联的题目的数量排序 排除题目数量为0的 tags = ProblemTag.objects.annotate(problem_number=Count("problem")).filter(problem_number__gt=0).order_by("-problem_number") return render(request, "oj/problem/problem_list.html", {"problems": current_page, "page": int(page), "previous_page": previous_page, "next_page": next_page, - "keyword": keyword, "tag": tag_text, + "keyword": keyword, "tag": tag_text,"problems_status": problems_status, "tags": tags, "difficulty_order": difficulty_order}) diff --git a/submission/views.py b/submission/views.py index 45e1875c..baa81d4d 100644 --- a/submission/views.py +++ b/submission/views.py @@ -46,7 +46,14 @@ class SubmissionAPIView(APIView): judge.delay(submission.id, problem.time_limit, problem.memory_limit, problem.test_case_id) except Exception: return error_response(u"提交判题任务失败") - + # 修改用户解题状态 + if request.user.problems_status: + problems_status = json.loads(request.user.problems_status) + else: + problems_status = {} + problems_status[str(data["problem_id"])] = 2 + request.user.problems_status = json.dumps(problems_status) + request.user.save() # 增加redis 中判题队列长度的计数器 r = redis.Redis(host=redis_config["host"], port=redis_config["port"], db=redis_config["db"]) r.incr("judge_queue_length") diff --git a/template/src/oj/problem/problem_list.html b/template/src/oj/problem/problem_list.html index 7a9b1dce..1a1cd139 100644 --- a/template/src/oj/problem/problem_list.html +++ b/template/src/oj/problem/problem_list.html @@ -28,7 +28,7 @@ {% for item in problems %} - + {{ item.id }} {{ item.title }} diff --git a/utils/templatetags/problem.py b/utils/templatetags/problem.py index 412c91db..31d290df 100644 --- a/utils/templatetags/problem.py +++ b/utils/templatetags/problem.py @@ -8,7 +8,16 @@ def get_problem_accepted_radio(problem): return "0%" +def get_problem_status(problems_status, problem_id): + + if str(problem_id) in problems_status: + if problems_status[str(problem_id)] == 1: + return "glyphicon glyphicon-ok ac-flag" + return "glyphicon glyphicon-minus dealing-flag" + return "" + from django import template register = template.Library() register.filter("accepted_radio", get_problem_accepted_radio) +register.simple_tag(get_problem_status, name="get_problem_status") From 45db5c7c1c34ac716b5ee048d80aac669bcc4e43 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Tue, 15 Sep 2015 16:52:39 +0800 Subject: [PATCH 05/19] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=B8=AE=E5=8A=A9?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/src/utils/help.html | 38 ++++++++++++++---------------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/template/src/utils/help.html b/template/src/utils/help.html index c03b354e..f82d81c1 100644 --- a/template/src/utils/help.html +++ b/template/src/utils/help.html @@ -22,37 +22,29 @@
  • System Error: 判题系统发生故障,请等待重判
  • Waiting: 你的提交正在等待处理
  • -

    支持的语言

    -

    编译参数

    常见问题

    From 65a49f54801d25eb8f42d17190580e35a561ad8c Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Tue, 15 Sep 2015 19:12:50 +0800 Subject: [PATCH 06/19] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/README.md b/README.md index e69de29b..cdf478d7 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,33 @@ +# OnlineJudge + +基于 Python 和 Django的在线评测平台。 + +文档:https://www.zybuluo.com/virusdefender/note/171932 + +TODO: + + - 完善文档,目前还差很多 + - 完善测试 + - 搭建 demo 站点 + +![oj_previewindex.png][1] + +![preview.jpeg][2] + +![oj_preview_submission.png][3] + +![contest][4] + +![contest_rank_edit][5] + +![admin_problem][6] + +![admin_contest][7] + +[1]: https://dn-virusdefender-blog-cdn.qbox.me/oj_previewindex.png +[2]: https://dn-virusdefender-blog-cdn.qbox.me/oj_previewproblem.png +[3]: https://dn-virusdefender-blog-cdn.qbox.me/oj_previewsubmission.png +[4]: https://dn-virusdefender-blog-cdn.qbox.me/oj_previewcontest.png +[5]: https://dn-virusdefender-blog-cdn.qbox.me/oj_previewcontest_rank.png?edit +[6]: https://dn-virusdefender-blog-cdn.qbox.me/oj_previewadmin_problem.png +[7]: https://dn-virusdefender-blog-cdn.qbox.me/oj_previewadmin_contest.png \ No newline at end of file From 21b18b8e972d275d973bee1ecae4c2ebe0f4e28c Mon Sep 17 00:00:00 2001 From: "sxw@401" Date: Tue, 15 Sep 2015 20:23:23 +0800 Subject: [PATCH 07/19] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problem/views.py | 1 - 1 file changed, 1 deletion(-) diff --git a/problem/views.py b/problem/views.py index 18d7adf4..84ca58d8 100644 --- a/problem/views.py +++ b/problem/views.py @@ -286,7 +286,6 @@ def problem_list_page(request, page=1): problems_status = json.loads(request.user.problems_status) else: problems_status = {} - print problems_status # 右侧标签列表 按照关联的题目的数量排序 排除题目数量为0的 tags = ProblemTag.objects.annotate(problem_number=Count("problem")).filter(problem_number__gt=0).order_by("-problem_number") From 6045b34e0adec4a2c277b48fe3fc61a12d1f85fe Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Tue, 15 Sep 2015 20:56:14 +0800 Subject: [PATCH 08/19] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E9=85=8D=E7=BD=AE=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitattributes | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..b6cb82c9 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +static/src/js/lib/* linguist-vendored +static/src/js/require.js linguist-vendored +static/src/js/r.js linguist-vendored \ No newline at end of file From cc138542b4b7d9180c380844ab5a76346c87d2e8 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Tue, 15 Sep 2015 20:58:40 +0800 Subject: [PATCH 09/19] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install/__init__.py | 0 install/migrations/__init__.py | 0 install/models.py | 3 --- install/tests.py | 3 --- install/views.py | 23 ----------------------- judge/README.md | 3 --- 6 files changed, 32 deletions(-) delete mode 100644 install/__init__.py delete mode 100644 install/migrations/__init__.py delete mode 100644 install/models.py delete mode 100644 install/tests.py delete mode 100644 install/views.py delete mode 100644 judge/README.md diff --git a/install/__init__.py b/install/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/install/migrations/__init__.py b/install/migrations/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/install/models.py b/install/models.py deleted file mode 100644 index 71a83623..00000000 --- a/install/models.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/install/tests.py b/install/tests.py deleted file mode 100644 index 7ce503c2..00000000 --- a/install/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/install/views.py b/install/views.py deleted file mode 100644 index 75fd7bd5..00000000 --- a/install/views.py +++ /dev/null @@ -1,23 +0,0 @@ -# coding=utf-8 -from django.shortcuts import render -from django.http import HttpResponse - -from account.models import User -from group.models import Group, UserGroupRelation, JoinGroupRequest - - -def install(request): - for i in range(10): - user = User.objects.create(username="root" + str(i), admin_type=2, real_name="real_name", email="11111@qq.com") - user.set_password("root") - user.save() - for i in range(10): - group = Group.objects.create(name="group" + str(i), - description="description", - admin=User.objects.get(username="root0")) - for i in range(7): - UserGroupRelation.objects.create(user=User.objects.get(username="root" + str(i)), group=group) - for i in range(7, 10): - JoinGroupRequest.objects.create(user=User.objects.get(username="root" + str(i)), - group=group, message=u"你好啊") - return HttpResponse("success") diff --git a/judge/README.md b/judge/README.md deleted file mode 100644 index c40444b1..00000000 --- a/judge/README.md +++ /dev/null @@ -1,3 +0,0 @@ -/usr/bin/docker run -t -i --privileged -v /var/test_case/:/var/judger/test_case/ -v /var/code/:/var/judger/code/ judger /bin/bash - -python judge/judger/run.py -solution_id 1 -max_cpu_time 1 -max_memory 1 -test_case_id 1 From 83e45501b0d99687c17d7ef69351ae8274d25251 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Tue, 15 Sep 2015 22:45:04 +0800 Subject: [PATCH 10/19] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BC=80=E6=BA=90?= =?UTF-8?q?=E5=8D=8F=E8=AE=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..c51daa11 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Qingdao University College of Information Engineering + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From cc0562f3480c22d98c5ba1ad04040d32e39f44a6 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Wed, 16 Sep 2015 10:01:25 +0800 Subject: [PATCH 11/19] update license --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index c51daa11..7126efb1 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2015 Qingdao University College of Information Engineering +Copyright (c) 2015 Qingdao 青岛大学信息工程学院创新实验室 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 758132c40d91792992d88cd379a521b3179ff2c8 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Wed, 16 Sep 2015 12:57:48 +0800 Subject: [PATCH 12/19] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E7=9C=9F=E5=AE=9E=E5=A7=93=E5=90=8D=E7=9A=84=E9=9A=90=E8=97=8F?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest/views.py | 5 ++++- template/src/oj/contest/contest_rank.html | 7 ++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/contest/views.py b/contest/views.py index 31a6c36c..5bb089bc 100644 --- a/contest/views.py +++ b/contest/views.py @@ -433,7 +433,9 @@ def contest_rank_page(request, contest_id): except ContestSubmission.DoesNotExist: result[i]["problems"].append({}) result[i]["total_ac"] = submissions.filter(ac=True).count() - result[i]["username"] = User.objects.get(id=result[i]["user_id"]).username + user= User.objects.get(id=result[i]["user_id"]) + result[i]["username"] = user.username + result[i]["real_name"] = user.real_name result[i]["total_time"] = get_the_time_format(submissions.filter(ac=True).aggregate(total_time=Sum("total_time"))["total_time"]) result = sorted(result, cmp=_cmp, reverse=True) r.set("contest_rank_" + contest_id, json.dumps(list(result))) @@ -449,4 +451,5 @@ def contest_rank_page(request, contest_id): {"contest": contest, "contest_problems": contest_problems, "result": result, "auto_refresh": request.GET.get("auto_refresh", None) == "true", + "show_real_name": result.GET.get("show_real_name", None) == "true", "real_time_rank": contest.real_time_rank}) diff --git a/template/src/oj/contest/contest_rank.html b/template/src/oj/contest/contest_rank.html index aefb1990..20b2d6ab 100644 --- a/template/src/oj/contest/contest_rank.html +++ b/template/src/oj/contest/contest_rank.html @@ -45,7 +45,12 @@ {% for item in result %} {{ forloop.counter }} - {{ item.username }} + + {{ item.username }} + {% if show_real_name %} + ({{ item.real_name }}) + {% endif %} + {{ item.total_ac }} / {{ item.total_submit }} {% if item.total_time %}{{ item.total_time }}{% else %}--{% endif %} {% for problem in item.problems %} From 5723572af774f27fec62f35cb9258e075d036ac3 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Wed, 16 Sep 2015 13:25:23 +0800 Subject: [PATCH 13/19] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AD=97=E4=BD=93?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/css/global.css | 23 ++++++++++++++--------- static/src/css/oj.css | 3 +-- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/static/src/css/global.css b/static/src/css/global.css index 56c87eb1..2d389311 100644 --- a/static/src/css/global.css +++ b/static/src/css/global.css @@ -1,13 +1,17 @@ -html{ +body, button, input, select, textarea, h1, h2, h3, h4, h5, h6 { + font-family: Georgia, STHeiti, "Microsoft Yahei"; +} + +html { height: 100%; } -body{ - height:100%; /*使内容高度和body一样*/ - margin-bottom:-80px;/*向上缩减80像素,不至于footer超出屏幕可视范围*/ +body { + height: 100%; /*使内容高度和body一样*/ + margin-bottom: -80px; /*向上缩减80像素,不至于footer超出屏幕可视范围*/ } -.main{ +.main { padding-bottom: 120px; } @@ -30,10 +34,11 @@ label { display: none } -.right{ +.right { float: right; } -.CodeMirror pre { - font-family: "Consolas","Bitstream Vera Sans Mono","Courier New", Courier, monospace !important; -} \ No newline at end of file + +pre { + font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; +} diff --git a/static/src/css/oj.css b/static/src/css/oj.css index 86748c2d..cecc0b50 100644 --- a/static/src/css/oj.css +++ b/static/src/css/oj.css @@ -1,8 +1,7 @@ -@import url("global.css"); @import url("bootstrap/bootstrap.min.css"); @import url("bootstrap/todc-bootstrap.min.css"); @import url("codeMirror/codemirror.css"); - +@import url("global.css"); #language-selector { width: 130px; From 6122cc1a32ace6da9b1edd23e5094748c7440cea Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Wed, 16 Sep 2015 13:50:08 +0800 Subject: [PATCH 14/19] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AD=97=E4=BD=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/css/admin.css | 2 +- static/src/css/global.css | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/static/src/css/admin.css b/static/src/css/admin.css index fb9c9f25..6a613e7c 100644 --- a/static/src/css/admin.css +++ b/static/src/css/admin.css @@ -1,4 +1,3 @@ -@import url("global.css"); @import url("bootstrap/bootstrap.min.css"); @import url("bootstrap/todc-bootstrap.min.css"); @import url("codeMirror/codemirror.css"); @@ -6,6 +5,7 @@ @import url("webuploader/webuploader.css"); @import url("datetime_picker/bootstrap-datetimepicker.css"); @import url("tagEditor/jquery.tag-editor.css"); +@import url("global.css"); #loading-gif { width: 40px; diff --git a/static/src/css/global.css b/static/src/css/global.css index 2d389311..2d4f6181 100644 --- a/static/src/css/global.css +++ b/static/src/css/global.css @@ -1,5 +1,5 @@ body, button, input, select, textarea, h1, h2, h3, h4, h5, h6 { - font-family: Georgia, STHeiti, "Microsoft Yahei"; + font-family: Georgia, STHeiti, "Microsoft Yahei", SimSun, "Droid Sans"; } html { @@ -40,5 +40,5 @@ label { pre { - font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; + font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; } From d5e12d6a23b97b24f4c9e4d9f239cc5fb40d9d47 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Wed, 16 Sep 2015 13:53:31 +0800 Subject: [PATCH 15/19] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=9D=99=E6=80=81?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=8E=8B=E7=BC=A9=E8=84=9A=E6=9C=AC=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/release_static.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tools/release_static.py b/tools/release_static.py index 0a51b8a7..f937ae33 100644 --- a/tools/release_static.py +++ b/tools/release_static.py @@ -9,6 +9,12 @@ template_release_path = "template/release/" static_src_path = "static/src/" static_release_path = "static/release/" + +print "Begin to compress js" +if os.system("node static/src/js/r.js -o static/src/js/build.js"): + print "Failed to compress js, exit" + exit() + try: # 删除模板的 release 文件夹 shutil.rmtree(template_release_path) @@ -30,7 +36,7 @@ name_map = {} def process(match): file_path = match.group(1).replace("/static/", "") - # print file_path, match.group(), match.group(1) + print "Processing: " + file_path if not os.path.exists(static_release_path + file_path): return match.group(0) @@ -59,3 +65,5 @@ for root, dirs, files in os.walk(template_release_path): f = open(html_path, "w") f.write(css_replaced_html_content) f.close() + +print "Done" \ No newline at end of file From 8e60d08f142f798e536fb5b49eebbabf03fcc0f6 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Wed, 16 Sep 2015 15:21:24 +0800 Subject: [PATCH 16/19] =?UTF-8?q?IE=E6=B5=8F=E8=A7=88=E5=99=A8=E4=B8=8B?= =?UTF-8?q?=E5=BE=88=E5=A4=9A=20css=20=E6=A0=B7=E5=BC=8F=E9=94=99=E8=AF=AF?= =?UTF-8?q?=EF=BC=8C=E5=86=B3=E5=AE=9A=E4=B8=8D=E5=86=8D=E6=94=AF=E6=8C=81?= =?UTF-8?q?=EF=BC=8C=E5=BC=BA=E5=88=B6=E8=B7=B3=E8=BD=AC=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/img/chrome.png | Bin 0 -> 16407 bytes static/src/img/firefox.png | Bin 0 -> 24971 bytes static/src/img/ie.png | Bin 0 -> 19044 bytes static/src/img/unsupported_browser.html | 37 ++++++++++++++++++++++++ template/src/admin/admin.html | 12 ++++---- template/src/oj_base.html | 14 ++++----- 6 files changed, 48 insertions(+), 15 deletions(-) create mode 100644 static/src/img/chrome.png create mode 100644 static/src/img/firefox.png create mode 100644 static/src/img/ie.png create mode 100644 static/src/img/unsupported_browser.html diff --git a/static/src/img/chrome.png b/static/src/img/chrome.png new file mode 100644 index 0000000000000000000000000000000000000000..06a52bc40a2aab2cd4f3c13bb1f0e4567819f2fb GIT binary patch literal 16407 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 + + + + 不支持的浏览器 + + + +很抱歉,我们无法完全兼容低版本的 IE 浏览器,您可以 + +
    + 使用Chrome +
    +
    + +
    + 使用FireFox +
    +
    + + +
    + 升级IE +
    +
    + + + + \ No newline at end of file diff --git a/template/src/admin/admin.html b/template/src/admin/admin.html index 459a69fc..0e470c6e 100644 --- a/template/src/admin/admin.html +++ b/template/src/admin/admin.html @@ -54,13 +54,11 @@ - - - +
    diff --git a/template/src/oj_base.html b/template/src/oj_base.html index f90052cc..1910ff0e 100644 --- a/template/src/oj_base.html +++ b/template/src/oj_base.html @@ -1,5 +1,5 @@ - + @@ -21,13 +21,11 @@ - - - +
    + {% if problem.source %} +
    + +
    {{ problem.source }}
    +
    + {% endif %}
    From ad7b9275f112bc15bae979951cfe81a80e9a8b1c Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Wed, 16 Sep 2015 17:29:15 +0800 Subject: [PATCH 19/19] =?UTF-8?q?=E9=9D=99=E6=80=81=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=89=93=E5=8C=85=E5=A2=9E=E5=8A=A0=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/release_static.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/release_static.py b/tools/release_static.py index f937ae33..2ab87e5d 100644 --- a/tools/release_static.py +++ b/tools/release_static.py @@ -36,7 +36,6 @@ name_map = {} def process(match): file_path = match.group(1).replace("/static/", "") - print "Processing: " + file_path if not os.path.exists(static_release_path + file_path): return match.group(0) @@ -55,9 +54,11 @@ def process(match): return match.group(0) +print "Begin to add md5 stamp in html" for root, dirs, files in os.walk(template_release_path): for name in files: html_path = os.path.join(root, name) + print "Processing: " + html_path html_content = open(html_path, "r").read() js_replaced_html_content = re.sub(js_re, process, html_content) css_replaced_html_content = re.sub(css_re, process, js_replaced_html_content) @@ -66,4 +67,4 @@ for root, dirs, files in os.walk(template_release_path): f.write(css_replaced_html_content) f.close() -print "Done" \ No newline at end of file +print "Done"