"""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)