import csv from django.http import HttpResponse from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import A4 from django.contrib.auth.decorators import login_required def export_csv(request, course_id): course = get_object_or_404(Course, id=course_id) arrivees = course.arrivees.select_related('coureur').order_by('rang') response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = f'attachment; filename="course_{course_id}_resultats.csv"' writer = csv.writer(response) writer.writerow(['Rang', 'Nom', 'Classe', 'Temps']) for a in arrivees: writer.writerow([a.rang, a.coureur.nom, a.coureur.classe, str(a.temps)]) return response def export_pdf(request, course_id): course = get_object_or_404(Course, id=course_id) arrivees = course.arrivees.select_related('coureur').order_by('rang') response = HttpResponse(content_type='application/pdf') response['Content-Disposition'] = f'attachment; filename="course_{course_id}_resultats.pdf"' p = canvas.Canvas(response, pagesize=A4) width, height = A4 y = height - 50 p.setFont("Helvetica-Bold", 16) p.drawString(50, y, f"Résultats - {course.nom} ({course.date})") y -= 40 p.setFont("Helvetica", 12) p.drawString(50, y, "Rang") p.drawString(100, y, "Nom") p.drawString(300, y, "Classe") p.drawString(400, y, "Temps") y -= 20 for a in arrivees: p.drawString(50, y, str(a.rang)) p.drawString(100, y, a.coureur.nom) p.drawString(300, y, a.coureur.classe) p.drawString(400, y, str(a.temps)) y -= 20 if y < 50: p.showPage() y = height - 50 p.save() return response from django.shortcuts import get_object_or_404 from django.utils import timezone from .models import Arrivee @login_required def course_detail_view(request, course_id): course = get_object_or_404(Course, id=course_id) arrivees = course.arrivees.select_related('coureur').order_by('rang') is_started = course.depart is not None is_finished = course.fin is not None # Gestion du bouton départ/fin if request.method == 'POST': if 'start' in request.POST and not is_started: course.depart = timezone.now() course.save() is_started = True elif 'finish' in request.POST and is_started and not is_finished: course.fin = timezone.now() course.save() is_finished = True return redirect('course_detail', course_id=course.id) if request.headers.get('x-requested-with') == 'XMLHttpRequest': # Ne renvoie que le tbody pour le rafraîchissement websocket from django.template.loader import render_to_string tbody = render_to_string('arrivees_tbody.html', {'arrivees': arrivees}) return HttpResponse(tbody) return render(request, 'course_detail.html', { 'course': course, 'arrivees': arrivees, 'is_started': is_started, 'is_finished': is_finished }) from django.shortcuts import render, redirect from django.contrib.auth.decorators import login_required from .models import Course from .forms import CourseForm @login_required def main_view(request): from django.utils import timezone courses = Course.objects.all() if request.method == 'POST' and request.headers.get('x-requested-with') == 'XMLHttpRequest': from django.http import JsonResponse nom = request.POST.get('nom') date = timezone.localdate() if not nom: return JsonResponse({'success': False, 'error': "Le nom de la course est requis."}) if Course.objects.filter(nom=nom, date=date).exists(): return JsonResponse({'success': False, 'error': "Une course avec ce nom existe déjà aujourd'hui."}) course = Course.objects.create(nom=nom, date=date) return JsonResponse({'success': True, 'course_id': course.id}) form = CourseForm() return render(request, 'main.html', { 'courses': courses, 'form': form, 'now': timezone.localdate() })