08 2025 rankings

apikeys
Razmig Sarkissian 3 months ago
parent 35acba7332
commit e4d008956a
  1. 59
      tournaments/admin_utils.py
  2. 6
      tournaments/static/rankings/CLASSEMENT-PADEL-DAMES-07-2025.csv
  3. 15223
      tournaments/static/rankings/CLASSEMENT-PADEL-DAMES-08-2025.csv
  4. 2
      tournaments/static/rankings/CLASSEMENT-PADEL-MESSIEURS-07-2025.csv
  5. 103266
      tournaments/static/rankings/CLASSEMENT-PADEL-MESSIEURS-08-2025.csv

@ -15,9 +15,9 @@ from django.middleware.csrf import get_token
import concurrent.futures
from functools import partial
default_sexe = 'F'
default_sexe = 'H'
default_id_homologation = "82546485"
default_session_id = "JSESSIONID=CEC70DF4428E76E1FD1BFE5C66904708; AWSALB=omN79AoahQc27iH5vvO14U7ZrjH30faWu5delXAthjiYVq4jzbeXJ0IOmVTGjG6YDoi7Do2uCswhEaO/smz1QG733RpYlsw7ShlFV/X2aLn2L7/DZ5KUBA/8LPNr; AWSALBCORS=omN79AoahQc27iH5vvO14U7ZrjH30faWu5delXAthjiYVq4jzbeXJ0IOmVTGjG6YDoi7Do2uCswhEaO/smz1QG733RpYlsw7ShlFV/X2aLn2L7/DZ5KUBA/8LPNr; incap_ses_2223_2712217=g6xvVwmOBh66wpenPa/ZHpN2ZmgAAAAAcmuXPCKJ1/mEqKuQEXJS2Q==; tc_cj_v2=m_iZZZ%22**%22%27%20ZZZKQNRSMQNLMRQLZZZ%5D777%5Ecl_%5Dny%5B%5D%5D_mmZZZZZZKQOKMQKQONJKOZZZ%5D777_rn_lh%5BfyfcheZZZ222H%2B%7B%7E%20%27-%20%21%20-%20%29%7D%20H%7D*%28ZZZKQOKMQKRLNNPMZZZ%5D777%5Ecl_%5Dny%5B%5D%5D_mmZZZZZZKQOKNRJOLLQOJZZZ%5D777_rn_lh%5BfyfcheZZZ%2F%20%290%2BH%2C0%200%20G%24%2FH%29%20%2FZZZKQOKOLRLNNQJLZZZ%5D; tc_cj_v2_cmp=; tc_cj_v2_med=; SSESS7ba44afc36c80c3faa2b8fa87e7742c5=4-IzUXNKXq_BQFMLjjivcLW14OXgk3lLPl18WYgSmU0; xtan=-; xtant=1; pa_vid=%22mckhos3iasswydjm%22; datadome=oi7wKIO2uaUDCcpICiRO1_hEYcwyQWDVbXyNCSkAmr315~8pnPcuXWKfvNEEz~jKcoORIOThSRe~AxoRRrPLUsr0miWm7AdAcy~_3hABc1ZWfRt~SKGa_uhyqiE0Hzfj; _pcid=%7B%22browserId%22%3A%22mckhos3iasswydjm%22%2C%22_t%22%3A%22ms8wm9hs%7Cmckhos5s%22%7D; _pctx=%7Bu%7DN4IgrgzgpgThIC4B2YA2qA05owMoBcBDfSREQpAeyRCwgEt8oBJAE0RXSwH18yBbCAA4A7vwCcACwgAffgGMA1pMoQArPAC%2BQA; EA_SESSION_ID=E15E1DD5A23272A1A0CC3B8CEDF56B65; refresh_token=eyJhbGciOiJIUzUxMiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzYjQ2ODk1ZC0zN2EzLTQzM2QtYmQ1My01N2QxZTM1YTI3NzkifQ.eyJleHAiOjE3NTY1NTM5MjgsImlhdCI6MTc1MTM3MjAwNCwianRpIjoiYzJiNzA3N2UtZmQ5MS00ZGM4LWI4ZDEtMzA2MDdkYjk5MTgxIiwiaXNzIjoiaHR0cHM6Ly9sb2dpbi5mZnQuZnIvcmVhbG1zL2Nvbm5lY3QiLCJhdWQiOiJodHRwczovL2xvZ2luLmZmdC5mci9yZWFsbXMvY29ubmVjdCIsInN1YiI6IjI3ZDQ5NzRjLTEwZWUtNDNlOC1iOTczLWUyMzc2MDM1ZTE0MSIsInR5cCI6IlJlZnJlc2giLCJhenAiOiJtZWEtc2l0ZSIsInNpZCI6IjM5NTZjMzZlLTczMWItNDJkNy1iNjI2LTE2MGViY2Y2YTY2ZiIsInNjb3BlIjoib3BlbmlkIHJvbGVzIHJlYWQ6bGljZW5jZSByZWFkOmlkZW50aXR5IGVtYWlsIHByb2ZpbGUifQ.e6v5vlen985vSFJhrgMQTTB3fzzsnwugPfXKoyib1QSIBZ9kC47h1cYwcpam0VmZ9vRD_y0hVC14jDvBR6d1dQ; user_login=10000984864; user_token=eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJRaTV3bWx2bTNuX2p1YW4tSTl1dHo3UGZRLU1tVVlvektwSExhbm9lTXI4In0.eyJleHAiOjE3NTEzNzIzMDQsImlhdCI6MTc1MTM3MjAwNCwianRpIjoiMzEzMGVhODUtNjFjNC00OGRjLWFlNGMtZTIwZmZhYTU3YTlhIiwiaXNzIjoiaHR0cHM6Ly9sb2dpbi5mZnQuZnIvcmVhbG1zL2Nvbm5lY3QiLCJhdWQiOlsiZmVkLWFwaSIsImFjY291bnQiXSwic3ViIjoiMjdkNDk3NGMtMTBlZS00M2U4LWI5NzMtZTIzNzYwMzVlMTQxIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoibWVhLXNpdGUiLCJzaWQiOiIzOTU2YzM2ZS03MzFiLTQyZDctYjYyNi0xNjBlYmNmNmE2NmYiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsiZGVmYXVsdC1yb2xlcy1jb25uZWN0Il19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCJdfX0sInNjb3BlIjoib3BlbmlkIHJlYWQ6bGljZW5jZSByZWFkOmlkZW50aXR5IGVtYWlsIHByb2ZpbGUiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiaWRDcm0iOiIxMDAwMDk4NDg2NCIsIm5hbWUiOiJSYXptaWcgU0FSS0lTU0lBTiIsInByZWZlcnJlZF91c2VybmFtZSI6InJhem1vZyIsImdpdmVuX25hbWUiOiJSYXptaWciLCJzZXNzaW9uX3N0YXRlIjoiMzk1NmMzNmUtNzMxYi00MmQ3LWI2MjYtMTYwZWJjZjZhNjZmIiwibG9jYWxlIjoiZnIiLCJmYW1pbHlfbmFtZSI6IlNBUktJU1NJQU4iLCJlbWFpbCI6InJhem1pZy5zYXJraXNzaWFuQGdtYWlsLmNvbSJ9.VSjG2htaUMt_acrqL3VcAjVMhAno9q0vdb7LTzw8UVbjIiDLzhR5msRxI8h8gSJ38kFLaa7f_SFGLIsRCSdcmhYRd2zKIrcPE-QFKbsPnH69xN2i3giMMiYEy3hj__IIyijt9z3W4KXeQdwUrlXPxprlXQ2sYTlZG63HlCGq1iI3Go9eXFmNDNM6p1jBypXcHEvJr6HwNcRdn6ZGfZ9LLMZ2aMEJAhDqL2CLrFrOZkGQpFz7ITUi_DVJAqh5DmTK1JqPswcOjhuZhDT7qWNfIleV-L7XCwvofxBwkSX9ve9l_3COZJXbsMiiRdCSTZtewlFRfgo4IuAu3g06fmJw7g; TCID=; nlbi_2712217=Ok4tKplxIEN+k1gmb9lUTgAAAAA70zbGXpiElrV2qkRjBeXO; visid_incap_2712217=LW/brcN4Rwml/7waoG/rloFBYmgAAAAAQUIPAAAAAAAlHbwlYSPbNS2qq3UBZNK8; TCPID=125629554310878226394; xtvrn=$548419$"
default_session_id = "JSESSIONID=E3DE6A54D5367D48B0CFA970E09EB422; AWSALB=UlkEmLYVxfS3RNwiNeNygqdqjroNzOZF3D9k6nR+NP6YPG3r6JLIzOqtw3nV1aVKsyNMldzeFOmVy/V1OPf7LNVW/sckdD1EprkGtgqjX8N8DpihxhTGtTm+0sX1; AWSALBCORS=UlkEmLYVxfS3RNwiNeNygqdqjroNzOZF3D9k6nR+NP6YPG3r6JLIzOqtw3nV1aVKsyNMldzeFOmVy/V1OPf7LNVW/sckdD1EprkGtgqjX8N8DpihxhTGtTm+0sX1; datadome=K3v~wZc~sLs5C7D4p0OoS3jOXGpeDfai9vk~TDPw2mSFbxqpfjUcR68wvPaYXHYqXgAHOrFnrBGpoyNepJ6bXfncdSmYOUfMNPbAtvBBo67zZTxxSeogLiLu1U1_5Txo; TCID=; tc_cj_v2=%5Ecl_%5Dny%5B%5D%5D_mmZZZZZZKQOKSRRSNRRNQZZZ%5D777_rn_lh%5BfyfcheZZZ%2F%20%290%2BH%2C0%200%20G%24%2FH%29%20%2FZZZKQOLJNPJONLMPZZZ%5D777%5Ecl_%5Dny%5B%5D%5D_mmZZZZZZKQOLJNPJSSQMNZZZ%5D777_rn_lh%5BfyfcheZZZ%2F%20%290%2BH%2C0%200%20G%24%2FH%29%20%2FZZZKQOLJNPRRONPSZZZ%5D777%5Ecl_%5Dny%5B%5D%5D_mmZZZZZZKQOLJNQLKOMSOZZZ%5D777_rn_lh%5BfyfcheZZZ%2F%20%290%2BH%2C0%200%20G%24%2FH%29%20%2FZZZKQOLJPMNSNOJKZZZ%5D777%5Ecl_%5Dny%5B%5D%5D_mmZZZZZZKQOLJPMRPKRKMZZZ%5D777_rn_lh%5BfyfcheZZZ%2F%20%290%2BH%2C0%200%20G%24%2FH%29%20%2FZZZKQOLJQSONNLNQZZZ%5D777%5Ecl_%5Dny%5B%5D%5D_mmZZZZZZKQOLKMOPOJKSLZZZ%5D777_rn_lh%5BfyfcheZZZ%2F%20%290%2BH%2C0%200%20G%24%2FH%29%20%2FZZZKQONMQSSNRPKQZZZ%5D; tc_cj_v2_cmp=; tc_cj_v2_med=; xtan=-; xtant=1; pa_vid=%22mckhos3iasswydjm%22; _pcid=%7B%22browserId%22%3A%22mckhos3iasswydjm%22%2C%22_t%22%3A%22ms8wm9hs%7Cmckhos5s%22%7D; _pctx=%7Bu%7DN4IgrgzgpgThIC4B2YA2qA05owMoBcBDfSREQpAeyRCwgEt8oBJAE0RXSwH18yBbCAA4A7vwCcACwgAffgGMA1pMoQArPAC%2BQA; TCPID=125629554310878226394; xtvrn=$548419$"
def calculate_age_from_birth_date(birth_date_str):
"""
@ -370,6 +370,7 @@ def download_french_padel_rankings(request):
start_tranche = int(request.POST.get('start_tranche', 1001))
end_tranche = int(request.POST.get('end_tranche', 1222))
save_locally = request.POST.get('save_locally', 'true') == 'true'
sexe = request.POST.get('sexe', default_sexe)
try:
# API endpoint and parameters
@ -382,6 +383,7 @@ def download_french_padel_rankings(request):
total_tranches = end_tranche - start_tranche + 1
successful_calls = 0
failed_calls = 0
failed_tranches_list = []
print(f"Starting to fetch tranches {start_tranche} to {end_tranche} ({total_tranches} total)...")
@ -389,7 +391,7 @@ def download_french_padel_rankings(request):
try:
payload = {
"pratique": "padel",
"sexe": default_sexe,
"sexe": sexe,
"tranche": tranche
}
@ -413,14 +415,17 @@ def download_french_padel_rankings(request):
else:
failed_calls += 1
failed_tranches_list.append(tranche) # Add this line
print(f"Tranche {tranche}: HTTP {response.status_code}")
except requests.exceptions.RequestException as e:
failed_calls += 1
failed_tranches_list.append(tranche) # Add this line
print(f"Tranche {tranche}: Network error - {str(e)}")
except Exception as e:
failed_calls += 1
failed_tranches_list.append(tranche) # Add this line
print(f"Tranche {tranche}: Unexpected error - {str(e)}")
if tranche % 10 == 0:
@ -430,6 +435,10 @@ def download_french_padel_rankings(request):
print(f"Completed! Total players found: {len(all_players)}")
print(f"Successful calls: {successful_calls}, Failed calls: {failed_calls}")
if failed_tranches_list:
print(f"Failed tranches: {failed_tranches_list}")
else:
print("No failed tranches - all requests successful!")
if all_players:
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
@ -438,6 +447,7 @@ def download_french_padel_rankings(request):
"total_players": len(all_players),
"successful_tranches": successful_calls,
"failed_tranches": failed_calls,
"failed_tranches_list": failed_tranches_list, # Add this line
"total_tranches_requested": total_tranches,
"tranche_range": f"{start_tranche}-{end_tranche}",
"download_timestamp": datetime.now().isoformat(),
@ -449,7 +459,7 @@ def download_french_padel_rankings(request):
},
"parameters": {
"pratique": "padel",
"sexe": default_sexe,
"sexe": sexe,
"tranche_start": start_tranche,
"tranche_end": end_tranche
}
@ -583,6 +593,15 @@ def download_french_padel_rankings(request):
</div>
</div>
<div class="form-group">
<label for="sexe">Sexe:</label>
<select name="sexe" id="sexe" style="width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;" required>
<option value="H" {% if default_sexe == 'H' %}selected{% endif %}>Homme (H)</option>
<option value="F" {% if default_sexe == 'F' %}selected{% endif %}>Femme (F)</option>
</select>
<small style="color: #666;">Gender for rankings search</small>
</div>
<div class="form-group">
<label>
<input type="checkbox" name="save_locally" value="true" checked> Save locally for enrichment
@ -601,7 +620,8 @@ def download_french_padel_rankings(request):
''')
context = Context({
'csrf_token': csrf_token
'csrf_token': csrf_token,
'default_sexe': default_sexe
})
return HttpResponse(html_template.render(context))
@ -938,7 +958,8 @@ def get_player_license_info(request):
'csrf_token': csrf_token,
'default_session_id': default_session_id,
'default_id_homologation': default_id_homologation,
'default_license_id': default_license_id
'default_license_id': default_license_id,
'default_sexe': default_sexe
})
return HttpResponse(html_template.render(context))
@ -1164,7 +1185,8 @@ def bulk_license_lookup(request):
'csrf_token': csrf_token,
'default_session_id': default_session_id,
'default_id_homologation': default_id_homologation,
'default_license_ids': default_license_ids
'default_license_ids': default_license_ids,
'default_sexe': default_sexe
})
return HttpResponse(html_template.render(context))
@ -1178,6 +1200,7 @@ def search_player_by_name(request):
id_homologation = request.POST.get('idHomologation', '').strip()
nom = request.POST.get('nom', '')
prenom = request.POST.get('prenom', '')
sexe = request.POST.get('sexe', default_sexe)
if not session_id or not id_homologation:
messages.error(request, "sessionId and idHomologation are required.")
@ -1430,7 +1453,8 @@ def search_player_by_name(request):
context = Context({
'csrf_token': csrf_token,
'default_session_id': default_session_id,
'default_id_homologation': default_id_homologation
'default_id_homologation': default_id_homologation,
'default_sexe': default_sexe
})
return HttpResponse(html_template.render(context))
@ -1463,6 +1487,9 @@ def enrich_rankings_with_licenses(request):
players = data.get('joueurs', [])
metadata = data.get('metadata', {})
# Extract sex from metadata (it's the same for all players in the ranking)
sexe = metadata.get('parameters', {}).get('sexe', default_sexe)
print(f"Using sex from metadata: {sexe}")
if not players:
messages.error(request, "No players found in the file.")
@ -1471,7 +1498,7 @@ def enrich_rankings_with_licenses(request):
print(f"Loaded {len(players)} players from file")
# Define a worker function that will process a single player
def lookup_player_license(player_tuple, session_id, id_homologation):
def lookup_player_license(player_tuple, session_id, id_homologation, sexe):
original_index, player = player_tuple
# Extract and normalize names
@ -1486,9 +1513,6 @@ def enrich_rankings_with_licenses(request):
nom = raw_nom
prenom = raw_prenom
# Get player's gender
sexe = player.get('sexe', default_sexe) # Default to 'H' for male
# Setup license lookup headers
license_headers = {
"Accept": "application/json, text/javascript, */*; q=0.01",
@ -1612,14 +1636,14 @@ def enrich_rankings_with_licenses(request):
print(f"Starting concurrent enrichment of {len(players_needing_licenses)} players with {max_workers} workers")
# Prepare the partial function with fixed parameters
worker_fn = partial(lookup_player_license, session_id=session_id, id_homologation=id_homologation)
worker_fn = partial(lookup_player_license, session_id=session_id, id_homologation=id_homologation, sexe=sexe)
# Process in batches for saving progress, using the value from the form
for batch_start in range(0, len(players_needing_licenses), save_batch_size):
batch_end = min(batch_start + save_batch_size, len(players_needing_licenses))
current_batch = players_needing_licenses[batch_start:batch_end]
# print(f"\n=== Processing batch {batch_start//save_batch_size + 1}: players {batch_start+1} to {batch_end} ===")
print(f"\n=== Processing batch {batch_start//save_batch_size + 1}: players {batch_start+1} to {batch_end} ===")
batch_results = []
# Process the current batch with concurrent workers
@ -1642,8 +1666,8 @@ def enrich_rankings_with_licenses(request):
total_processed += 1
# Print progress every 10 players
# if total_processed % 10 == 0 or total_processed == len(players_needing_licenses):
# print(f" Progress: {total_processed}/{len(players_needing_licenses)} ({(total_processed/len(players_needing_licenses)*100):.1f}%)")
if total_processed % 10 == 0 or total_processed == len(players_needing_licenses):
print(f" Progress: {total_processed}/{len(players_needing_licenses)} ({(total_processed/len(players_needing_licenses)*100):.1f}%)")
if message:
batch_results.append(message)
@ -1672,7 +1696,7 @@ def enrich_rankings_with_licenses(request):
with open(file_path, 'w', encoding='utf-8') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
# print(f"Progress saved: {successful_lookups + players_with_licenses}/{len(players)} players have licenses")
print(f"Progress saved: {successful_lookups + players_with_licenses}/{len(players)} players have licenses")
print(f"\n=== ENRICHMENT COMPLETE ===")
print(f"Total processed this run: {total_processed}")
@ -1821,6 +1845,7 @@ def enrich_rankings_with_licenses(request):
'existing_files': existing_files,
'default_session_id': default_session_id,
'default_id_homologation': default_id_homologation,
'default_sexe': default_sexe
}
rendered_html = html_template.render(Context(context))

@ -1,4 +1,4 @@
anonymous-players:5895
anonymous-players:5893
max-players:14919
unrank-male-value:13296
;1;COLLOMBON;Alix;FRA;1244033;0;Non;0;ILE DE FRANCE;57 93 0505;AS PADEL AFICIONADOS;0;;1993;
@ -142,8 +142,8 @@ unrank-male-value:13296
;92;SCHAFFO;Magaly;FRA;7043853;5188;Non;13;GRAND EST;55 67 8000;4PADEL STRASBOURG;-25;;1983;
;92;AMRHEIN;Louise;FRA;3498591;;Non;;GRAND EST;55 67 0024;TC ILLKIRCH GRAFFENSTADEN;0;;1996;
;93;HOFER;Alice;FRA;8607373;5080;Non;20;AUVERGNE RHONE-ALPES;50 26 0009;PIERRELATTE TC;41;;1991;
;94;;;;;5075;Non;26;ILE DE FRANCE;;;1;;;
;94;;;;;5075;Non;26;ILE DE FRANCE;;;1;;;
;94;BEKHEDDA;Neïla;FRA;106280;5075;Non;26;ILE DE FRANCE;57 78 0094;A.S. LES PYRAMIDES;1;87;2009;
;94;BEKHEDDA;Feryel;FRA;106279;5075;Non;26;ILE DE FRANCE;57 78 0094;A.S. LES PYRAMIDES;1;87;2009;
;96;JACQUARD;Ines;FRA;1691141;5070;Non;31;OCCITANIE;60 31 0801;TOP PADEL PLAISANCE;12;;1992;
;97;HAMROUNI;Cyrine;FRA;9712049;5060;Non;9;ILE DE FRANCE;57 93 0467;LE BOURGET TENNIS CLUB;-39;;2001;
;98;PIAU;Sylvie;FRA;1797076;5055;Non;19;OCCITANIE;60 66 8008;START SPORTS Perpignan;3;;1976;

Can't render this file because it is too large.

File diff suppressed because it is too large Load Diff

@ -1,4 +1,4 @@
anonymous-players:5895
anonymous-players:5893
max-players:100721
unrank-male-value:93037
;1;LEYGUE;Thomas;FRA;7897265;0;Non;0;ILE DE FRANCE;57 93 0505;AS PADEL AFICIONADOS;0;;2001;

Can't render this file because it is too large.
Loading…
Cancel
Save