You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
4.3 KiB
133 lines
4.3 KiB
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) |
|
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']) |
|
import json |
|
rows_json = request.POST.get('rows') |
|
if request.method == "POST" and rows_json: |
|
try: |
|
rows = json.loads(rows_json) |
|
for row in rows: |
|
writer.writerow(row) |
|
except Exception: |
|
pass # fallback below if erreur |
|
else: |
|
arrivees = course.arrivees.select_related('coureur').order_by('rang') |
|
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) |
|
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 |
|
import json |
|
rows_json = request.POST.get('rows') |
|
if request.method == "POST" and rows_json: |
|
try: |
|
rows = json.loads(rows_json) |
|
for row in rows: |
|
p.drawString(50, y, str(row[0])) |
|
p.drawString(100, y, str(row[1])) |
|
p.drawString(300, y, str(row[2])) |
|
p.drawString(400, y, str(row[3])) |
|
y -= 20 |
|
if y < 50: |
|
p.showPage() |
|
y = height - 50 |
|
except Exception: |
|
pass # fallback below si erreur |
|
else: |
|
arrivees = course.arrivees.select_related('coureur').order_by('rang') |
|
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() |
|
})
|
|
|