diff --git a/tournaments/custom_views.py b/tournaments/custom_views.py index 4e3d2f1..6469c21 100644 --- a/tournaments/custom_views.py +++ b/tournaments/custom_views.py @@ -38,5 +38,11 @@ class CustomLoginView(auth_views.LoginView): for key in keys_to_clear: del request.session[key] - messages.get_messages(request).used = True + storage = messages.get_messages(request) + for _ in storage: + pass + + if len(storage._loaded_messages) == 1: + del storage._loaded_messages[0] + return super().get(request, *args, **kwargs) diff --git a/tournaments/services/tournament_registration.py b/tournaments/services/tournament_registration.py index a019583..0bbcdb3 100644 --- a/tournaments/services/tournament_registration.py +++ b/tournaments/services/tournament_registration.py @@ -4,6 +4,8 @@ import datetime from ..models import PlayerRegistration, TeamRegistration, Tournament from ..utils.licence_validator import LicenseValidator from ..utils.player_search import get_player_name_from_csv +from ..models.enums import FederalCategory +from ..models.player_enums import PlayerSexType, PlayerDataSource class RegistrationCartManager: """ @@ -323,27 +325,59 @@ class RegistrationCartManager: walk_out=False ) + # Identify captain from user's license + stripped_license = None + if self.request.user.is_authenticated and self.request.user.licence_id: + validator = LicenseValidator(self.request.user.licence_id) + stripped_license = validator.stripped_license + # Create player registrations - for idx, player_data in enumerate(players): + for player_data in players: + # Determine if this player is the captain + is_captain = False + player_licence_id = player_data.get('licence_id') + if player_licence_id and stripped_license: + if stripped_license.lower() in player_licence_id.lower(): + is_captain = True + + # Compute rank and sex using the original logic + sex, rank, computed_rank = self._compute_rank_and_sex( + tournament, + player_data + ) + + # Determine data source + data_source = None + if player_data.get('found_in_french_federation', False) == True: + data_source = PlayerDataSource.FRENCH_FEDERATION # Now using the enum value + + # Create player registration with all the original fields PlayerRegistration.objects.create( team_registration=team_registration, - first_name=player_data.get('first_name', ''), - last_name=player_data.get('last_name', '').upper(), - licence_id=player_data.get('licence_id'), - rank=player_data.get('rank'), + captain=is_captain, + source=data_source, + registered_online=True, + first_name=player_data.get('first_name'), + last_name=player_data.get('last_name'), points=player_data.get('points'), - club_name=player_data.get('club_name'), - ligue_name=player_data.get('ligue_name'), - email=player_data.get('email'), - phone_number=player_data.get('phone'), assimilation=player_data.get('assimilation'), tournament_played=player_data.get('tournament_count'), - birthdate=str(player_data.get('birth_year', '')), - captain=(idx == 0), # First player is captain - registered_online=True, - registration_status='CONFIRMED' if self.session['waiting_list_position'] < 0 else 'WAITING' + ligue_name=player_data.get('ligue_name'), + club_name=player_data.get('club_name'), + birthdate=player_data.get('birth_year'), + sex=sex, + rank=rank, + computed_rank=computed_rank, + licence_id=player_data.get('licence_id'), + email=player_data.get('email'), + phone_number=player_data.get('mobile_number', mobile_number), + registration_status='CONFIRMED' if self.session.get('waiting_list_position', 0) < 0 else 'WAITING' ) + # Calculate and set team weight + team_registration.set_weight() + team_registration.save() + # Update user phone if provided if self.request.user.is_authenticated and mobile_number: self.request.user.phone = mobile_number @@ -402,56 +436,27 @@ class RegistrationCartManager: success, _ = self.add_player(player_data) return success + def _compute_rank_and_sex(self, tournament, player_data): + """ + Compute the player's sex, rank, and computed rank based on tournament category. + This reimplements the original logic from TournamentRegistrationRepository. + """ + is_woman = player_data.get('is_woman', False) + rank = player_data.get('rank', None) -# For backward compatibility with existing code that uses the function-based approach -def get_or_create_registration_cart_id(request): - cart_manager = RegistrationCartManager(request) - return cart_manager.get_or_create_cart_id() - -def get_cart_expiry(request): - cart_manager = RegistrationCartManager(request) - return cart_manager.get_cart_expiry() - -def is_cart_expired(request): - cart_manager = RegistrationCartManager(request) - return cart_manager.is_cart_expired() - -def reset_cart_expiry(request): - cart_manager = RegistrationCartManager(request) - cart_manager.reset_cart_expiry() - -def get_tournament_from_cart(request): - cart_manager = RegistrationCartManager(request) - return cart_manager.get_tournament_id() - -def initialize_registration_cart(request, tournament_id): - cart_manager = RegistrationCartManager(request) - return cart_manager.initialize_cart(tournament_id) - -def get_registration_cart_data(request): - cart_manager = RegistrationCartManager(request) - return cart_manager.get_cart_data() - -def add_player_to_cart(request, player_data): - cart_manager = RegistrationCartManager(request) - return cart_manager.add_player(player_data) - -def remove_player_from_cart(request): - cart_manager = RegistrationCartManager(request) - return cart_manager.remove_player() + if rank is None: + computed_rank = 100000 + else: + computed_rank = rank -def update_cart_contact_info(request, mobile_number=None): - cart_manager = RegistrationCartManager(request) - return cart_manager.update_contact_info(mobile_number) + # Use the integer enum values + sex = PlayerSexType.FEMALE if is_woman else PlayerSexType.MALE -def checkout_registration_cart(request): - cart_manager = RegistrationCartManager(request) - return cart_manager.checkout() + # Apply assimilation for women playing in men's tournaments + if is_woman and tournament.federal_category == FederalCategory.MEN: + assimilation_addition = FederalCategory.female_in_male_assimilation_addition(rank) + computed_rank = computed_rank + assimilation_addition -def clear_registration_cart(request): - cart_manager = RegistrationCartManager(request) - cart_manager.clear_cart() + print(f"_compute_rank_and_sex: {player_data.get('last_name')}, {sex}, {rank}, {computed_rank}") -def add_authenticated_user_to_cart(request): - cart_manager = RegistrationCartManager(request) - return cart_manager.add_authenticated_user() + return sex, rank, computed_rank diff --git a/tournaments/views.py b/tournaments/views.py index 176f621..39a2652 100644 --- a/tournaments/views.py +++ b/tournaments/views.py @@ -1228,10 +1228,12 @@ def register_tournament(request, tournament_id): # If registration was successful, render success page immediately if registration_successful: storage = messages.get_messages(request) - for message in storage: - # Iterate through messages to clear them - pass # This actually consumes the messages - storage.used = True # Mark all messages as used + for _ in storage: + pass + + if len(storage._loaded_messages) == 1: + del storage._loaded_messages[0] + context = { 'tournament': tournament, 'registration_successful': True, @@ -1263,11 +1265,14 @@ def register_tournament(request, tournament_id): # We're returning from Stripe, don't reinitialize the cart pass else: + + print("Initializing cart") storage = messages.get_messages(request) - for message in storage: - # Iterate through messages to clear them - pass # This actually consumes the messages - storage.used = True # Mark all messages as used + for _ in storage: + pass + + if len(storage._loaded_messages) == 1: + del storage._loaded_messages[0] # ALWAYS initialize a fresh cart when entering the registration page (GET request) # This ensures no old cart data persists