Пример #1
0
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
Пример #2
0
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
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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
Пример #6
0
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
Пример #7
0
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
Пример #8
0
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
Пример #9
0
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
Пример #10
0
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)
Пример #11
0
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
Пример #12
0
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
Пример #13
0
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
Пример #14
0
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
Пример #15
0
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
Пример #16
0
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
Пример #17
0
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'))
Пример #18
0
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'))
Пример #19
0
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
Пример #20
0
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
Пример #21
0
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
Пример #22
0
def can_edit_contest(user, contest):
    user = validate_user(user)
    return user.has_admin_auth() or has_contest_ownership(user, contest)
Пример #23
0
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
Пример #24
0
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
Пример #25
0
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()
Пример #26
0
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
Пример #27
0
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
Пример #28
0
def can_edit_contest(user, contest):
    user = validate_user(user)
    return user.has_admin_auth() or has_contest_ownership(user, contest)