2026-07-14 16:38:59 +00:00
|
|
|
"""
|
2026-07-14 17:06:37 +00:00
|
|
|
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.
|
2026-07-14 16:38:59 +00:00
|
|
|
|
|
|
|
|
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
|
2026-07-14 17:06:37 +00:00
|
|
|
from app.models import Categorie, DestinataireAlerte, Materiel # noqa: E402
|
2026-07-14 16:38:59 +00:00
|
|
|
|
2026-07-14 17:06:37 +00:00
|
|
|
# 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.
|
2026-07-14 16:38:59 +00:00
|
|
|
# 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 = [
|
|
|
|
|
(
|
2026-07-14 17:06:37 +00:00
|
|
|
["Ordinateurs", "Portables"],
|
2026-07-14 16:38:59 +00:00
|
|
|
[
|
|
|
|
|
("PC Dell XPS 13 (modèle 9310)", "1111111111111", 3, 5),
|
|
|
|
|
("PC Lenovo ThinkPad T14", "1111111111112", 8, 3),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
(
|
2026-07-14 17:06:37 +00:00
|
|
|
["Réseau", "Câbles", "RJ45"],
|
2026-07-14 16:38:59 +00:00
|
|
|
[
|
|
|
|
|
("Câble RJ45 2m", "2222222222221", 42, 10),
|
|
|
|
|
("Câble RJ45 5m", "2222222222222", 15, 10),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
(
|
2026-07-14 17:06:37 +00:00
|
|
|
["Périphériques", "Souris/claviers"],
|
2026-07-14 16:38:59 +00:00
|
|
|
[
|
|
|
|
|
("Souris USB filaire", "3333333333331", 2, 5),
|
|
|
|
|
("Clavier USB AZERTY", "3333333333332", 6, 3),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
DESTINATAIRE_DEMO = "it-dept@clinique.local"
|
|
|
|
|
|
|
|
|
|
|
2026-07-14 17:06:37 +00:00
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
2026-07-14 16:38:59 +00:00
|
|
|
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
|
|
|
|
|
|
2026-07-14 17:06:37 +00:00
|
|
|
for chemin_categories, materiels in DONNEES_DEMO:
|
|
|
|
|
categorie = _obtenir_ou_creer_branche(session, chemin_categories)
|
2026-07-14 16:38:59 +00:00
|
|
|
for nom, code_barre, quantite, seuil_alerte in materiels:
|
|
|
|
|
session.add(
|
|
|
|
|
Materiel(
|
|
|
|
|
nom=nom,
|
|
|
|
|
code_barre=code_barre,
|
|
|
|
|
quantite=quantite,
|
|
|
|
|
seuil_alerte=seuil_alerte,
|
2026-07-14 17:06:37 +00:00
|
|
|
categorie_id=categorie.id,
|
2026-07-14 16:38:59 +00:00
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
session.add(DestinataireAlerte(email=DESTINATAIRE_DEMO))
|
|
|
|
|
session.commit()
|
2026-07-14 17:06:37 +00:00
|
|
|
print("Données de démo créées : arborescence de catégories, 6 matériels, 1 destinataire.")
|
2026-07-14 16:38:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
peupler()
|