diff --git a/account/migrations/0003_auto_20150915_2025.py b/account/migrations/0003_auto_20150915_2025.py new file mode 100644 index 0000000..ff6b0ea --- /dev/null +++ b/account/migrations/0003_auto_20150915_2025.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', '0002_user_problems_status'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='problems_status', + field=models.TextField(default=b'{}'), + ), + ] diff --git a/account/models.py b/account/models.py index 754e178..3245333 100644 --- a/account/models.py +++ b/account/models.py @@ -31,8 +31,7 @@ class User(AbstractBaseUser): # 0代表不是管理员 1是普通管理员 2是超级管理员 admin_type = models.IntegerField(default=0) # JSON字典用来表示该用户的问题的解决状态 1为ac,2为正在进行 - problems_status = models.TextField(blank=True) - + problems_status = models.TextField(default="{}") USERNAME_FIELD = 'username' REQUIRED_FIELDS = [] diff --git a/contest/views.py b/contest/views.py index 5bb089b..c1c1958 100644 --- a/contest/views.py +++ b/contest/views.py @@ -391,7 +391,7 @@ def _cmp(x, y): return -1 -def get_the_time_format(seconds): +def get_the_formatted_time(seconds): if not seconds: return "" result = str(seconds % 60) @@ -427,7 +427,7 @@ def contest_rank_page(request, contest_id): "first_achieved": status.first_achieved, "ac": status.ac, "failed_number": status.total_submission_number, - "ac_time": get_the_time_format(status.ac_time)}) + "ac_time": get_the_formatted_time(status.ac_time)}) if status.ac: result[i]["problems"][-1]["failed_number"] -= 1 except ContestSubmission.DoesNotExist: @@ -436,7 +436,8 @@ def contest_rank_page(request, contest_id): 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[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 2358b07..59ee7fa 100644 --- a/contest_submission/views.py +++ b/contest_submission/views.py @@ -1,9 +1,11 @@ # coding=utf-8 import json +from datetime import datetime import redis +import pytz from django.shortcuts import render from django.core.paginator import Paginator - +from django.utils import timezone from rest_framework.views import APIView from judge.judger_controller.tasks import judge @@ -75,7 +77,7 @@ def contest_problem_my_submissions_list_page(request, contest_id, contest_proble {"submissions": submissions, "problem": contest_problem}) -@login_required +@check_user_contest_permission def contest_problem_submissions_list_page(request, contest_id, page=1): """ 单个比赛中的所有提交(包含自己和别人,自己可查提交结果,其他人不可查) @@ -84,9 +86,17 @@ 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"比赛不存在") - # 以下是本场比赛中所有的提交 - 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") + + 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 if language: @@ -131,7 +141,7 @@ def contest_problem_submissions_list_page(request, contest_id, page=1): return render(request, "oj/contest/submissions_list.html", {"submissions": current_page, "page": int(page), "previous_page": previous_page, "next_page": next_page, "start_id": int(page) * 20 - 20, - "contest": contest, "filter":filter}) + "contest": contest, "filter": filter}) class ContestSubmissionAdminAPIView(APIView): 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/mq/scripts/info.py b/mq/scripts/info.py index 3a5fe18..567eebb 100644 --- a/mq/scripts/info.py +++ b/mq/scripts/info.py @@ -46,10 +46,7 @@ class MessageQueue(object): 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 = json.loads(user.problems_status) problems_status[str(problem.id)] = 1 user.problems_status = json.dumps(problems_status) user.save() diff --git a/oj/urls.py b/oj/urls.py index eda20bb..d9373bb 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 84ca58d..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) @@ -282,7 +283,7 @@ def problem_list_page(request, page=1): except Exception: pass - if request.user.is_authenticated() and request.user.problems_status: + if request.user.is_authenticated(): problems_status = json.loads(request.user.problems_status) else: problems_status = {} 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 baa81d4..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,13 +48,11 @@ 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"提交判题任务失败") # 修改用户解题状态 - if request.user.problems_status: - problems_status = json.loads(request.user.problems_status) - else: - problems_status = {} + problems_status = json.loads(request.user.problems_status) problems_status[str(data["problem_id"])] = 2 request.user.problems_status = json.dumps(problems_status) request.user.save()