# 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")), step=1) paperwidth = st.number_input("Largeur du papier:", value=int(response_format_parameters.get("paperwidth")), step=30) paperheight = st.number_input("Hauteur du papier:", value=int(response_format_parameters.get("paperheight")), step=30) margin = st.number_input("Marge:", value=int(response_format_parameters.get("margin")), step=10) vmargin = st.number_input("Marge verticale:", value=int(response_format_parameters.get("vmargin")), step=10) fps = st.number_input("Images par seconde:", value=int(response_format_parameters.get("fps")), step=1) stilltime = st.number_input("Temps d'arrêt:", value=int(response_format_parameters.get("stilltime")), 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['content'], 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}")