generate pdf file for devis

devel
JbLb 1 week ago
parent b7046b125c
commit 2838a87413

@ -1,7 +1,7 @@
import json import json
from datetime import date, timedelta from datetime import date, timedelta
from fastapi import APIRouter, Depends, Request, Form, HTTPException 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 fastapi.templating import Jinja2Templates
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
@ -10,6 +10,7 @@ from models import Devis, LigneDevis, Client, StatutDevis
from numerotation import generer_numero_devis from numerotation import generer_numero_devis
from auth import get_current_user from auth import get_current_user
from template_helper import render from template_helper import render
from config import settings
router = APIRouter(prefix="/devis", tags=["devis"], dependencies=[Depends(get_current_user)]) router = APIRouter(prefix="/devis", tags=["devis"], dependencies=[Depends(get_current_user)])
templates = Jinja2Templates(directory="templates") templates = Jinja2Templates(directory="templates")
@ -150,6 +151,27 @@ def changer_statut_devis(
db.commit() db.commit()
return RedirectResponse(f"/devis/{devis_id}", status_code=303) 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") @router.post("/{devis_id}/convertir")
def convertir_en_facture(devis_id: int, db: Session = Depends(get_db)): def convertir_en_facture(devis_id: int, db: Session = Depends(get_db)):

@ -5,6 +5,7 @@
<h1>Devis {{ devis.numero }}</h1> <h1>Devis {{ devis.numero }}</h1>
<div class="btn-group"> <div class="btn-group">
<a href="/devis/" class="btn">← Retour</a> <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' %} {% if devis.statut.value == 'brouillon' %}
<a href="/devis/{{ devis.id }}/modifier" class="btn">Modifier</a> <a href="/devis/{{ devis.id }}/modifier" class="btn">Modifier</a>
{% endif %} {% endif %}

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

Loading…
Cancel
Save