Merge branch 'dev' into new-arch

* dev: (27 commits)
  统一get参数格式
  修改一些错误
  这个是刚才api地方的,忘了add上了
  修改较多,涉及到小组管理员对比赛的管理,小组管理员可以看到他管理的小组的其他管理员创建的比赛,但看不到别人的题目,但是可以从前台看到比赛的题目,可以在比赛开始前测试题目
  修改小组列表模板,适应数据库的修改
  添加提升小组管理员的api,调整小组管理权限的认证方式
  修改后台小组管理功能添加设为管理员按钮,方便添加多管理员
  修改group的models添加小组管理员的多对多字段,把原来的管理员字段重命名为创建者
  修改学校判断和自动统一队形的方法
  统一格式
  注释掉了用户主页里还没有后端配套的submission部分,添加学校显示,修复了settings里codeforces用户名无法编辑的问题,原来是html里边拼错了
  统一userprofile字段的处理方式,都判断是否为none,修复typo
  修改settings中语言为新版本的'zh-hans'
  针对添加学号字段对页面的一些修改,注册是学校为青岛大学则显示学号字段,在user settings页面显示学号,并提供修改
  在UserProfile中添加学号字段
  吧if 。。。or...改成 if in
  修改错误
  验证小组邀请赛密码
  contest list 添加小组邀请赛和私有小组赛
  添加小组邀请赛
  ...
This commit is contained in:
virusdefender
2015-12-09 20:49:27 +08:00
32 changed files with 352 additions and 83 deletions

View File

@@ -8,8 +8,8 @@ from django.core.urlresolvers import reverse
from utils.shortcuts import error_response, error_page
from account.models import SUPER_ADMIN
from .models import (Contest, PASSWORD_PROTECTED_CONTEST, PUBLIC_CONTEST, GROUP_CONTEST,
from account.models import SUPER_ADMIN, ADMIN
from .models import (Contest, PASSWORD_PROTECTED_CONTEST, PASSWORD_PROTECTED_GROUP_CONTEST, PUBLIC_CONTEST, GROUP_CONTEST,
CONTEST_ENDED, CONTEST_NOT_START, CONTEST_UNDERWAY)
@@ -57,7 +57,10 @@ def check_user_contest_permission(func):
if request.user.admin_type == SUPER_ADMIN or request.user == contest.created_by:
return func(*args, **kwargs)
if request.user.admin_type == ADMIN:
contest_set = Contest.objects.filter(groups__in=request.user.managed_groups.all())
if contest in contest_set:
return func(*args, **kwargs)
# 管理员可见隐藏的比赛,已经先判断了身份
if not contest.visible:
if request.is_ajax():
@@ -83,6 +86,15 @@ def check_user_contest_permission(func):
else:
return render(request, "oj/contest/no_contest_permission.html",
{"reason": "group_limited", "show_tab": False, "contest": contest})
if contest.contest_type == PASSWORD_PROTECTED_GROUP_CONTEST:
if not contest.groups.filter(id__in=request.user.group_set.all()).exists():
if contest.id not in request.session.get("contests", []):
if request.is_ajax():
return error_response(u"请先输入密码")
else:
return render(request, "oj/contest/no_contest_permission.html",
{"reason": "password_protect", "show_tab": False, "contest": contest})
# 比赛没有开始
if contest.status == CONTEST_NOT_START:

View File

@@ -13,6 +13,7 @@ from judge.result import result
GROUP_CONTEST = 0
PUBLIC_CONTEST = 1
PASSWORD_PROTECTED_CONTEST = 2
PASSWORD_PROTECTED_GROUP_CONTEST = 3
CONTEST_NOT_START = 1
CONTEST_ENDED = -1

View File

@@ -17,13 +17,13 @@ from utils.shortcuts import (serializer_invalid_response, error_response,
success_response, paginate, error_page, paginate_data)
from account.models import SUPER_ADMIN, User
from account.decorators import login_required, super_admin_required
from group.models import Group
from group.models import Group, AdminGroupRelation, UserGroupRelation
from utils.cache import get_cache_redis
from submission.models import Submission
from problem.models import Problem
from .models import (Contest, ContestProblem, CONTEST_ENDED,
CONTEST_NOT_START, CONTEST_UNDERWAY, ContestRank)
from .models import GROUP_CONTEST, PUBLIC_CONTEST, PASSWORD_PROTECTED_CONTEST
from .models import GROUP_CONTEST, PUBLIC_CONTEST, PASSWORD_PROTECTED_CONTEST, PASSWORD_PROTECTED_GROUP_CONTEST
from .decorators import check_user_contest_permission
from .serializers import (CreateContestSerializer, ContestSerializer, EditContestSerializer,
CreateContestProblemSerializer, ContestProblemSerializer,
@@ -50,11 +50,11 @@ class ContestAdminAPIView(APIView):
if request.user.admin_type != SUPER_ADMIN:
return error_response(u"只有超级管理员才可创建公开赛")
if data["contest_type"] == PASSWORD_PROTECTED_CONTEST:
if data["contest_type"] in [PASSWORD_PROTECTED_CONTEST, PASSWORD_PROTECTED_GROUP_CONTEST]:
if not data["password"]:
return error_response(u"此比赛为有密码的公开赛,密码不可为空")
return error_response(u"此比赛为有密码的赛,密码不可为空")
# 没有密码的公开赛 没有密码的小组赛
elif data["contest_type"] == GROUP_CONTEST:
if data["contest_type"] == GROUP_CONTEST or data["contest_type"] == PASSWORD_PROTECTED_GROUP_CONTEST:
if request.user.admin_type == SUPER_ADMIN:
groups = Group.objects.filter(id__in=data["groups"])
else:
@@ -91,8 +91,10 @@ class ContestAdminAPIView(APIView):
try:
# 超级管理员可以编辑所有的
contest = Contest.objects.get(id=data["id"])
if request.user.admin_type != SUPER_ADMIN and contest.created_by != request.user:
return error_response(u"无权访问!")
if request.user.admin_type != SUPER_ADMIN:
contest_set = Contest.objects.filter(groups__in=request.user.managed_groups.all())
if contest not in contest_set:
return error_response(u"无权访问!")
except Contest.DoesNotExist:
return error_response(u"该比赛不存在!")
try:
@@ -107,7 +109,7 @@ class ContestAdminAPIView(APIView):
if data["contest_type"] == PASSWORD_PROTECTED_CONTEST:
if not data["password"]:
return error_response(u"此比赛为有密码的公开赛,密码不可为空")
elif data["contest_type"] == GROUP_CONTEST:
elif data["contest_type"] in [GROUP_CONTEST, PASSWORD_PROTECTED_GROUP_CONTEST]:
if request.user.admin_type == SUPER_ADMIN:
groups = Group.objects.filter(id__in=data["groups"])
else:
@@ -151,16 +153,18 @@ class ContestAdminAPIView(APIView):
# 普通管理员只能获取自己创建的题目
# 超级管理员可以获取全部的题目
contest = Contest.objects.get(id=contest_id)
if request.user.admin_type != SUPER_ADMIN and contest.created_by != request.user:
return error_response(u"题目不存在")
if request.user.admin_type != SUPER_ADMIN:
contest_set = Contest.objects.filter(groups__in=request.user.managed_groups.all())
if contest not in contest_set:
return error_response(u"比赛不存在")
return success_response(ContestSerializer(contest).data)
except Contest.DoesNotExist:
return error_response(u"题目不存在")
return error_response(u"比赛不存在")
if request.user.admin_type == SUPER_ADMIN:
contest = Contest.objects.all().order_by("-create_time")
else:
contest = Contest.objects.filter(created_by=request.user).order_by("-create_time")
contest = Contest.objects.filter(groups__in=request.user.managed_groups.all()).distinct().order_by("-create_time")
visible = request.GET.get("visible", None)
if visible:
contest = contest.filter(visible=(visible == "true"))
@@ -184,8 +188,10 @@ class ContestProblemAdminAPIView(APIView):
data = serializer.data
try:
contest = Contest.objects.get(id=data["contest_id"])
if request.user.admin_type != SUPER_ADMIN and contest.created_by != request.user:
return error_response(u"比赛不存在")
if request.user.admin_type != SUPER_ADMIN:
contest_set = Contest.objects.filter(groups__in=request.user.managed_groups.all())
if contest not in contest_set:
return error_response(u"比赛不存在")
except Contest.DoesNotExist:
return error_response(u"比赛不存在")
contest_problem = ContestProblem.objects.create(title=data["title"],
@@ -362,7 +368,10 @@ def contest_problem_page(request, contest_id, contest_problem_id):
request.user.admin_type == SUPER_ADMIN or \
request.user == contest.created_by:
show_submit_code_area = True
else:
contest_set = Contest.objects.filter(groups__in=request.user.managed_groups.all())
if contest in contest_set:
show_submit_code_area = True
return render(request, "oj/problem/contest_problem.html", {"problem": problem,
"contest": contest,
"samples": json.loads(problem.samples),