1717 success_response , paginate , error_page , paginate_data )
1818from account .models import SUPER_ADMIN , User
1919from account .decorators import login_required , super_admin_required
20- from group .models import Group
20+ from group .models import Group , AdminGroupRelation , UserGroupRelation
2121from utils .cache import get_cache_redis
2222from submission .models import Submission
2323from problem .models import Problem
2424from .models import (Contest , ContestProblem , CONTEST_ENDED ,
2525 CONTEST_NOT_START , CONTEST_UNDERWAY , ContestRank )
26- from .models import GROUP_CONTEST , PUBLIC_CONTEST , PASSWORD_PROTECTED_CONTEST
26+ from .models import GROUP_CONTEST , PUBLIC_CONTEST , PASSWORD_PROTECTED_CONTEST , PASSWORD_PROTECTED_GROUP_CONTEST
2727from .decorators import check_user_contest_permission
2828from .serializers import (CreateContestSerializer , ContestSerializer , EditContestSerializer ,
2929 CreateContestProblemSerializer , ContestProblemSerializer ,
@@ -50,11 +50,11 @@ def post(self, request):
5050 if request .user .admin_type != SUPER_ADMIN :
5151 return error_response (u"只有超级管理员才可创建公开赛" )
5252
53- if data ["contest_type" ] == PASSWORD_PROTECTED_CONTEST :
53+ if data ["contest_type" ] in [ PASSWORD_PROTECTED_CONTEST , PASSWORD_PROTECTED_GROUP_CONTEST ] :
5454 if not data ["password" ]:
55- return error_response (u"此比赛为有密码的公开赛 ,密码不可为空" )
55+ return error_response (u"此比赛为有密码的比赛 ,密码不可为空" )
5656 # 没有密码的公开赛 没有密码的小组赛
57- elif data ["contest_type" ] == GROUP_CONTEST :
57+ if data ["contest_type" ] == GROUP_CONTEST or data [ "contest_type" ] == PASSWORD_PROTECTED_GROUP_CONTEST :
5858 if request .user .admin_type == SUPER_ADMIN :
5959 groups = Group .objects .filter (id__in = data ["groups" ])
6060 else :
@@ -91,8 +91,10 @@ def put(self, request):
9191 try :
9292 # 超级管理员可以编辑所有的
9393 contest = Contest .objects .get (id = data ["id" ])
94- if request .user .admin_type != SUPER_ADMIN and contest .created_by != request .user :
95- return error_response (u"无权访问!" )
94+ if request .user .admin_type != SUPER_ADMIN :
95+ contest_set = Contest .objects .filter (groups__in = request .user .managed_groups .all ())
96+ if contest not in contest_set :
97+ return error_response (u"无权访问!" )
9698 except Contest .DoesNotExist :
9799 return error_response (u"该比赛不存在!" )
98100 try :
@@ -107,7 +109,7 @@ def put(self, request):
107109 if data ["contest_type" ] == PASSWORD_PROTECTED_CONTEST :
108110 if not data ["password" ]:
109111 return error_response (u"此比赛为有密码的公开赛,密码不可为空" )
110- elif data ["contest_type" ] == GROUP_CONTEST :
112+ elif data ["contest_type" ] in [ GROUP_CONTEST , PASSWORD_PROTECTED_GROUP_CONTEST ] :
111113 if request .user .admin_type == SUPER_ADMIN :
112114 groups = Group .objects .filter (id__in = data ["groups" ])
113115 else :
@@ -151,16 +153,18 @@ def get(self, request):
151153 # 普通管理员只能获取自己创建的题目
152154 # 超级管理员可以获取全部的题目
153155 contest = Contest .objects .get (id = contest_id )
154- if request .user .admin_type != SUPER_ADMIN and contest .created_by != request .user :
155- return error_response (u"题目不存在" )
156+ if request .user .admin_type != SUPER_ADMIN :
157+ contest_set = Contest .objects .filter (groups__in = request .user .managed_groups .all ())
158+ if contest not in contest_set :
159+ return error_response (u"比赛不存在" )
156160 return success_response (ContestSerializer (contest ).data )
157161 except Contest .DoesNotExist :
158- return error_response (u"题目不存在 " )
162+ return error_response (u"比赛不存在 " )
159163
160164 if request .user .admin_type == SUPER_ADMIN :
161165 contest = Contest .objects .all ().order_by ("-create_time" )
162166 else :
163- contest = Contest .objects .filter (created_by = request .user ).order_by ("-create_time" )
167+ contest = Contest .objects .filter (groups__in = request .user . managed_groups . all ()). distinct ( ).order_by ("-create_time" )
164168 visible = request .GET .get ("visible" , None )
165169 if visible :
166170 contest = contest .filter (visible = (visible == "true" ))
@@ -184,8 +188,10 @@ def post(self, request):
184188 data = serializer .data
185189 try :
186190 contest = Contest .objects .get (id = data ["contest_id" ])
187- if request .user .admin_type != SUPER_ADMIN and contest .created_by != request .user :
188- return error_response (u"比赛不存在" )
191+ if request .user .admin_type != SUPER_ADMIN :
192+ contest_set = Contest .objects .filter (groups__in = request .user .managed_groups .all ())
193+ if contest not in contest_set :
194+ return error_response (u"比赛不存在" )
189195 except Contest .DoesNotExist :
190196 return error_response (u"比赛不存在" )
191197 contest_problem = ContestProblem .objects .create (title = data ["title" ],
@@ -362,7 +368,10 @@ def contest_problem_page(request, contest_id, contest_problem_id):
362368 request .user .admin_type == SUPER_ADMIN or \
363369 request .user == contest .created_by :
364370 show_submit_code_area = True
365-
371+ else :
372+ contest_set = Contest .objects .filter (groups__in = request .user .managed_groups .all ())
373+ if contest in contest_set :
374+ show_submit_code_area = True
366375 return render (request , "oj/problem/contest_problem.html" , {"problem" : problem ,
367376 "contest" : contest ,
368377 "samples" : json .loads (problem .samples ),
0 commit comments