예제 #1
0
def reveal_hint(request):
    form = RevealHintForm(request.POST or None, player=request.user)

    hint = Hint.objects.filter(pk=form.data.get('hint_id')).first()
    if form.is_valid():
        # Validating team here (rather than in forms.py) because we're redirecting,
        # rather than just displaying form errors on the same challenge page.
        team = request.user.team
        if not team:
            messages.error(request, NO_TEAM)
            return HttpResponseRedirect(
                reverse('player', args=[request.user.slug]))

        team.hints.add(hint)
        if team.points and hint.penalty:
            team.points -= hint.penalty

        team.save()

    else:
        issue_errors(request, form)

    if hint is not None:
        return HttpResponseRedirect(
            reverse('challenge', args=[hint.challenge.slug]))
    return HttpResponseRedirect(reverse('challenges'))
예제 #2
0
def submit_flag(request):
    form = SubmitFlagForm(request.POST or None, player=request.user)

    challenge = Challenge.objects.filter(
        pk=form.data.get('challenge_id')).first()
    if form.is_valid():
        attempted_flag = form.cleaned_data['attempted_flag']

        # Validating team here (rather than in forms.py) because we're redirecting,
        # rather than just displaying form errors on the same challenge page.
        team = request.user.team
        if not team:
            messages.error(request, NO_TEAM)
            return HttpResponseRedirect(
                reverse('player', args=[request.user.slug]))

        challenge_flags = [flag.value for flag in challenge.flag_set.all()]

        if attempted_flag in challenge_flags:
            team.points += challenge.points

            if challenge.bonus_limit:
                team.points += challenge.bonus_points
                challenge.bonus_limit -= 1

            if challenge.points:
                challenge.points -= challenge.depreciation
            challenge.save()

            for flag in challenge.flag_set.all():
                team.flags.add(flag)

            messages.success(request, GOOD_FLAG)

        # Wrong flag
        else:
            error_msg = BAD_FLAG
            if challenge.penalty and team.points:
                error_msg += PENALTY.format(challenge.penalty, team.name)
                team.points -= challenge.penalty
            messages.error(request, error_msg)

        team.save()

    # Form invalid
    else:
        issue_errors(request, form)

    if challenge is not None:
        return HttpResponseRedirect(reverse('challenge',
                                            args=[challenge.slug]))
    return HttpResponseRedirect(reverse('challenges'))
예제 #3
0
def change_team_name(request):
    form = team_forms.ChangeTeamName(request.POST or None, player=request.user)

    if form.is_valid():
        new_team_name = form.cleaned_data['new_team_name']

        team = request.user.team
        team.name = new_team_name
        team.slug = slugify(new_team_name)
        team.save()

    else:
        issue_errors(request, form)

    return HttpResponseRedirect(reverse('team', args=[request.user.team.slug]))
예제 #4
0
def change_team_password(request):
    form = team_forms.ChangeTeamPassword(request.POST or None,
                                         player=request.user)

    if form.is_valid():
        new_team_password = form.cleaned_data['new_team_password']

        team = request.user.team
        team.password = make_password(new_team_password)
        team.save()

    else:
        issue_errors(request, form)

    return HttpResponseRedirect(reverse('team', args=[request.user.team.slug]))
예제 #5
0
def appoint_captain(request):
    form = team_forms.AppointNewCaptain(request.POST or None,
                                        player=request.user)

    if form.is_valid():
        target_player_username = form.cleaned_data['target_player_username']

        target_player = Player.objects.get(username=target_player_username)
        old_captain = request.user

        target_player.standing = Player.CAPTAIN
        old_captain.standing = Player.MODERATOR

        target_player.save()
        old_captain.save()

    else:
        issue_errors(request, form)

    return HttpResponseRedirect(reverse('team', args=[request.user.team.slug]))
예제 #6
0
def promote_demote(request):
    form = team_forms.PromoteOrDemotePlayer(request.POST or None,
                                            player=request.user)

    if form.is_valid():
        target_player_username = form.cleaned_data['target_player_username']
        promote = form.cleaned_data['promote']

        target_player = Player.objects.get(username=target_player_username)

        if promote:
            target_player.standing = Player.MODERATOR
        else:
            target_player.standing = Player.PLAYER

        target_player.save()

    else:
        issue_errors(request, form)

    return HttpResponseRedirect(reverse('team', args=[request.user.team.slug]))