@ -1,8 +1,11 @@
from django . utils import timezone
from django . utils import timezone
from . . forms import TournamentRegistrationForm , AddPlayerForm
from . . forms import TournamentRegistrationForm , AddPlayerForm
from . . validators import TournamentRegistrationValidator
from . . repositories import TournamentRegistrationRepository
from . . repositories import TournamentRegistrationRepository
from . email_service import TournamentEmailService
from . email_service import TournamentEmailService
from django . contrib import messages
from . . validators import LicenseValidator
from . . utils . player_search import get_player_name_from_csv
from tournaments . models import PlayerRegistration
class TournamentRegistrationService :
class TournamentRegistrationService :
def __init__ ( self , request , tournament ) :
def __init__ ( self , request , tournament ) :
@ -10,7 +13,6 @@ class TournamentRegistrationService:
self . tournament = tournament
self . tournament = tournament
self . context = { }
self . context = { }
self . repository = TournamentRegistrationRepository ( )
self . repository = TournamentRegistrationRepository ( )
self . validator = TournamentRegistrationValidator ( )
self . email_service = TournamentEmailService ( )
self . email_service = TournamentEmailService ( )
def initialize_context ( self ) :
def initialize_context ( self ) :
@ -38,11 +40,25 @@ class TournamentRegistrationService:
return
return
player_data = self . context [ ' add_player_form ' ] . cleaned_data
player_data = self . context [ ' add_player_form ' ] . cleaned_data
if not self . validator . validate_player_license ( self . request , self . tournament , player_data ) :
licence_id = player_data . get ( ' licence_id ' , ' ' ) . upper ( )
# Validate license
if not self . _validate_license ( licence_id ) :
return
return
self . add_player_to_session ( player_data )
# Check for duplicate players
self . context [ ' add_player_form ' ] = AddPlayerForm ( )
if self . _is_duplicate_player ( licence_id ) :
return
# Check if player is already registered in tournament
if self . _is_already_registered ( licence_id ) :
return
# Handle player data
if self . context [ ' add_player_form ' ] . names_is_valid ( ) :
self . _handle_valid_names ( player_data )
else :
self . _handle_invalid_names ( licence_id , player_data )
def handle_team_registration ( self ) :
def handle_team_registration ( self ) :
if not self . context [ ' team_form ' ] . is_valid ( ) :
if not self . context [ ' team_form ' ] . is_valid ( ) :
@ -107,8 +123,8 @@ class TournamentRegistrationService:
player_data = self . _get_authenticated_user_data ( )
player_data = self . _get_authenticated_user_data ( )
if player_data :
if player_data :
self . context [ ' current_players ' ] = self . request . session . get ( ' team_registration ' , [ ] )
self . request . session [ ' team_registration ' ] . insert ( 0 , player_data )
self . request . session [ ' team_registration ' ] . insert ( 0 , player_data )
self . context [ ' current_players ' ] = self . request . session . get ( ' team_registration ' , [ ] )
self . request . session . modified = True
self . request . session . modified = True
def _handle_user_without_license ( self ) :
def _handle_user_without_license ( self ) :
@ -147,3 +163,123 @@ class TournamentRegistrationService:
} )
} )
return player_data
return player_data
def _validate_license ( self , licence_id ) :
validator = LicenseValidator ( licence_id )
if validator . validate_license ( ) is False and self . tournament . license_is_required :
if not licence_id :
message = ( " Le numéro de licence est obligatoire. "
if not self . request . session . get ( ' team_registration ' , [ ] )
else " Le numéro de licence de votre partenaire est obligatoire. " )
messages . error ( self . request , message )
else :
# computed_license_key = validator.computed_license_key
# messages.error(self.request, f"Le numéro de licence est invalide, la lettre ne correspond pas. {computed_license_key}")
messages . error ( self . request , " Le numéro de licence est invalide, la lettre ne correspond pas. " )
return False
return True
def _is_duplicate_player ( self , licence_id ) :
existing_players = [ player [ ' licence_id ' ] for player in self . request . session . get ( ' team_registration ' , [ ] ) ]
if licence_id in existing_players :
messages . error ( self . request , " Ce joueur est déjà dans l ' équipe. " )
return True
return False
def _is_already_registered ( self , licence_id ) :
validator = LicenseValidator ( licence_id )
if ( validator . validate_license ( ) and
self . _license_already_registered ( validator . stripped_license ) and
self . tournament . license_is_required ) :
messages . error ( self . request , " Un joueur avec ce numéro de licence est déjà inscrit dans une équipe. " )
return True
return False
def _handle_valid_names ( self , player_data ) :
if player_data . get ( ' rank ' ) is None :
self . _set_default_rank ( player_data )
self . add_player_to_session ( player_data )
if self . request . user . is_authenticated and self . request . user . licence_id is None :
self . _update_user_license ( player_data . get ( ' licence_id ' ) )
self . context [ ' add_player_form ' ] = AddPlayerForm ( )
def _handle_invalid_names ( self , licence_id , player_data ) :
if not self . context [ ' add_player_form ' ] . first_tournament :
data , found = get_player_name_from_csv ( self . tournament . federal_category , licence_id )
if found and data :
self . _update_player_data_from_csv ( player_data , data )
player_check = self . _player_check ( player_data )
if player_check == True :
self . add_player_to_session ( player_data )
self . context [ ' add_player_form ' ] = AddPlayerForm ( )
else :
return
else :
self . _handle_first_tournament_case ( data )
def _set_default_rank ( self , player_data ) :
if self . request . session . get ( ' last_rank ' ) is None :
data , found = get_player_name_from_csv ( self . tournament . federal_category , None )
if data :
self . request . session [ ' last_rank ' ] = data [ ' rank ' ]
self . request . session [ ' is_woman ' ] = data [ ' is_woman ' ]
self . request . session . modified = True
player_data [ ' rank ' ] = self . request . session . get ( ' last_rank ' , 0 )
player_data [ ' is_woman ' ] = self . request . session . get ( ' is_woman ' , False )
def _update_user_license ( self , licence_id ) :
self . request . session [ ' user_without_licence ' ] = False
self . request . user . licence_id = LicenseValidator ( licence_id ) . computed_licence_id
self . request . user . save ( )
def _update_player_data_from_csv ( self , player_data , csv_data ) :
player_data . update ( {
' first_name ' : csv_data [ ' first_name ' ] ,
' last_name ' : csv_data [ ' last_name ' ] ,
' rank ' : csv_data [ ' rank ' ] ,
' is_woman ' : csv_data [ ' is_woman ' ] ,
' points ' : csv_data . get ( ' points ' ) ,
' assimilation ' : csv_data . get ( ' assimilation ' ) ,
' tournament_count ' : csv_data . get ( ' tournament_count ' ) ,
' ligue_name ' : csv_data . get ( ' ligue_name ' ) ,
' club_name ' : csv_data . get ( ' club_name ' ) ,
' birth_year ' : csv_data . get ( ' birth_year ' )
} )
def _handle_first_tournament_case ( self , data ) :
if data :
self . request . session [ ' last_rank ' ] = data [ ' rank ' ]
self . request . session [ ' is_woman ' ] = data [ ' is_woman ' ]
self . request . session . modified = True
self . context [ ' add_player_form ' ] . first_tournament = True
if not self . context [ ' add_player_form ' ] . names_is_valid ( ) :
message = ( " Pour confirmer votre inscription votre prénom et votre nom sont obligatoires. "
if not self . request . session . get ( ' team_registration ' , [ ] )
else " Pour rajouter un partenaire, son prénom et son nom sont obligatoires. " )
messages . error ( self . request , message )
def _player_check ( self , player_data ) :
licence_id = player_data [ ' licence_id ' ] . upper ( )
validator = LicenseValidator ( licence_id )
is_license_valid = validator . validate_license ( )
player_register_check = self . tournament . player_register_check ( licence_id )
if is_license_valid and player_register_check is not None :
for message in player_register_check :
messages . error ( self . request , message )
return False
return True
def _license_already_registered ( self , stripped_license ) :
return PlayerRegistration . objects . filter (
team_registration__tournament = self . tournament ,
licence_id__startswith = stripped_license
) . exists ( )