App FastAPI + SQLite + SQLModel + Jinja2 pour gérer le stock de matériel IT (catégories/sous-catégories/matériels), avec recherche par scan de code-barres et alertes email de stock bas.
66 lines
2.5 KiB
Python
66 lines
2.5 KiB
Python
"""Routes pour la gestion des catégories et sous-catégories de matériel."""
|
|
|
|
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.models import Categorie, SousCategorie
|
|
from app.templates_engine import templates
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/categories")
|
|
def lister_categories(request: Request, session: Session = Depends(get_session)):
|
|
"""Affiche toutes les catégories avec leurs sous-catégories imbriquées."""
|
|
categories = session.exec(select(Categorie)).all()
|
|
return templates.TemplateResponse(
|
|
request, "categories.html", {"categories": categories}
|
|
)
|
|
|
|
|
|
@router.post("/categories")
|
|
def creer_categorie(nom: str = Form(...), session: Session = Depends(get_session)):
|
|
"""Crée une nouvelle catégorie de haut niveau (ex: 'Ordinateurs')."""
|
|
session.add(Categorie(nom=nom))
|
|
session.commit()
|
|
return RedirectResponse(url="/categories", status_code=303)
|
|
|
|
|
|
@router.post("/categories/{categorie_id}/supprimer")
|
|
def supprimer_categorie(categorie_id: int, session: Session = Depends(get_session)):
|
|
"""Supprime une catégorie.
|
|
|
|
Refuse silencieusement si elle contient encore des sous-catégories,
|
|
pour éviter de supprimer par erreur des matériels devenus orphelins.
|
|
"""
|
|
categorie = session.get(Categorie, categorie_id)
|
|
if categorie and not categorie.sous_categories:
|
|
session.delete(categorie)
|
|
session.commit()
|
|
return RedirectResponse(url="/categories", status_code=303)
|
|
|
|
|
|
@router.post("/categories/{categorie_id}/sous-categories")
|
|
def creer_sous_categorie(
|
|
categorie_id: int, nom: str = Form(...), session: Session = Depends(get_session)
|
|
):
|
|
"""Crée une sous-catégorie rattachée à une catégorie existante."""
|
|
session.add(SousCategorie(nom=nom, categorie_id=categorie_id))
|
|
session.commit()
|
|
return RedirectResponse(url="/categories", status_code=303)
|
|
|
|
|
|
@router.post("/sous-categories/{sous_categorie_id}/supprimer")
|
|
def supprimer_sous_categorie(
|
|
sous_categorie_id: int, session: Session = Depends(get_session)
|
|
):
|
|
"""Supprime une sous-catégorie si elle ne contient plus aucun matériel."""
|
|
sous_categorie = session.get(SousCategorie, sous_categorie_id)
|
|
if sous_categorie and not sous_categorie.materiels:
|
|
session.delete(sous_categorie)
|
|
session.commit()
|
|
return RedirectResponse(url="/categories", status_code=303)
|