+
+
+
+
+
+
+
+ {% if error %}
+
{{ error }}
+ {% endif %}
+ {% if progress %}
+
{{ progress }}
+ {% endif %}
+ {% if pdf_url %}
+
T\00e9l\00e9charger le PDF
+ {% endif %}
+
+{% block extra_js %}
+
+
+
+
+{% endblock %}
{% endblock %}
\ No newline at end of file
diff --git a/main/templates/scan.html b/main/templates/scan.html
index 35b21c5..285f97d 100644
--- a/main/templates/scan.html
+++ b/main/templates/scan.html
@@ -156,7 +156,9 @@ function onScanSuccess(decodedText, decodedResult) {
.then(response => response.text())
.then(html => {
document.getElementById('scanResult').innerHTML = html;
- window.scanDebounce = false;
+ setTimeout(function() {
+ window.scanDebounce = false;
+ }, 100); // 100ms de délai avant d'autoriser un nouveau scan
})
.catch(() => {
window.scanDebounce = false;
diff --git a/main/templates/scan_result.html b/main/templates/scan_result.html
index 93712d8..cc4cfbe 100644
--- a/main/templates/scan_result.html
+++ b/main/templates/scan_result.html
@@ -1,7 +1,7 @@
{% if result %}
Arrivée enregistrée :
- Nom : {{ result.nom }}
+ Coureur : {{ result.nom }} {{ result.prenom }}
Classe : {{ result.classe }}
Rang : {{ result.rang }}
Temps : {{ result.temps }}
diff --git a/main/views.py b/main/views.py
index 654b799..8fe5323 100644
--- a/main/views.py
+++ b/main/views.py
@@ -222,43 +222,43 @@ def dossards_view(request):
progress = None
pdf_url = None
if request.method == 'POST':
- form = DossardForm(request.POST, request.FILES)
- if form.is_valid():
- csv_file = form.cleaned_data['csv_file']
- rows = form.cleaned_data['rows']
- cols = form.cleaned_data['cols']
- try:
- # Build or find Coureur objects for each line. Accept either 'nom;classe' or 'nom;prenom;classe'.
- data = []
- for line in csv_file.read().decode('utf-8').splitlines():
- parts = [p.strip() for p in line.split(';') if p.strip() != '']
- if len(parts) == 2:
- nom, classe = parts
- prenom = ''
- elif len(parts) == 3:
- nom, prenom, classe = parts
- else:
- continue
- coureur, _ = Coureur.objects.get_or_create(nom=nom, prenom=prenom, classe=classe)
- data.append(coureur)
- total = len(data)
- progress = f"G\u00e9n\u00e9ration des dossards : 0/{total}..."
- buffer = generate_dossards_pdf(data, rows, cols)
- response = HttpResponse(buffer, content_type='application/pdf')
- response['Content-Disposition'] = f'attachment; filename="dossards_{rows}x{cols}.pdf"'
- return response
- except Exception as e:
- error = str(e)
- else:
- error = "Formulaire invalide."
- else:
- form = DossardForm()
+ # Get the list of Coureur IDs from the POST data
+ coureur_ids_str = request.POST.get('coureur_ids', '')
+ rows = int(request.POST.get('rows', 2))
+ cols = int(request.POST.get('cols', 2))
+ try:
+ coureur_ids = [cid for cid in coureur_ids_str.split(',') if cid.strip()]
+ if not coureur_ids:
+ error = "Aucun coureur sélectionné."
+ else:
+ # Accept both PKs and names for fallback (legacy/fallback)
+ coureurs = list(Coureur.objects.filter(id__in=coureur_ids))
+ # If fallback: try by name if not found by id
+ if len(coureurs) < len(coureur_ids):
+ missing = set(coureur_ids) - set(str(c.id) for c in coureurs)
+ for nom in missing:
+ c = Coureur.objects.filter(nom=nom).first()
+ if c:
+ coureurs.append(c)
+ if not coureurs:
+ error = "Aucun coureur trouvé pour les IDs fournis."
+ else:
+ buffer = generate_dossards_pdf(coureurs, rows, cols)
+ response = HttpResponse(buffer, content_type='application/pdf')
+ response['Content-Disposition'] = f'attachment; filename="dossards_{rows}x{cols}.pdf"'
+ return response
+ except Exception as e:
+ error = str(e)
+ # Liste des coureurs et des classes distinctes pour la DataTable
+ coureurs = Coureur.objects.all().order_by('nom', 'prenom', 'classe')
+ classes = Coureur.objects.values_list('classe', flat=True).distinct().order_by('classe')
return render(request, 'dossards.html', {
'title': 'G\u00e9n\u00e9ration des dossards PDF',
- 'form': form,
'error': error,
'progress': progress,
- 'pdf_url': pdf_url
+ 'pdf_url': pdf_url,
+ 'coureurs': coureurs,
+ 'classes': classes,
})
@@ -274,9 +274,7 @@ def generate_dossards_pdf(data, rows, cols):
label_h = (height - 2 * margin) / rows
x0, y0 = margin, height - margin - label_h
qr_scale = 0.8 # 80% of the label area for the QR
- for idx, (nom, classe) in enumerate(data):
- # data is now a list of Coureur objects
- coureur = data[idx]
+ for idx, coureur in enumerate(data):
col = idx % cols
row = (idx // cols) % rows
page = idx // (rows * cols)