fabriquedoc/frontend/app_tab3.py
François Pelletier ac457746f3 feat: Améliorer la robustesse du frontend et corriger les erreurs de type
Corrige plusieurs problèmes dans les onglets du frontend pour améliorer la stabilité et la gestion des données :

frontend/app_tab3.py :

Remplace st.session_state['content'] par st.session_state['markdown'] pour assurer la cohérence de la clé de session.
Ajoute des valeurs par défaut aux appels .get() pour les champs de paramètres (couleur des liens, moteur PDF, taille de police, dimensions du papier, marges, FPS, temps d'arrêt) afin d'éviter les erreurs de type None.
frontend/app_tab4.py :

Améliore la gestion des erreurs lors de la récupération des listes d'images et des images individuelles en vérifiant les codes de statut HTTP.
Ajoute une gestion pour le scénario où aucune image n'est disponible, affichant un message informatif à l'utilisateur.
2025-06-30 21:58:09 -04:00

82 lines
No EOL
4.4 KiB
Python

# Importation des modules nécessaires
import datetime # Pour manipuler les dates et heures
import requests # Pour effectuer des requêtes HTTP
import streamlit as st # Pour créer l'interface utilisateur web
# Importation de la classe DocumentSpecs depuis le module models
from models import DocumentSpecs
# Définition de la fonction principale pour l'onglet 3 de l'application
def app_tab3():
# Affichage d'un en-tête dans l'interface utilisateur
st.header("Paramètres")
# Préparation des en-têtes HTTP pour l'authentification
http_headers = {"Authorization": f"Bearer {st.session_state['bearer_token']}"}
# Récupération et sélection des styles disponibles
response_styles = requests.get(f"{st.session_state['fabriquedoc_endpoint']}/styles/", headers=http_headers).json()
styles = response_styles.get("styles")
selected_style = st.selectbox("Sélectionnez un style:", styles)
# Récupération et sélection des formats disponibles pour le style choisi
response_formats = requests.get(f"{st.session_state['fabriquedoc_endpoint']}/formats/{selected_style}/", headers=http_headers).json()
formats = response_formats.get("formats")
selected_format = st.selectbox("Sélectionnez un format:", formats)
# Récupération des paramètres de format pour le style et le format choisis
response_format_parameters = requests.get(
f"{st.session_state['fabriquedoc_endpoint']}/format_parameters/{selected_style}/{selected_format}/", headers=http_headers).json()
# Création des champs de saisie pour les différents paramètres
linkcolor = st.text_input("Couleur des liens:", value=response_format_parameters.get("linkcolor", ""))
pdfengine = st.text_input("Moteur PDF:", value=response_format_parameters.get("pdfengine", ""))
fontsize = st.number_input("Taille de la police:", value=int(response_format_parameters.get("fontsize", 0)), step=1)
paperwidth = st.number_input("Largeur du papier:", value=int(response_format_parameters.get("paperwidth", 0)), step=30)
paperheight = st.number_input("Hauteur du papier:", value=int(response_format_parameters.get("paperheight", 0)), step=30)
margin = st.number_input("Marge:", value=int(response_format_parameters.get("margin", 0)), step=10)
vmargin = st.number_input("Marge verticale:", value=int(response_format_parameters.get("vmargin", 0)), step=10)
fps = st.number_input("Images par seconde:", value=int(response_format_parameters.get("fps", 0)), step=1)
stilltime = st.number_input("Temps d'arrêt:", value=int(response_format_parameters.get("stilltime", 0)), step=1)
# Création d'un bouton pour générer le document
if st.button("Générer le document"):
# Création d'un objet DocumentSpecs avec les paramètres saisis
document_specs = DocumentSpecs(
format=selected_format,
style=selected_style,
linkcolor=linkcolor,
pdfengine=pdfengine,
content=st.session_state['markdown'],
fontsize=fontsize,
paperwidth=paperwidth,
paperheight=paperheight,
margin=margin,
vmargin=vmargin,
fps=fps,
stilltime=stilltime
)
# Préparation des en-têtes pour la requête POST
post_headers = http_headers | {"Content-Type": "application/json"}
# Envoi de la requête POST pour générer le document
response = requests.post(f"{st.session_state['fabriquedoc_endpoint']}/generer/",
json=document_specs.model_dump(),
headers=post_headers,
timeout=(30, 3000)) # 30 secondes de timeout pour la connexion, 5 minutes pour la lecture
# Vérification du code de statut de la réponse
if 200 <= response.status_code <= 299:
# Si la requête est réussie, récupération des données du fichier
file_data = response.content
datef = datetime.datetime.now().strftime("%m-%d-%Y")
# Création du nom de fichier
file_name = f"{document_specs.style}-{document_specs.format}-{datef}-output.zip"
# Affichage d'un bouton de téléchargement
st.download_button('Télécharger', file_data, file_name=file_name)
else:
# Si la requête échoue, affichage d'un message d'erreur
st.error(f"La requête a échoué avec le code d'état {response.status_code}: {response.text}")