devel #1

Merged
seb_vallee merged 2 commits from jblb/BillManager:devel into master 2026-03-13 11:23:36 +01:00
3 changed files with 25 additions and 1 deletions
Showing only changes of commit 2838a87413 - Show all commits

View File

@@ -1,7 +1,7 @@
import json
from datetime import date, timedelta
from fastapi import APIRouter, Depends, Request, Form, HTTPException
from fastapi.responses import HTMLResponse, RedirectResponse
from fastapi.responses import HTMLResponse, RedirectResponse, Response
from fastapi.templating import Jinja2Templates
from sqlalchemy.orm import Session
@@ -10,6 +10,7 @@ from models import Devis, LigneDevis, Client, StatutDevis
from numerotation import generer_numero_devis
from auth import get_current_user
from template_helper import render
from config import settings
router = APIRouter(prefix="/devis", tags=["devis"], dependencies=[Depends(get_current_user)])
templates = Jinja2Templates(directory="templates")
@@ -150,6 +151,27 @@ def changer_statut_devis(
db.commit()
return RedirectResponse(f"/devis/{devis_id}", status_code=303)
@router.get("/{devis_id}/pdf")
def telecharger_devis__pdf(devis_id: int, db: Session = Depends(get_db)):
from weasyprint import HTML
devis = db.query(Devis).get(devis_id)
if not devis:
raise HTTPException(status_code=404)
html_content = templates.get_template("pdf/devis.html").render({
"devis": devis,
"settings": settings,
})
pdf_bytes = HTML(string=html_content, base_url=".").write_pdf()
filename = f"devis-{devis.numero}.pdf"
return Response(
content=pdf_bytes,
media_type="application/pdf",
headers={"Content-Disposition": f'attachment; filename="{filename}"'}
)
@router.post("/{devis_id}/convertir")
def convertir_en_facture(devis_id: int, db: Session = Depends(get_db)):

View File

@@ -5,6 +5,7 @@
<h1>Devis {{ devis.numero }}</h1>
<div class="btn-group">
<a href="/devis/" class="btn">← Retour</a>
<a href="/devis/{{ devis.id }}/pdf" class="btn btn-primary">⬇ Télécharger PDF</a>
{% if devis.statut.value == 'brouillon' %}
<a href="/devis/{{ devis.id }}/modifier" class="btn">Modifier</a>
{% endif %}

View File

@@ -28,6 +28,7 @@
<td><span class="badge badge-{{ d.statut.value }}">{{ d.statut.value }}</span></td>
<td>
<a href="/devis/{{ d.id }}" class="btn btn-sm">Voir</a>
<a href="/devis/{{ d.id }}/pdf" class="btn btn-sm btn-primary">PDF</a>
</td>
</tr>
{% endfor %}