IT-Stock/app/routers/categories.py
maxsoch 8bb5c9406a Initial scaffold: gestion de stock IT pour le département IT
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.
2026-07-14 18:38:59 +02:00

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)