88 lines
2.9 KiB
Python
88 lines
2.9 KiB
Python
|
|
"""
|
||
|
|
Routes pour la gestion des matériels : le cœur du stock.
|
||
|
|
|
||
|
|
Un "matériel" représente un type d'objet suivi en stock (nom + code-barre
|
||
|
|
optionnel + quantité), pas un exemplaire individuel — voir app/models.py.
|
||
|
|
"""
|
||
|
|
|
||
|
|
from fastapi import APIRouter, Depends, Form
|
||
|
|
from fastapi.requests import Request
|
||
|
|
from fastapi.responses import RedirectResponse
|
||
|
|
from sqlmodel import Session, select
|
||
|
|
|
||
|
|
from app.database import get_session
|
||
|
|
from app.email_alerts import verifier_et_alerter
|
||
|
|
from app.models import Materiel, SousCategorie
|
||
|
|
from app.templates_engine import templates
|
||
|
|
|
||
|
|
router = APIRouter()
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/materiels")
|
||
|
|
def lister_materiels(request: Request, session: Session = Depends(get_session)):
|
||
|
|
"""Liste tous les matériels, avec les sous-catégories pour le formulaire de création."""
|
||
|
|
materiels = session.exec(select(Materiel)).all()
|
||
|
|
sous_categories = session.exec(select(SousCategorie)).all()
|
||
|
|
return templates.TemplateResponse(
|
||
|
|
request,
|
||
|
|
"materiels.html",
|
||
|
|
{"materiels": materiels, "sous_categories": sous_categories},
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
@router.post("/materiels")
|
||
|
|
def creer_materiel(
|
||
|
|
nom: str = Form(...),
|
||
|
|
sous_categorie_id: int = Form(...),
|
||
|
|
code_barre: str = Form(""),
|
||
|
|
quantite: int = Form(0),
|
||
|
|
seuil_alerte: str = Form(""),
|
||
|
|
session: Session = Depends(get_session),
|
||
|
|
):
|
||
|
|
"""Crée un nouveau type de matériel dans le stock."""
|
||
|
|
materiel = Materiel(
|
||
|
|
nom=nom,
|
||
|
|
sous_categorie_id=sous_categorie_id,
|
||
|
|
code_barre=code_barre or None,
|
||
|
|
quantite=quantite,
|
||
|
|
seuil_alerte=int(seuil_alerte) if seuil_alerte else None,
|
||
|
|
)
|
||
|
|
session.add(materiel)
|
||
|
|
session.commit()
|
||
|
|
session.refresh(materiel)
|
||
|
|
verifier_et_alerter(materiel, session)
|
||
|
|
return RedirectResponse(url="/materiels", status_code=303)
|
||
|
|
|
||
|
|
|
||
|
|
@router.post("/materiels/{materiel_id}/modifier")
|
||
|
|
def modifier_materiel(
|
||
|
|
materiel_id: int,
|
||
|
|
nom: str = Form(...),
|
||
|
|
code_barre: str = Form(""),
|
||
|
|
quantite: int = Form(0),
|
||
|
|
seuil_alerte: str = Form(""),
|
||
|
|
session: Session = Depends(get_session),
|
||
|
|
):
|
||
|
|
"""Met à jour un matériel existant (nom, code-barre, quantité, seuil d'alerte)."""
|
||
|
|
materiel = session.get(Materiel, materiel_id)
|
||
|
|
if materiel:
|
||
|
|
materiel.nom = nom
|
||
|
|
materiel.code_barre = code_barre or None
|
||
|
|
materiel.quantite = quantite
|
||
|
|
materiel.seuil_alerte = int(seuil_alerte) if seuil_alerte else None
|
||
|
|
session.add(materiel)
|
||
|
|
session.commit()
|
||
|
|
session.refresh(materiel)
|
||
|
|
verifier_et_alerter(materiel, session)
|
||
|
|
return RedirectResponse(url="/materiels", status_code=303)
|
||
|
|
|
||
|
|
|
||
|
|
@router.post("/materiels/{materiel_id}/supprimer")
|
||
|
|
def supprimer_materiel(materiel_id: int, session: Session = Depends(get_session)):
|
||
|
|
"""Supprime définitivement un matériel du stock."""
|
||
|
|
materiel = session.get(Materiel, materiel_id)
|
||
|
|
if materiel:
|
||
|
|
session.delete(materiel)
|
||
|
|
session.commit()
|
||
|
|
return RedirectResponse(url="/materiels", status_code=303)
|