Code source de services.api_ihm.src.main.doc_routes

"""Routes pour la documentation.

Ce module gère l'accès à la documentation technique du projet.
"""

import os
from pathlib import Path
import subprocess
from flask import Blueprint, send_from_directory, current_app, render_template
import logging
import sys

logger = logging.getLogger(__name__)

doc_bp = Blueprint('documentation', __name__, url_prefix='/doc')

# Chemin vers le dossier de documentation
current_dir = os.path.dirname(os.path.abspath(__file__))
project_root = os.path.abspath(
    os.path.join(current_dir, '..', '..', '..', '..'))
DOC_BUILD_PATH = os.path.normpath(
    os.path.join(project_root, 'docs', 'docstring', 'static_docs'))
DOC_SOURCE_PATH = os.path.normpath(
    os.path.join(project_root, 'docs', 'docstring', 'source'))

logger.info(f"Chemins de documentation configurés:")
logger.info(f"- Répertoire courant: {current_dir}")
logger.info(f"- Racine du projet: {project_root}")
logger.info(f"- Dossier build: {DOC_BUILD_PATH}")
logger.info(f"- Dossier source: {DOC_SOURCE_PATH}")


[docs] @doc_bp.before_request def ensure_doc_exists(): """Vérifie que la documentation existe, sinon la génère.""" try: # Vérifier si les chemins sont valides if not os.path.exists(project_root): raise ValueError(f"Racine du projet introuvable: {project_root}") if not os.path.exists(DOC_SOURCE_PATH): raise ValueError( f"Dossier source de documentation introuvable: {DOC_SOURCE_PATH}" ) if not os.path.exists(DOC_BUILD_PATH): logger.info("Génération de la documentation...") # Créer les répertoires s'ils n'existent pas os.makedirs(DOC_BUILD_PATH, exist_ok=True) # Vérifier que le script build_docs.py existe build_script = os.path.join(DOC_SOURCE_PATH, 'build_docs.py') if not os.path.exists(build_script): raise ValueError( f"Script de build introuvable: {build_script}") logger.info(f"Exécution du script: {build_script}") logger.info(f"Dans le dossier: {DOC_SOURCE_PATH}") # Exécuter le script de génération result = subprocess.run([sys.executable, build_script], check=True, cwd=DOC_SOURCE_PATH, capture_output=True, text=True) logger.info(f"Sortie du script: {result.stdout}") if result.stderr: logger.warning(f"Erreurs du script: {result.stderr}") logger.info("Documentation générée avec succès") except Exception as e: logger.error(f"Erreur lors de la génération de la documentation: {e}") logger.error(f"Type d'erreur: {type(e).__name__}") return render_template( 'error.html', error_message="Erreur lors de la génération de la documentation", error_details=f"{type(e).__name__}: {str(e)}"), 500
[docs] @doc_bp.route('/') def doc_index(): """Sert la page d'index de la documentation.""" try: if not os.path.exists(DOC_BUILD_PATH): logger.error(f"Dossier de build introuvable: {DOC_BUILD_PATH}") return render_template( 'error.html', error_message="Documentation non générée", error_details="Le dossier de documentation n'existe pas encore." ), 404 index_file = os.path.join(DOC_BUILD_PATH, 'index.html') if not os.path.exists(index_file): logger.error(f"Fichier index.html introuvable: {index_file}") return render_template( 'error.html', error_message="Documentation incomplète", error_details="Le fichier index.html n'existe pas."), 404 return send_from_directory(DOC_BUILD_PATH, 'index.html') except Exception as e: logger.error(f"Erreur lors de l'accès à la documentation: {e}") return render_template( 'error.html', error_message="Erreur lors de l'accès à la documentation", error_details=str(e)), 500
[docs] @doc_bp.route('/<path:path>') def doc_files(path): """Sert les fichiers statiques de la documentation. Args: path: Chemin relatif du fichier demandé """ try: return send_from_directory(DOC_BUILD_PATH, path) except Exception as e: logger.error(f"Erreur lors de l'accès au fichier {path}: {e}") return render_template('error.html', error_message=f"Fichier non trouvé: {path}", error_details=str(e)), 404