def download(request): user = user_info.validate_user(request.user) if request.method == "POST": what = request.POST.get("type") if what == "scoreboard": scoreboard_type = request.POST.get("scoreboard_type") cid = request.POST.get("contest") scoreboard_file = get_scoreboard_csv(cid, scoreboard_type) return scoreboard_file elif what == "public_user_password": cid = request.POST.get("contest") contest = get_contest_or_404(cid) if user_info.has_contest_ownership(user, contest) or user.has_admin_auth(): logger.info( "Contest:User %s download Contest %s - %s public user password!" % (request.user, contest.id, contest.cname) ) return get_public_user_password_csv(contest) else: raise PermissionDenied raise Http404("file not found") elif request.method == "GET": if request.GET.get("cid"): cid = request.GET.get("cid") contest = get_contest_or_404(cid) if user_info.has_contest_ownership(user, contest) or user.has_admin_auth(): return render_index(request, "contest/download.html", {"contest": contest}) else: raise PermissionDenied
def download(request): user = user_info.validate_user(request.user) if request.method == 'POST': what = request.POST.get('type') if what == 'scoreboard': scoreboard_type = request.POST.get('scoreboard_type') cid = request.POST.get('contest') scoreboard_file = get_scoreboard_csv(cid, scoreboard_type) return scoreboard_file elif what == 'public_user_password': cid = request.POST.get('contest') contest = get_contest_or_404(cid) if user_info.has_contest_ownership(user, contest) or\ user.has_admin_auth(): logger.info('Contest:User %s download Contest %s - %s public user password!' % (request.user, contest.id, contest.cname)) return get_public_user_password_csv(contest) else: raise PermissionDenied raise Http404('file not found') elif request.method == 'GET': if request.GET.get('cid'): cid = request.GET.get('cid') contest = get_contest_or_404(cid) if user_info.has_contest_ownership(user, contest) or user.has_admin_auth(): return render_index(request,'contest/download.html',{'contest':contest}) else: raise PermissionDenied
def download(request): user = user_info.validate_user(request.user) if request.method == 'POST': what = request.POST.get('type') if what == 'scoreboard': scoreboard_type = request.POST.get('scoreboard_type') cid = request.POST.get('contest') scoreboard_file = get_scoreboard_csv(cid, scoreboard_type) return scoreboard_file elif what == 'public_user_password': cid = request.POST.get('contest') contest = get_contest_or_404(cid) if user_info.has_contest_ownership(user, contest) or\ user.has_admin_auth(): logger.info( 'Contest:User %s download Contest %s - %s public user password!' % (request.user, contest.id, contest.cname)) return get_public_user_password_csv(contest) else: raise PermissionDenied raise Http404('file not found') elif request.method == 'GET': if request.GET.get('cid'): cid = request.GET.get('cid') contest = get_contest_or_404(cid) if user_info.has_contest_ownership(user, contest) or user.has_admin_auth(): return render_index(request, 'contest/download.html', {'contest': contest}) else: raise PermissionDenied
def can_rejudge(submission, user): """Test if the user can rejudge that submission Args: submission: the submission to show user: an User object Returns: a boolean of the judgement """ user = validate_user(user) # There are 2 kinds of people can rejudge submission: # 1. Admin Almighty if user.has_admin_auth(): return True # 2. Problem owner if has_problem_ownership(user, submission.problem): return True # 3. Contest owner / coowner contests = Contest.objects.filter( problem=submission.problem, end_time__gte=submission.submit_time, creation_time__lte=submission.submit_time) for contest in contests: if has_contest_ownership(user, contest): return True return False
def contest(request, cid): user = user_info.validate_user(request.user) try: contest = Contest.objects.get(id = cid) except Contest.DoesNotExist: logger.warning('Contest: Can not find contest %s!' % cid) raise Http404('Contest does not exist') now = datetime.now() #if contest has not started and user is not the owner if ((contest.start_time < now) or\ user_info.has_contest_ownership(user,contest) or\ user.has_admin_auth()): for problem in contest.problem.all(): problem.testcase = get_testcase(problem) scoreboard = get_scoreboard(contest) status = contest_status(request, contest) clarifications = get_clarifications(user,contest) initial_form = {'contest':contest,'asker':user} form = ClarificationForm(initial=initial_form) initial_reply_form = {'contest':contest,'replier':user} reply_form = ReplyForm(initial = initial_reply_form) return render_index(request, 'contest/contest.html', {'contest':contest, 'clarifications':clarifications, 'form':form, 'reply_form':reply_form, 'scoreboard':scoreboard, 'status': status}) else: raise PermissionDenied
def register_public_user(request, public_user, contest): user = user_info.validate_user(request.user) if user_info.has_contest_ownership(user, contest) or user.has_admin_auth(): if not is_integer(public_user): message = "invalid input!" messages.warning(request, message) return redirect("contest:archive") user_registered = public_user_register_contest(public_user, contest) if user_registered: message = 'User %s registered %s public users to Contest %s- "%s"!' % ( user.username, user_registered, contest.id, contest.cname, ) messages.success(request, message) if int(public_user) > settings.MAX_PUBLIC_USER: message = "Requested more than max! Set public users to %s" % (settings.MAX_PUBLIC_USER) messages.warning(request, message) download_url = reverse("contest:download") + "?cid=" + str(contest.id) return HttpResponseRedirect(download_url) else: if int(public_user) == 0: message = "Remove all public users!" messages.warning(request, message) return redirect("contest:archive") else: message = 'Cannot register public user to Contest %s- "%s"!' % (contest.id, contest.cname) messages.error(request, message) return redirect("contest:archive") raise PermissionDenied
def register_public_user(request, public_user, contest): user = user_info.validate_user(request.user) if (user_info.has_contest_ownership(user, contest) or user.has_admin_auth()): if not is_integer(public_user): message = 'invalid input!' messages.warning(request, message) return redirect('contest:archive') user_registered = public_user_register_contest(public_user, contest) if user_registered: message = 'User %s registered %s public users to Contest %s- "%s"!' % \ (user.username, user_registered, contest.id, contest.cname) messages.success(request, message) if int(public_user) > settings.MAX_PUBLIC_USER: message = 'Requested more than max! Set public users to %s' % \ (settings.MAX_PUBLIC_USER) messages.warning(request, message) download_url = reverse('contest:download') + '?cid=' + str( contest.id) return HttpResponseRedirect(download_url) else: if int(public_user) == 0: message = 'Remove all public users!' messages.warning(request, message) return redirect('contest:archive') else: message = 'Cannot register public user to Contest %s- "%s"!' % \ (contest.id, contest.cname) messages.error(request, message) return redirect('contest:archive') raise PermissionDenied
def get_clarifications(user, contest): if has_contest_ownership(user, contest) or user.has_admin_auth(): return Clarification.objects.filter(contest=contest) reply_all = Clarification.objects.filter(contest=contest, reply_all=True) if user.is_authenticated(): user_ask = Clarification.objects.filter(contest=contest, asker=user) return reply_all | user_ask return reply_all
def show_register_btn(user, contest): if not user.is_authenticated(): return False has_not_started = not contest_info.has_started(contest) own_contest = user_info.has_contest_ownership(user, contest) is_not_public_user = not is_public_user(user) user_is_admin = user.has_admin_auth() return has_not_started and (own_contest or is_not_public_user or user_is_admin)
def show_contest_submission(submission, user, contests): for contest in contests: if not has_contest_ownership(user, contest): continue contestants = get_contestant(contest) if submission.user in contestants: return True return False
def user_can_register_contest(user, contest): if not user.is_authenticated(): return False if user.has_admin_auth(): return False if is_public_user(user): return False has_ownership = has_contest_ownership(user, contest) if has_ownership: return False return True
def show_contest_submission(submission, user, contests): for contest in contests: if not has_contest_ownership(user, contest): continue if submission.user == contest.owner or \ submission.user in contest.coowner.all(): return True contestants = get_contestant(contest) if submission.user in contestants: return True return False
def get_visible_submission(user): """Get all submissions that can be viewed by the given user.""" user = validate_user(user) submissions = Submission.objects.all() # Admin can view all submissions if user.has_admin_auth(): return submissions # No one can view admins' submissions submissions = submissions.exclude( user__in=User.objects.filter(user_level=User.ADMIN) ) # Invisible problem is invisible_problem = Problem.objects.filter( visible=False ).exclude( owner=user ) # Not ended contest has something to judge contests = Contest.objects.filter( is_homework=False, end_time__gte=datetime.now() ) for contest in contests: # Those who don't have contest ownership has some limitations if not has_contest_ownership(user, contest): # 1. Can't view contest owner/coowners' submission before the end submissions = submissions.exclude( Q(user__in=contest.coowner.all()) | Q(user=contest.owner), problem__in=contest.problem.all(), submit_time__gte=contest.creation_time ) # 2. Can't view other contestants' submission after contest freeze submissions = submissions.exclude( user=get_contestant(contest).exclude(username=user.username), problem__in=contest.problem.all(), submit_time__gte=get_freeze_time_datetime(contest) ) else: # Exclude contest problem from invlsible problem for owner/coowners invisible_problem = invisible_problem.exclude( id__in=contest.problem.filter(visible=False).values_list('id', flat=True) ) # Invisible problems' submission can't be seen submissions = submissions.exclude( problem__in=invisible_problem ) return submissions
def rejudge(request): if not request.user.has_subjudge_auth(): logger.warning( 'Contest:User %s try to rejudge. Does not have subjudge permission' % (request.user)) raise PermissionDenied contest_id = request.POST.get('contest') problem_id = request.POST.get('problem') try: contest = Contest.objects.get(pk=contest_id) except: # contest not exist logger.warning('rejudge: Contest %s not found!' % contest_id) message = 'Contest does not exist! Can not rejudge' messages.error(request, message) return HttpResponseRedirect(request.META.get('HTTP_REFERER')) if not user_info.has_contest_ownership(request.user, contest) and\ not request.user.has_admin_auth(): logger.warning( 'Contest:User %s try to rejudge. Does not have contest ownership' % (request.user)) raise PermissionDenied if problem_id is not None: try: problem = Problem.objects.get(pk=problem_id) except: # problem not exist logger.warning('rejudge: Problem %s not found!' % problem_id) message = 'Problem does not exist! Can not rejudge' messages.error(request, message) return HttpResponseRedirect(request.META.get('HTTP_REFERER')) rejudge_contest_problem(contest, problem) logger.info('User %s rejudge Problem %s in Contest %s!' % (request.user.username, problem.id, contest.id)) message = 'Successfully rejudge Problem %s - %s in Contest %s - %s!' %\ (problem.id, problem.pname, contest.id, contest.cname) messages.success(request, message) else: rejudge_obj(contest) logger.info('User %s rejudge Contest %s!' % (request.user.username, contest_id)) message = 'Successfully rejudge Contest %s - %s!' %\ (contest.id, contest.cname) messages.success(request, message) return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
def rejudge(request): if not request.user.has_subjudge_auth() : logger.warning( 'Contest:User %s try to rejudge. Does not have subjudge permission' % (request.user)) raise PermissionDenied contest_id = request.POST.get('contest') problem_id = request.POST.get('problem') try: contest = Contest.objects.get(pk = contest_id) except: #contest not exist logger.warning('rejudge: Contest %s not found!' % contest_id) message = 'Contest does not exist! Can not rejudge' messages.error(request, message) return HttpResponseRedirect(request.META.get('HTTP_REFERER')) if not user_info.has_contest_ownership(request.user, contest) and\ not request.user.has_admin_auth(): logger.warning( 'Contest:User %s try to rejudge. Does not have contest ownership' % (request.user)) raise PermissionDenied if problem_id is not None: try: problem = Problem.objects.get(pk = problem_id) except: #problem not exist logger.warning('rejudge: Problem %s not found!' % problem_id) message = 'Problem does not exist! Can not rejudge' messages.error(request, message) return HttpResponseRedirect(request.META.get('HTTP_REFERER')) rejudge_contest_problem(contest, problem) logger.info('User %s rejudge Problem %s in Contest %s!' %\ (request.user.username,problem.id,contest.id)) message = 'Successfully rejudge Problem %s - %s in Contest %s - %s!' %\ (problem.id, problem.pname, contest.id, contest.cname) messages.success(request, message) else: rejudge_obj(contest) logger.info('User %s rejudge Contest %s!' %\ (request.user.username,contest_id)) message = 'Successfully rejudge Contest %s - %s!' %\ (contest.id, contest.cname) messages.success(request, message) return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
def get_visible_submission(user): """Get all submissions that can be viewed by the given user.""" user = validate_user(user) submissions = Submission.objects.all() # Admin can view all submissions if user.has_admin_auth(): return submissions # No one can view admins' submissions submissions = submissions.exclude(user__in=User.objects.filter( user_level=User.ADMIN)) # Invisible problem is invisible_problem = Problem.objects.filter(visible=False).exclude( owner=user) # Not ended contest has something to judge contests = Contest.objects.filter(is_homework=False, end_time__gte=datetime.now()) for contest in contests: # Those who don't have contest ownership has some limitations if not has_contest_ownership(user, contest): # 1. Can't view contest owner/coowners' submission before the end submissions = submissions.exclude( Q(user__in=contest.coowner.all()) | Q(user=contest.owner), problem__in=contest.problem.all(), submit_time__gte=contest.creation_time) # 2. Can't view other contestants' submission after contest freeze submissions = submissions.exclude( user=get_contestant(contest).exclude(username=user.username), problem__in=contest.problem.all(), submit_time__gte=get_freeze_time_datetime(contest)) else: # Exclude contest problem from invlsible problem for owner/coowners invisible_problem = invisible_problem.exclude( id__in=contest.problem.filter( visible=False).values_list('id', flat=True)) # Invisible problems' submission can't be seen submissions = submissions.exclude(problem__in=invisible_problem) return submissions
def contest(request, cid): user = user_info.validate_user(request.user) try: contest = Contest.objects.get(id=cid) except Contest.DoesNotExist: logger.warning("Contest: Can not find contest %s!" % cid) raise Http404("Contest does not exist") now = datetime.now() # if contest has not started and user is not the owner if (contest.start_time < now) or user_info.has_contest_ownership(user, contest) or user.has_admin_auth(): contest.problems = contest.problem.all() for problem in contest.problems: problem.testcase = get_testcase(problem) problem = verify_problem_code(problem) problem.in_contest = check_in_contest(problem) scoreboard = get_scoreboard(user, contest) status = contest_status(request, contest) clarifications = get_clarifications(user, contest) initial_form = {"contest": contest, "asker": user} form = ClarificationForm(initial=initial_form) initial_reply_form = {"contest": contest, "replier": user} reply_form = ReplyForm(initial=initial_reply_form) return render_index( request, "contest/contest.html", { "contest": contest, "clarifications": clarifications, "form": form, "reply_form": reply_form, "scoreboard": scoreboard, "status": status, }, ) else: raise PermissionDenied
def contest(request, cid): user = user_info.validate_user(request.user) try: contest = Contest.objects.get(id=cid) except Contest.DoesNotExist: logger.warning('Contest: Can not find contest %s!' % cid) raise Http404('Contest does not exist') now = datetime.now() # if contest has not started and user is not the owner if ((contest.start_time < now) or user_info.has_contest_ownership(user, contest) or user.has_admin_auth()): contest.problems = contest.problem.all() for problem in contest.problems: problem.testcase = get_testcase(problem) problem = verify_problem_code(problem) problem.in_contest = check_in_contest(problem) scoreboard = get_scoreboard(user, contest) status = contest_status(request, contest) clarifications = get_clarifications(user, contest) initial_form = {'contest': contest, 'asker': user} form = ClarificationForm(initial=initial_form) initial_reply_form = {'contest': contest, 'replier': user} reply_form = ReplyForm(initial=initial_reply_form) return render_index( request, 'contest/contest.html', { 'contest': contest, 'clarifications': clarifications, 'form': form, 'reply_form': reply_form, 'scoreboard': scoreboard, 'status': status }) else: raise PermissionDenied
def can_edit_contest(user, contest): user = validate_user(user) return user.has_admin_auth() or has_contest_ownership(user, contest)
def can_ask(user, contest): user = validate_user(user) user_is_contestant = is_contestant(user, contest) user_is_owner_coowner = has_contest_ownership(user, contest) user_is_admin = user.has_admin_auth() return user_is_contestant | user_is_owner_coowner | user_is_admin
def get_scoreboard(user, contest): contestants = get_contestant_list(contest) scoreboard = Scoreboard(contest.start_time) # Store contest's problem data for problem in contest.problem.all(): total_testcases = get_total_testcases(problem) new_problem = ScoreboardProblem(problem.id, problem.pname, total_testcases) new_problem.no_submission = True scoreboard.add_problem(new_problem) # For Contestants' data for contestant in contestants: new_contestant = ScoreboardUser(contestant.user.username) for problem in contest.problem.all(): if (is_ended(contest) or has_contest_ownership(user, contest)): submissions = get_contestant_problem_submission_list( contest, contestant, problem) else: submissions = get_contestant_problem_submission_list_before_freeze_time( contest, contestant, problem) total_testcases = get_total_testcases(problem) new_problem = UserProblem(problem.id, total_testcases) for submission in submissions: passed_testcases = get_passed_testcases(submission) new_submission = ScoreboardSubmission(submission.submit_time, passed_testcases) new_problem.add_submission(new_submission) if new_submission.is_solved(total_testcases): new_problem.AC_time = new_submission.submit_time - \ contest.start_time new_problem.AC_time = int( new_problem.AC_time.total_seconds() / 60) break if new_problem.is_solved(): scoreboard.get_problem(new_problem.id).add_pass_user() else: new_problem.AC_time = '--' if len(submissions): scoreboard.get_problem(new_problem.id).no_submission = False # setup problem attribute new_problem.penalty = get_penalty(new_problem, scoreboard.start_time) new_problem.submit_times = get_submit_times(new_problem) new_problem.solved = new_problem.is_solved() new_problem.testcases_solved = new_problem.get_testcases_solved() # to get single problem's total passed submission scoreboard_problem = scoreboard.get_problem(problem.id) scoreboard_problem.total_solved += new_problem.testcases_solved new_contestant.add_problem(new_problem) # setup contestant attribute new_contestant.solved = new_contestant.get_solved() new_contestant.penalty = get_penalty(new_contestant, scoreboard.start_time) new_contestant.testcases_solved = new_contestant.get_testcases_solved() scoreboard.add_user(new_contestant) for problem in scoreboard.problems: if len(scoreboard.users): problem.pass_rate = float(problem.pass_user) / len( scoreboard.users) * 100 problem.not_pass_rate = 100 - problem.pass_rate else: problem.pass_rate = 0 problem.not_pass_rate = 100 problem.no_submission = True return scoreboard
def has_auth(user, contest_id): contest = Contest.objects.get(id=contest_id) user = user_info.validate_user(user) return user_info.has_contest_ownership(user, contest) | user.has_admin_auth()
def get_scoreboard(user, contest): contestants = get_contestant_list(contest) scoreboard = Scoreboard(contest.start_time) # Store contest's problem data for problem in contest.problem.all(): total_testcases = get_total_testcases(problem) new_problem = ScoreboardProblem( problem.id, problem.pname, total_testcases) new_problem.no_submission = True scoreboard.add_problem(new_problem) # For Contestants' data for contestant in contestants: new_contestant = ScoreboardUser(contestant.user.username) for problem in contest.problem.all(): if(is_ended(contest) or has_contest_ownership(user, contest)): submissions = get_contestant_problem_submission_list( contest, contestant, problem) else: submissions = get_contestant_problem_submission_list_before_freeze_time( contest, contestant, problem) total_testcases = get_total_testcases(problem) new_problem = UserProblem(problem.id, total_testcases) for submission in submissions: passed_testcases = get_passed_testcases(submission) new_submission = ScoreboardSubmission( submission.submit_time, passed_testcases) new_problem.add_submission(new_submission) if new_submission.is_solved(total_testcases): new_problem.AC_time = new_submission.submit_time - \ contest.start_time new_problem.AC_time = int( new_problem.AC_time.total_seconds() / 60) break if new_problem.is_solved(): scoreboard.get_problem(new_problem.id).add_pass_user() else: new_problem.AC_time = '--' if len(submissions): scoreboard.get_problem(new_problem.id).no_submission = False # setup problem attribute new_problem.penalty = get_penalty( new_problem, scoreboard.start_time) new_problem.submit_times = get_submit_times(new_problem) new_problem.solved = new_problem.is_solved() new_problem.testcases_solved = new_problem.get_testcases_solved() # to get single problem's total passed submission scoreboard_problem = scoreboard.get_problem(problem.id) scoreboard_problem.total_solved += new_problem.testcases_solved new_contestant.add_problem(new_problem) # setup contestant attribute new_contestant.solved = new_contestant.get_solved() new_contestant.penalty = get_penalty( new_contestant, scoreboard.start_time) new_contestant.testcases_solved = new_contestant.get_testcases_solved() scoreboard.add_user(new_contestant) for problem in scoreboard.problems: if len(scoreboard.users): problem.pass_rate = float( problem.pass_user) / len(scoreboard.users) * 100 problem.not_pass_rate = 100 - problem.pass_rate else: problem.pass_rate = 0 problem.not_pass_rate = 100 problem.no_submission = True return scoreboard