diff --git a/contest/views.py b/contest/views.py index 3a919ed..c1c1958 100644 --- a/contest/views.py +++ b/contest/views.py @@ -437,6 +437,7 @@ def contest_rank_page(request, contest_id): result[i]["username"] = user.username result[i]["real_name"] = user.real_name result[i]["total_time"] = get_the_formatted_time(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))) else: @@ -451,5 +452,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", + "show_real_name": request.GET.get("show_real_name", None) == "true", "real_time_rank": contest.real_time_rank}) diff --git a/contest_submission/views.py b/contest_submission/views.py index aaa6c6e..59ee7fa 100644 --- a/contest_submission/views.py +++ b/contest_submission/views.py @@ -22,7 +22,6 @@ from utils.shortcuts import serializer_invalid_response, error_response, success from submission.models import Submission from .serializers import CreateContestSubmissionSerializer from submission.serializers import SubmissionSerializer -from oj.settings import REDIS_CACHE class ContestSubmissionAPIView(APIView): @@ -78,21 +77,7 @@ def contest_problem_my_submissions_list_page(request, contest_id, contest_proble {"submissions": submissions, "problem": contest_problem}) -def get_formatted_datetime(date_time): - date_time = timezone.localtime(date_time) - result = str(date_time.minute) - if date_time.minute < 10: - result = "0" + result - result = str(date_time.hour) + ":" + result - if date_time.hour < 10: - result = "0" + result - result = str(date_time.day) + u"日 " + result - result = str(date_time.month) + u"月" + result - result = str(date_time.year) + u"年" + result - return result - - -@login_required +@check_user_contest_permission def contest_problem_submissions_list_page(request, contest_id, page=1): """ 单个比赛中的所有提交(包含自己和别人,自己可查提交结果,其他人不可查) @@ -101,33 +86,16 @@ def contest_problem_submissions_list_page(request, contest_id, page=1): contest = Contest.objects.get(id=contest_id) except Contest.DoesNotExist: return error_page(request, u"比赛不存在") - # 以下是本场比赛中所有的提交 - r = redis.Redis(host=REDIS_CACHE["host"], port=REDIS_CACHE["port"], db=REDIS_CACHE["db"]) - if contest.real_time_rank: - # 更新submissions缓存 - submissions = Submission.objects.filter(contest_id=contest_id). \ - values("id", "contest_id", "problem_id", "result", "create_time", "accepted_answer_time", "language", - "user_id").order_by("-create_time") - # 把datetime类型转换为string - for submission in submissions: - submission["create_time"] = get_formatted_datetime(submission["create_time"]) - r.set("contest_submissions_" + contest_id, json.dumps(list(submissions))) - else: - # 已封榜 - submissions = r.get("contest_submissions_" + contest_id) - if submissions: - submissions = json.loads(submissions) - time = datetime.strptime(submissions[0]["create_time"].encode("utf8"), - '%Y\xe5\xb9\xb4%m\xe6\x9c\x88%d\xe6\x97\xa5 %H:%M') - time = time.replace(tzinfo=pytz.timezone('Asia/Shanghai')) - else: - submissions = [] - time = contest.start_time - # 除了缓存里的还要加上封榜以后自己的提交 - self_submissions = Submission.objects.filter(contest_id=int(contest_id), user_id=request.user.id, create_time__gte=time). \ - values("id", "contest_id", "problem_id", "result", "create_time", "accepted_answer_time", "language", - "user_id").order_by("-create_time") - submissions = list(self_submissions) + submissions + + submissions = Submission.objects.filter(contest_id=contest_id).\ + values("id", "contest_id", "problem_id", "result", "create_time", + "accepted_answer_time", "language", "user_id").order_by("-create_time") + + + # 封榜的时候只能看到自己的提交 + if not contest.real_time_rank: + if not (request.user.admin_type == SUPER_ADMIN or request.user == contest.created_by): + submissions = submissions.filter(user_id=request.user.id) language = request.GET.get("language", None) filter = None diff --git a/judge/judger_controller/settings.py b/judge/judger_controller/settings.py index e141c52..4c155b5 100644 --- a/judge/judger_controller/settings.py +++ b/judge/judger_controller/settings.py @@ -4,9 +4,10 @@ 此文件包含 celery 的部分配置,但是 celery 并不是运行在docker 中的,所以本配置文件中的 redis和 MySQL 的地址就应该是 运行 redis 和 MySQL 的 docker 容器的地址了。怎么获取这个地址见帮助文档。测试用例的路径和源代码路径同理。 """ +import os # 这个redis 是 celery 使用的,包括存储队列信息还有部分统计信息 redis_config = { - "host": "192.168.42.23", + "host": os.environ.get("REDIS_PORT_6379_TCP_ADDR"), "port": 6379, "db": 0 } @@ -30,7 +31,7 @@ log_dir = "/root/log/" # 存储提交信息的数据库,是 celery 使用的,与 oj.settings/local_settings 等区分,那是 web 服务器访问的地址 submission_db = { - "host": "192.168.42.32", + "host": os.environ.get("submission_db_host"), "port": 3306, "db": "oj_submission", "user": "root", diff --git a/judge/judger_controller/tasks.py b/judge/judger_controller/tasks.py index d120ee3..4574982 100644 --- a/judge/judger_controller/tasks.py +++ b/judge/judger_controller/tasks.py @@ -11,7 +11,7 @@ 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 " \ + command = "%s run --privileged --rm " \ "--link mysql " \ "-v %s:/var/judger/test_case/ " \ "-v %s:/var/judger/code/ " \ diff --git a/oj/urls.py b/oj/urls.py index 1b5d10e..e190871 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -25,7 +25,6 @@ from contest_submission.views import contest_problem_my_submissions_list_page urlpatterns = [ - url(r'^install/$', "install.views.install"), url("^$", "account.views.page_jump", name="page_jump_api"), url(r'^docs/', include('rest_framework_swagger.urls')), url(r'^admin/$', TemplateView.as_view(template_name="admin/admin.html"), name="admin_spa_page"), diff --git a/problem/views.py b/problem/views.py index 3b736c9..dbe125a 100644 --- a/problem/views.py +++ b/problem/views.py @@ -24,6 +24,7 @@ import logging logger = logging.getLogger("app_info") + def problem_page(request, problem_id): try: problem = Problem.objects.get(id=problem_id, visible=True) diff --git a/static/src/css/global.css b/static/src/css/global.css index 2d4f618..3eebd70 100644 --- a/static/src/css/global.css +++ b/static/src/css/global.css @@ -41,4 +41,5 @@ label { pre { font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; + background-color: white; } diff --git a/submission/views.py b/submission/views.py index aad1560..6eb69fa 100644 --- a/submission/views.py +++ b/submission/views.py @@ -1,5 +1,6 @@ # coding=utf-8 import json +import logging import redis from django.shortcuts import render @@ -21,6 +22,9 @@ from .models import Submission from .serializers import CreateSubmissionSerializer, SubmissionSerializer, SubmissionhareSerializer +logger = logging.getLogger("app_info") + + class SubmissionAPIView(APIView): @login_required def post(self, request): @@ -44,7 +48,8 @@ class SubmissionAPIView(APIView): try: judge.delay(submission.id, problem.time_limit, problem.memory_limit, problem.test_case_id) - except Exception: + except Exception as e: + logger.error(e) return error_response(u"提交判题任务失败") # 修改用户解题状态 problems_status = json.loads(request.user.problems_status)