Merge branch 'dev-sxw' into virusdefender-dev

* dev-sxw:
  实现了比赛提交列表里封榜的行为,封榜以后只显示缓存里的提交数据和封榜后自己的提交,封榜以后rank不再刷新(rank里还不会显示自己封榜以后的提交。。。这好像不对呀)
  增加比赛提交页面封榜行为
  修改函数名称
  为User   problems_status 添加默认值,并精简了相关代码

Conflicts:
	contest/views.py
This commit is contained in:
virusdefender 2015-09-17 10:12:43 +08:00
commit c713b6d118
7 changed files with 40 additions and 20 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:

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,14 @@ 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")
# 封榜的时候只能看到自己的提交
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 +138,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

@ -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

@ -283,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

@ -52,10 +52,7 @@ class SubmissionAPIView(APIView):
logger.error(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()