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