예제 #1
0
    def approve_reg(self, request, modeladmin, send_confirm_email, invite_to_slack, season,
                    retroactive_byes, late_join_points):
        reg = self.reg
        if season != reg.season:
            reg.season = season

        # Limit changes to moderators
        mod = LeagueModerator.objects.filter(
            player__lichess_username__iexact=reg.lichess_username).first()
        if mod is not None and mod.player.email and mod.player.email != reg.email:
            reg.email = mod.player.email

        # Add or update the player in the DB
        with reversion.create_revision():
            reversion.set_user(request.user)
            reversion.set_comment('Approved registration.')

            player, _ = Player.objects.update_or_create(
                lichess_username__iexact=reg.lichess_username,
                defaults={'lichess_username': reg.lichess_username, 'email': reg.email,
                          'is_active': True}
            )
            if player.rating is None:
                # This is automatically set, so don't change it if we already have a rating
                player.rating = reg.classical_rating
                player.save()

        if self.is_late:
            # Late registration
            next_round = Round.objects.filter(season=season, publish_pairings=False).order_by(
                'number').first()
            if next_round is not None:
                with reversion.create_revision():
                    reversion.set_user(request.user)
                    reversion.set_comment('Approved registration.')
                    PlayerLateRegistration.objects.update_or_create(round=next_round, player=player,
                                                                    defaults={
                                                                        'retroactive_byes': retroactive_byes,
                                                                        'late_join_points': late_join_points})

        with reversion.create_revision():
            reversion.set_user(request.user)
            reversion.set_comment('Approved registration.')

            sp, created = SeasonPlayer.objects.update_or_create(
                player=player,
                season=season,
                defaults={'registration': reg, 'is_active': not self.is_late}
            )

            if created:
                # Add a yellow card for players that had a red card their previous season
                last_sp = player.seasonplayer_set.filter(season__league=self.league).exclude(
                    season=season).order_by('-season__start_date').first()
                if last_sp is not None and last_sp.games_missed >= 2 and self.league.get_leaguesetting().carry_over_red_cards_as_yellow:
                    sp.games_missed = 1
                    sp.save()

        # Set availability
        for week_number in reg.weeks_unavailable.split(','):
            if week_number != '':
                round_ = Round.objects.filter(season=season, number=int(week_number)).first()
                if round_ is not None:
                    with reversion.create_revision():
                        reversion.set_user(request.user)
                        reversion.set_comment('Approved registration.')
                        PlayerAvailability.objects.update_or_create(player=player, round=round_,
                                                                    defaults={
                                                                        'is_available': False})

        if season.league.competitor_type == 'team':
            subject = render_to_string('tournament/emails/team_registration_approved_subject.txt',
                                       {'reg': reg})
            msg_plain = render_to_string('tournament/emails/team_registration_approved.txt',
                                         {'reg': reg})
            msg_html = render_to_string('tournament/emails/team_registration_approved.html',
                                        {'reg': reg})
        elif season.league.rating_type == 'blitz':
            # TODO: Make the email template a league setting
            subject = render_to_string('tournament/emails/blitz_registration_approved_subject.txt',
                                       {'reg': reg})
            msg_plain = render_to_string('tournament/emails/blitz_registration_approved.txt',
                                         {'reg': reg})
            msg_html = render_to_string('tournament/emails/blitz_registration_approved.html',
                                        {'reg': reg})
        else:
            subject = render_to_string('tournament/emails/lone_registration_approved_subject.txt',
                                       {'reg': reg})
            msg_plain = render_to_string('tournament/emails/lone_registration_approved.txt',
                                         {'reg': reg})
            msg_html = render_to_string('tournament/emails/lone_registration_approved.html',
                                        {'reg': reg})

        if send_confirm_email:
            try:
                send_mail(
                    subject,
                    msg_plain,
                    settings.DEFAULT_FROM_EMAIL,
                    [reg.email],
                    html_message=msg_html,
                )
                if modeladmin:
                    modeladmin.message_user(request, 'Confirmation email sent to "%s".' % reg.email,
                                            messages.INFO)
            except SMTPException:
                logger.exception('A confirmation email could not be sent.')
                if modeladmin:
                    modeladmin.message_user(request, 'A confirmation email could not be sent.',
                                            messages.ERROR)

        if invite_to_slack:
            try:
                if request.user.has_perm('tournament.invite_to_slack'):
                    slackapi.invite_user(reg.email)
                    if modeladmin:
                        modeladmin.message_user(request,
                                                'Slack invitation sent to "%s".' % reg.email,
                                                messages.INFO)
                elif modeladmin:
                    modeladmin.message_user(request,
                                            'You don\'t have permission to invite players to slack.',
                                            messages.ERROR)
            except slackapi.AlreadyInTeam:
                if modeladmin:
                    modeladmin.message_user(request, 'The player is already in the slack group.',
                                            messages.WARNING)
            except slackapi.AlreadyInvited:
                if modeladmin:
                    modeladmin.message_user(request,
                                            'The player has already been invited to the slack group.',
                                            messages.WARNING)

        with reversion.create_revision():
            reversion.set_user(request.user)
            reversion.set_comment('Approved registration.')
            reg.status = 'approved'
            reg.status_changed_by = request.user.username
            reg.status_changed_date = timezone.now()
            reg.save()

        if modeladmin:
            modeladmin.message_user(request,
                                    'Registration for "%s" approved.' % reg.lichess_username,
                                    messages.INFO)
예제 #2
0
    def approve_reg(self, request, modeladmin, send_confirm_email, invite_to_slack, season, retroactive_byes, late_join_points):
        reg = self.reg
        if season != reg.season:
            reg.season = season

        # Limit changes to moderators
        mod = LeagueModerator.objects.filter(player__lichess_username__iexact=reg.lichess_username).first()
        if mod is not None and mod.player.email and mod.player.email != reg.email:
            reg.email = mod.player.email

        # Add or update the player in the DB
        with reversion.create_revision():
            reversion.set_user(request.user)
            reversion.set_comment('Approved registration.')

            player, _ = Player.objects.update_or_create(
                lichess_username__iexact=reg.lichess_username,
                defaults={'lichess_username': reg.lichess_username, 'email': reg.email, 'is_active': True}
            )
            if player.rating is None:
                # This is automatically set, so don't change it if we already have a rating
                player.rating = reg.classical_rating
                player.save()

        if self.is_late:
            # Late registration
            next_round = Round.objects.filter(season=season, publish_pairings=False).order_by('number').first()
            if next_round is not None:
                with reversion.create_revision():
                    reversion.set_user(request.user)
                    reversion.set_comment('Approved registration.')
                    PlayerLateRegistration.objects.update_or_create(round=next_round, player=player,
                                                      defaults={'retroactive_byes': retroactive_byes,
                                                      'late_join_points': late_join_points})

        with reversion.create_revision():
            reversion.set_user(request.user)
            reversion.set_comment('Approved registration.')

            sp, created = SeasonPlayer.objects.update_or_create(
                player=player,
                season=season,
                defaults={'registration': reg, 'is_active': not self.is_late}
            )

            if created:
                # Add a yellow card for players that had a red card their previous season
                last_sp = player.seasonplayer_set.filter(season__league=self.league).exclude(season=season).order_by('-season__start_date').first()
                if last_sp is not None and last_sp.games_missed >= 2 and self.league.get_leaguesetting().carry_over_red_cards_as_yellow:
                    sp.games_missed = 1
                    sp.save()

        # Set availability
        for week_number in reg.weeks_unavailable.split(','):
            if week_number != '':
                round_ = Round.objects.filter(season=season, number=int(week_number)).first()
                if round_ is not None:
                    with reversion.create_revision():
                        reversion.set_user(request.user)
                        reversion.set_comment('Approved registration.')
                        PlayerAvailability.objects.update_or_create(player=player, round=round_, defaults={'is_available': False})

        if season.league.competitor_type == 'team':
            subject = render_to_string('tournament/emails/team_registration_approved_subject.txt', {'reg': reg})
            msg_plain = render_to_string('tournament/emails/team_registration_approved.txt', {'reg': reg})
            msg_html = render_to_string('tournament/emails/team_registration_approved.html', {'reg': reg})
        elif season.league.rating_type == 'blitz':
            # TODO: Make the email template a league setting
            subject = render_to_string('tournament/emails/blitz_registration_approved_subject.txt', {'reg': reg})
            msg_plain = render_to_string('tournament/emails/blitz_registration_approved.txt', {'reg': reg})
            msg_html = render_to_string('tournament/emails/blitz_registration_approved.html', {'reg': reg})
        else:
            subject = render_to_string('tournament/emails/lone_registration_approved_subject.txt', {'reg': reg})
            msg_plain = render_to_string('tournament/emails/lone_registration_approved.txt', {'reg': reg})
            msg_html = render_to_string('tournament/emails/lone_registration_approved.html', {'reg': reg})

        if send_confirm_email:
            try:
                send_mail(
                    subject,
                    msg_plain,
                    settings.DEFAULT_FROM_EMAIL,
                    [reg.email],
                    html_message=msg_html,
                )
                if modeladmin:
                    modeladmin.message_user(request, 'Confirmation email sent to "%s".' % reg.email, messages.INFO)
            except SMTPException:
                logger.exception('A confirmation email could not be sent.')
                if modeladmin:
                    modeladmin.message_user(request, 'A confirmation email could not be sent.', messages.ERROR)

        if invite_to_slack:
            try:
                if request.user.has_perm('tournament.invite_to_slack'):
                    slackapi.invite_user(reg.email)
                    if modeladmin:
                        modeladmin.message_user(request, 'Slack invitation sent to "%s".' % reg.email, messages.INFO)
                elif modeladmin:
                    modeladmin.message_user(request, 'You don\'t have permission to invite players to slack.', messages.ERROR)
            except slackapi.AlreadyInTeam:
                if modeladmin:
                    modeladmin.message_user(request, 'The player is already in the slack group.', messages.WARNING)
            except slackapi.AlreadyInvited:
                if modeladmin:
                    modeladmin.message_user(request, 'The player has already been invited to the slack group.', messages.WARNING)

        with reversion.create_revision():
            reversion.set_user(request.user)
            reversion.set_comment('Approved registration.')
            reg.status = 'approved'
            reg.status_changed_by = request.user.username
            reg.status_changed_date = timezone.now()
            reg.save()

        if modeladmin:
            modeladmin.message_user(request, 'Registration for "%s" approved.' % reg.lichess_username, messages.INFO)