""" Peuple la base locale (data/stock.db) avec une arborescence de catégories et des matériels de démonstration, incluant des codes-barres, pour pouvoir tester l'écran de scan et le déclenchement des alertes email sans tout recréer à la main à chaque fois. Ne fait rien si la base contient déjà des matériels (pour ne pas dupliquer les données à chaque exécution). Usage : python scripts/seed.py """ import sys from pathlib import Path # Permet de lancer "python scripts/seed.py" directement : ajoute la racine # du projet à sys.path pour que "import app" fonctionne quel que soit le # répertoire courant d'où le script est appelé. sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) from sqlmodel import Session, select # noqa: E402 from app.database import engine, init_db # noqa: E402 from app.models import Categorie, DestinataireAlerte, Materiel # noqa: E402 # Chaque branche est une liste de noms de catégories du plus général au # plus spécifique (ex: "Réseau" > "Câbles" > "RJ45"), suivie des matériels # rattachés au dernier niveau. La branche Réseau va jusqu'à 3 niveaux pour # montrer que la profondeur n'est pas limitée à catégorie/sous-catégorie. # Les quantités sont volontairement sous le seuil pour certains matériels, # afin de pouvoir vérifier immédiatement que les alertes se déclenchent bien. DONNEES_DEMO = [ ( ["Ordinateurs", "Portables"], [ ("PC Dell XPS 13 (modèle 9310)", "1111111111111", 3, 5), ("PC Lenovo ThinkPad T14", "1111111111112", 8, 3), ], ), ( ["Réseau", "Câbles", "RJ45"], [ ("Câble RJ45 2m", "2222222222221", 42, 10), ("Câble RJ45 5m", "2222222222222", 15, 10), ], ), ( ["Périphériques", "Souris/claviers"], [ ("Souris USB filaire", "3333333333331", 2, 5), ("Clavier USB AZERTY", "3333333333332", 6, 3), ], ), ] DESTINATAIRE_DEMO = "it-dept@clinique.local" def _obtenir_ou_creer_branche(session: Session, noms: list[str]) -> Categorie: """Crée (ou réutilise) une chaîne de catégories parent -> enfant à partir d'une liste de noms, et renvoie le dernier niveau.""" parent_id = None categorie = None for nom in noms: categorie = session.exec( select(Categorie).where(Categorie.nom == nom, Categorie.parent_id == parent_id) ).first() if categorie is None: categorie = Categorie(nom=nom, parent_id=parent_id) session.add(categorie) session.commit() session.refresh(categorie) parent_id = categorie.id return categorie def peupler() -> None: init_db() with Session(engine) as session: if session.exec(select(Materiel)).first(): print("La base contient déjà des matériels, rien à faire.") return for chemin_categories, materiels in DONNEES_DEMO: categorie = _obtenir_ou_creer_branche(session, chemin_categories) for nom, code_barre, quantite, seuil_alerte in materiels: session.add( Materiel( nom=nom, code_barre=code_barre, quantite=quantite, seuil_alerte=seuil_alerte, categorie_id=categorie.id, ) ) session.add(DestinataireAlerte(email=DESTINATAIRE_DEMO)) session.commit() print("Données de démo créées : arborescence de catégories, 6 matériels, 1 destinataire.") if __name__ == "__main__": peupler()