Code/app/plan_d_action/interface.py
2025-06-05 09:28:49 +02:00

128 lines
5.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
import networkx as nx
"""
Script pour générer un rapport factorisé des vulnérabilités critiques
suivant la structure définie dans Remarques.md.
"""
import streamlit as st
import uuid
from utils.translations import _
from utils.widgets import html_expander
from networkx.drawing.nx_agraph import write_dot
from batch_ia import (
load_config,
write_report,
parse_graphs,
extract_data_from_graph,
calculate_vulnerabilities,
generate_report,
)
from app.plan_d_action import (
initialiser_interface,
preparer_graphe,
extraire_niveaux,
selectionner_minerais,
selectionner_noeuds,
extraire_chemins_selon_criteres,
exporter_graphe_filtre,
extraire_liens_filtres,
niveau_labels,
remplacer_par_badge,
JOBS
)
inverse_niveau_labels = {v: k for k, v in niveau_labels.items()}
def interface_plan_d_action(G_temp: nx.DiGraph) -> None:
"""Interface pour planifier l'action de sélection des minerais.
Args:
G_temp (nx.DiGraph): Le graphe temporaire à analyser.
Returns:
None: Modifie le state du Streamlit avec les données nécessaires
pour la génération du rapport factorisé des vulnérabilités critiques.
"""
if "sel_prod" not in st.session_state:
st.session_state.sel_prod = None
if "sel_comp" not in st.session_state:
st.session_state.sel_comp = None
if "sel_miner" not in st.session_state:
st.session_state.sel_miner = None
if "plan_d_action" not in st.session_state:
st.session_state["plan_d_action"] = 0
if "g_md_done" not in st.session_state:
st.session_state["g_md_done"] = False
if "uuid" not in st.session_state:
st.session_state["uuid"] = str(uuid.uuid4())[:8]
st.session_state["G_dot"] = f"{JOBS}/{st.session_state["uuid"]}.dot"
st.session_state["G_md"] = f"{JOBS}/{st.session_state["uuid"]}.md"
if st.session_state["plan_d_action"] == 0:
st.markdown(f"# {str(_('pages.plan_d_action.title'))}")
html_expander(f"{str(_('pages.plan_d_action.help'))}", content="\n".join(_("pages.plan_d_action.help_content")), open_by_default=False, details_class="details_introduction")
# Préparation du graphe
G_temp, niveaux_temp = preparer_graphe(G_temp)
# Sélection des niveaux
niveau_depart = 0
niveau_arrivee = 99
# Sélection fine des noeuds
noeuds_depart, noeuds_arrivee = selectionner_noeuds(G_temp, niveaux_temp, niveau_depart)
# Sélection des minerais si nécessaire
if noeuds_depart:
minerais = selectionner_minerais(G_temp, noeuds_depart)
# Étape 1 : Extraction des niveaux des nœuds
niveaux = extraire_niveaux(G_temp)
# Étape 2 : Extraction des chemins selon les critères
chemins = extraire_chemins_selon_criteres(G_temp, niveaux, niveau_depart, noeuds_depart, noeuds_arrivee, minerais)
niveaux_speciaux = [1000, 1001, 1002, 1010, 1011, 1012]
# Extraction des liens sans filtrage
liens_chemins = extraire_liens_filtres(chemins, niveaux, niveau_depart, niveau_arrivee, niveaux_speciaux)
else:
liens_chemins = None
if liens_chemins:
G_final = exporter_graphe_filtre(G_temp, liens_chemins)
st.session_state["G_final"] = G_final
# formulaire ou sélection
if st.button(str(_("pages.plan_d_action.submit_request")), icon=":material/send:"):
# On déclenche la suite — mais on NE traite rien maintenant
st.session_state["plan_d_action"] = 1
st.rerun() # force la réexécution immédiatement avec état mis à jour
elif st.session_state["plan_d_action"] == 1:
st.markdown("")
# Traitement lourd une seule fois
if not st.session_state["g_md_done"]:
write_dot(st.session_state["G_final"], st.session_state["G_dot"])
config = load_config()
graph, ref_graph = parse_graphs(st.session_state["G_dot"])
data = extract_data_from_graph(graph, ref_graph)
results = calculate_vulnerabilities(data, config)
report, file_names = generate_report(data, results, config)
write_report(remplacer_par_badge(report), st.session_state["G_md"])
st.session_state["g_md_done"] = True # pour ne pas re-traiter à chaque affichage
# Affichage de linterface Streamlit
initialiser_interface(st.session_state["G_md"])
if (st.button("Réinitialiser", icon=":material/refresh:")):
st.session_state["plan_d_action"] = 0
st.session_state["g_md_done"] = False
st.session_state.sel_prod = None
st.session_state.sel_comp = None
st.session_state.sel_miner = None
for f in JOBS.glob(f"*{st.session_state["uuid"]}*"):
if f.is_file():
f.unlink()
st.rerun()