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)
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)