Code/app/fiches/interface.py
2025-05-13 16:31:53 +02:00

120 lines
6.1 KiB
Python

# === Constantes et imports ===
import streamlit as st
import requests
import os
import pathlib
from utils.translations import _
from .utils.tickets.display import afficher_tickets_par_fiche
from .utils.tickets.creation import formulaire_creation_ticket_dynamique
from .utils.tickets.core import rechercher_tickets_gitea
from config import GITEA_TOKEN, GITEA_URL, ORGANISATION, DEPOT_FICHES, ENV, FICHES_CRITICITE
from utils.gitea import charger_arborescence_fiches
from .utils.fiche_utils import load_seuils, doit_regenerer_fiche
from .generer import generer_fiche
def interface_fiches():
st.markdown(f"# {str(_('pages.fiches.title', 'Découverte des fiches'))}")
with st.expander(str(_("pages.fiches.help", "Comment utiliser cet onglet ?")), expanded=False):
st.markdown("\n".join([
" " + line for line in _("pages.fiches.help_content", [
"1. Parcourez la liste des fiches disponibles par catégorie",
"2. Sélectionnez une fiche pour afficher son contenu complet",
"3. Consultez les données détaillées, graphiques et analyses supplémentaires",
"4. Utilisez ces informations pour approfondir votre compréhension des vulnérabilités identifiées",
"",
"Les catégories sont les suivantes :",
"* Assemblage : opération d'assemblage des produits finaux à partir des composants",
"* Connexe : opérations diverses nécessaires pour fabriquer le numérique, mais n'entrant pas directement dans sa composition",
"* Criticités : indices utilisés pour identifier et évaluer les vulnérabilités",
"* Fabrication : opération de fabrication des composants à partir de minerais",
"* Minerai : description et opérations d'extraction et de traitement des minerais"
])
]))
st.markdown("---")
if "fiches_arbo" not in st.session_state:
st.session_state["fiches_arbo"] = charger_arborescence_fiches()
arbo = st.session_state.get("fiches_arbo", {})
if not arbo:
st.warning(str(_("pages.fiches.no_files", "Aucune fiche disponible pour le moment.")))
return
dossiers = sorted(arbo.keys(), key=lambda x: x.lower())
dossier_choisi = st.selectbox(
str(_("pages.fiches.choose_category", "Choisissez une catégorie de fiches")),
[str(_("pages.fiches.select_folder", "-- Sélectionner un dossier --"))] + dossiers
)
if dossier_choisi and dossier_choisi != str(_("pages.fiches.select_folder", "-- Sélectionner un dossier --")):
fiches = arbo.get(dossier_choisi, [])
noms_fiches = [f['nom'] for f in fiches]
fiche_choisie = st.selectbox(
str(_("pages.fiches.choose_file", "Choisissez une fiche")),
[str(_("pages.fiches.select_file", "-- Sélectionner une fiche --"))] + noms_fiches
)
if fiche_choisie and fiche_choisie != str(_("pages.fiches.select_file", "-- Sélectionner une fiche --")):
fiche_info = next((f for f in fiches if f["nom"] == fiche_choisie), None)
if fiche_info:
try:
headers = {"Authorization": f"token {GITEA_TOKEN}"}
reponse_fiche = requests.get(fiche_info["download_url"], headers=headers)
reponse_fiche.raise_for_status()
md_source = reponse_fiche.text
if "seuils" not in st.session_state:
SEUILS = load_seuils("assets/config.yaml")
st.session_state["seuils"] = SEUILS
else:
SEUILS = st.session_state["seuils"]
nom_fiche = os.path.splitext(fiche_choisie)[0]
html_path = os.path.join("HTML", dossier_choisi, nom_fiche + ".html")
path_relative = f"Documents/{dossier_choisi}/{fiche_choisie}"
commits_url = f"{GITEA_URL}/repos/{ORGANISATION}/{DEPOT_FICHES}/commits?path={path_relative}&sha={ENV}"
regenerate = doit_regenerer_fiche(
html_path=html_path,
fiche_type=fiche_info.get("type", ""),
fiche_choisie=fiche_choisie,
commit_url=commits_url,
fichiers_criticite=FICHES_CRITICITE
)
if regenerate:
html_path = generer_fiche(md_source, dossier_choisi, fiche_choisie, SEUILS)
with open(html_path, "r", encoding="utf-8") as f:
st.markdown(f.read(), unsafe_allow_html=True)
if st.session_state.get("logged_in", False):
pdf_name = nom_fiche + ".pdf"
pdf_path = os.path.join("static", "Fiches", dossier_choisi, pdf_name)
# Bouton de téléchargement du PDF
if os.path.exists(pdf_path):
with open(pdf_path, "rb") as pdf_file:
st.download_button(
label=str(_("pages.fiches.download_pdf", "Télécharger cette fiche en PDF")),
data=pdf_file,
file_name=pdf_name,
mime="application/pdf",
help=str(_("pages.fiches.download_pdf", "Télécharger cette fiche en PDF")),
key="telecharger_fiche_pdf"
)
else:
st.warning(str(_("pages.fiches.pdf_unavailable", "Le fichier PDF de cette fiche n'est pas disponible.")))
st.markdown(f"## {str(_('pages.fiches.ticket_management', 'Gestion des tickets pour cette fiche'))}")
afficher_tickets_par_fiche(rechercher_tickets_gitea(fiche_choisie))
formulaire_creation_ticket_dynamique(fiche_choisie)
except Exception as e:
st.error(f"{str(_('pages.fiches.loading_error', 'Erreur lors du chargement de la fiche :'))} {e}")