Accept Merge Request #245 封榜的时候只显示自己的提交 : (virusdefender-dev -> dev)

Merge Request: 封榜的时候只显示自己的提交
Created By: @virusdefender
Reviewed By: @esp 
Accepted By: @virusdefender
URL: https://coding.net/u/virusdefender/p/qduoj/git/merge/245
This commit is contained in:
virusdefender
2015-09-17 11:36:51 +08:00
11 changed files with 56 additions and 26 deletions

View File

@@ -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'{}'),
),
]

View File

@@ -31,8 +31,7 @@ class User(AbstractBaseUser):
# 0代表不是管理员 1是普通管理员 2是超级管理员 # 0代表不是管理员 1是普通管理员 2是超级管理员
admin_type = models.IntegerField(default=0) admin_type = models.IntegerField(default=0)
# JSON字典用来表示该用户的问题的解决状态 1为ac2为正在进行 # JSON字典用来表示该用户的问题的解决状态 1为ac2为正在进行
problems_status = models.TextField(blank=True) problems_status = models.TextField(default="{}")
USERNAME_FIELD = 'username' USERNAME_FIELD = 'username'
REQUIRED_FIELDS = [] REQUIRED_FIELDS = []

View File

@@ -391,7 +391,7 @@ def _cmp(x, y):
return -1 return -1
def get_the_time_format(seconds): def get_the_formatted_time(seconds):
if not seconds: if not seconds:
return "" return ""
result = str(seconds % 60) result = str(seconds % 60)
@@ -427,7 +427,7 @@ def contest_rank_page(request, contest_id):
"first_achieved": status.first_achieved, "first_achieved": status.first_achieved,
"ac": status.ac, "ac": status.ac,
"failed_number": status.total_submission_number, "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: if status.ac:
result[i]["problems"][-1]["failed_number"] -= 1 result[i]["problems"][-1]["failed_number"] -= 1
except ContestSubmission.DoesNotExist: except ContestSubmission.DoesNotExist:
@@ -436,7 +436,8 @@ def contest_rank_page(request, contest_id):
user= User.objects.get(id=result[i]["user_id"]) user= User.objects.get(id=result[i]["user_id"])
result[i]["username"] = user.username result[i]["username"] = user.username
result[i]["real_name"] = user.real_name 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) result = sorted(result, cmp=_cmp, reverse=True)
r.set("contest_rank_" + contest_id, json.dumps(list(result))) r.set("contest_rank_" + contest_id, json.dumps(list(result)))
else: else:
@@ -451,5 +452,5 @@ def contest_rank_page(request, contest_id):
{"contest": contest, "contest_problems": contest_problems, {"contest": contest, "contest_problems": contest_problems,
"result": result, "result": result,
"auto_refresh": request.GET.get("auto_refresh", None) == "true", "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}) "real_time_rank": contest.real_time_rank})

View File

@@ -1,9 +1,11 @@
# coding=utf-8 # coding=utf-8
import json import json
from datetime import datetime
import redis import redis
import pytz
from django.shortcuts import render from django.shortcuts import render
from django.core.paginator import Paginator from django.core.paginator import Paginator
from django.utils import timezone
from rest_framework.views import APIView from rest_framework.views import APIView
from judge.judger_controller.tasks import judge 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}) {"submissions": submissions, "problem": contest_problem})
@login_required @check_user_contest_permission
def contest_problem_submissions_list_page(request, contest_id, page=1): 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) contest = Contest.objects.get(id=contest_id)
except Contest.DoesNotExist: except Contest.DoesNotExist:
return error_page(request, u"比赛不存在") return error_page(request, u"比赛不存在")
# 以下是本场比赛中所有的提交
submissions = Submission.objects.filter(contest_id=contest_id). \ 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") 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) language = request.GET.get("language", None)
filter = None filter = None
if language: 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", return render(request, "oj/contest/submissions_list.html",
{"submissions": current_page, "page": int(page), {"submissions": current_page, "page": int(page),
"previous_page": previous_page, "next_page": next_page, "start_id": int(page) * 20 - 20, "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): class ContestSubmissionAdminAPIView(APIView):

View File

@@ -4,9 +4,10 @@
此文件包含 celery 的部分配置,但是 celery 并不是运行在docker 中的,所以本配置文件中的 redis和 MySQL 的地址就应该是 此文件包含 celery 的部分配置,但是 celery 并不是运行在docker 中的,所以本配置文件中的 redis和 MySQL 的地址就应该是
运行 redis 和 MySQL 的 docker 容器的地址了。怎么获取这个地址见帮助文档。测试用例的路径和源代码路径同理。 运行 redis 和 MySQL 的 docker 容器的地址了。怎么获取这个地址见帮助文档。测试用例的路径和源代码路径同理。
""" """
import os
# 这个redis 是 celery 使用的,包括存储队列信息还有部分统计信息 # 这个redis 是 celery 使用的,包括存储队列信息还有部分统计信息
redis_config = { redis_config = {
"host": "192.168.42.23", "host": os.environ.get("REDIS_PORT_6379_TCP_ADDR"),
"port": 6379, "port": 6379,
"db": 0 "db": 0
} }
@@ -30,7 +31,7 @@ log_dir = "/root/log/"
# 存储提交信息的数据库,是 celery 使用的,与 oj.settings/local_settings 等区分,那是 web 服务器访问的地址 # 存储提交信息的数据库,是 celery 使用的,与 oj.settings/local_settings 等区分,那是 web 服务器访问的地址
submission_db = { submission_db = {
"host": "192.168.42.32", "host": os.environ.get("submission_db_host"),
"port": 3306, "port": 3306,
"db": "oj_submission", "db": "oj_submission",
"user": "root", "user": "root",

View File

@@ -11,7 +11,7 @@ from settings import docker_config, source_code_dir, test_case_dir, log_dir, sub
@app.task @app.task
def judge(submission_id, time_limit, memory_limit, test_case_id): def judge(submission_id, time_limit, memory_limit, test_case_id):
try: try:
command = "%s run -t -i --privileged --rm " \ command = "%s run --privileged --rm " \
"--link mysql " \ "--link mysql " \
"-v %s:/var/judger/test_case/ " \ "-v %s:/var/judger/test_case/ " \
"-v %s:/var/judger/code/ " \ "-v %s:/var/judger/code/ " \

View File

@@ -46,10 +46,7 @@ class MessageQueue(object):
except User.DoesNotExist: except User.DoesNotExist:
logger.warning("Submission user does not exist, submission_id: " + submission_id) logger.warning("Submission user does not exist, submission_id: " + submission_id)
continue continue
if user.problems_status: problems_status = json.loads(user.problems_status)
problems_status = json.loads(user.problems_status)
else:
problems_status = {}
problems_status[str(problem.id)] = 1 problems_status[str(problem.id)] = 1
user.problems_status = json.dumps(problems_status) user.problems_status = json.dumps(problems_status)
user.save() user.save()

View File

@@ -25,7 +25,6 @@ from contest_submission.views import contest_problem_my_submissions_list_page
urlpatterns = [ urlpatterns = [
url(r'^install/$', "install.views.install"),
url("^$", "account.views.page_jump", name="page_jump_api"), url("^$", "account.views.page_jump", name="page_jump_api"),
url(r'^docs/', include('rest_framework_swagger.urls')), url(r'^docs/', include('rest_framework_swagger.urls')),
url(r'^admin/$', TemplateView.as_view(template_name="admin/admin.html"), name="admin_spa_page"), url(r'^admin/$', TemplateView.as_view(template_name="admin/admin.html"), name="admin_spa_page"),

View File

@@ -24,6 +24,7 @@ import logging
logger = logging.getLogger("app_info") logger = logging.getLogger("app_info")
def problem_page(request, problem_id): def problem_page(request, problem_id):
try: try:
problem = Problem.objects.get(id=problem_id, visible=True) problem = Problem.objects.get(id=problem_id, visible=True)
@@ -282,7 +283,7 @@ def problem_list_page(request, page=1):
except Exception: except Exception:
pass pass
if request.user.is_authenticated() and request.user.problems_status: if request.user.is_authenticated():
problems_status = json.loads(request.user.problems_status) problems_status = json.loads(request.user.problems_status)
else: else:
problems_status = {} problems_status = {}

View File

@@ -41,4 +41,5 @@ label {
pre { pre {
font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
background-color: white;
} }

View File

@@ -1,5 +1,6 @@
# coding=utf-8 # coding=utf-8
import json import json
import logging
import redis import redis
from django.shortcuts import render from django.shortcuts import render
@@ -21,6 +22,9 @@ from .models import Submission
from .serializers import CreateSubmissionSerializer, SubmissionSerializer, SubmissionhareSerializer from .serializers import CreateSubmissionSerializer, SubmissionSerializer, SubmissionhareSerializer
logger = logging.getLogger("app_info")
class SubmissionAPIView(APIView): class SubmissionAPIView(APIView):
@login_required @login_required
def post(self, request): def post(self, request):
@@ -44,13 +48,11 @@ class SubmissionAPIView(APIView):
try: try:
judge.delay(submission.id, problem.time_limit, problem.memory_limit, problem.test_case_id) 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"提交判题任务失败") return error_response(u"提交判题任务失败")
# 修改用户解题状态 # 修改用户解题状态
if request.user.problems_status: problems_status = json.loads(request.user.problems_status)
problems_status = json.loads(request.user.problems_status)
else:
problems_status = {}
problems_status[str(data["problem_id"])] = 2 problems_status[str(data["problem_id"])] = 2
request.user.problems_status = json.dumps(problems_status) request.user.problems_status = json.dumps(problems_status)
request.user.save() request.user.save()