Browse Source

Gestion de l'eport PDF/CSV en fonction des données affichées

Bug affichage tableau sur petits écr
master
scayac 3 months ago
parent
commit
8b55b2f632
  1. 32
      courses/views.py
  2. 32
      templates/course_detail.html

32
courses/views.py

@ -3,20 +3,30 @@ from django.http import HttpResponse @@ -3,20 +3,30 @@ 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'])
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)
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)
@ -31,6 +41,24 @@ def export_pdf(request, course_id): @@ -31,6 +41,24 @@ def export_pdf(request, course_id):
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)

32
templates/course_detail.html

@ -54,15 +54,24 @@ @@ -54,15 +54,24 @@
<div class="card-header py-3 d-flex justify-content-between align-items-center">
<h6 class="m-0 font-weight-bold text-primary">Arrivées</h6>
<div>
<a href="{% url 'export_csv' course.id %}" class="btn btn-success mb-2">
<form id="exportCsvForm" method="post" action="{% url 'export_csv' course.id %}" style="display:inline;">
{% csrf_token %}
<input type="hidden" name="rows" id="csvRowsInput">
<button type="submit" class="btn btn-success mb-2" id="btnExportCsv">
<i class="fas fa-file-csv" title="Exporter en CSV"></i>
</a>
<a href="{% url 'export_pdf' course.id %}" class="btn btn-danger mb-2">
</button>
</form>
<form id="exportPdfForm" method="post" action="{% url 'export_pdf' course.id %}" style="display:inline;">
{% csrf_token %}
<input type="hidden" name="rows" id="pdfRowsInput">
<button type="submit" class="btn btn-danger mb-2" id="btnExportPdf">
<i class="fas fa-file-pdf" title="Exporter en PDF"></i>
</a>
</button>
</form>
</div>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-striped" id="arriveesTable">
<thead>
<tr>
@ -95,6 +104,7 @@ @@ -95,6 +104,7 @@
</div>
</div>
</div>
</div>
{% endblock %}
{% block extra_js %}
<!-- DataTables JS & CSS -->
@ -140,5 +150,19 @@ document.getElementById('btnFinish').onclick = function() { @@ -140,5 +150,19 @@ document.getElementById('btnFinish').onclick = function() {
$(document).ready(function() {
$('#arriveesTable').DataTable();
});
// Export CSV/PDF des données filtrées
function getVisibleRows() {
var dt = $('#arriveesTable').DataTable();
var rows = dt.rows({search: 'applied'}).data().toArray();
return JSON.stringify(rows);
}
$('#exportCsvForm').on('submit', function(e) {
$('#csvRowsInput').val(getVisibleRows());
});
$('#exportPdfForm').on('submit', function(e) {
$('#pdfRowsInput').val(getVisibleRows());
});
</script>
{% endblock %}
Loading…
Cancel
Save