"""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