Source code for report_manager

#!/usr/bin/env python3
"""
Gestionnaire de rapports pour demo_api
"""

import typer
from enum import Enum
from utils.api import Api
from utils.services import ReportService, DataManager
from utils.logging_config import get_logger
from utils.config import config

logger = get_logger(__name__)


[docs] class ReportType(str, Enum): """Types de rapport disponibles""" USERS_VMS = "users-vms" STATUS = "status" ALL = "all"
[docs] class ReportFormat(str, Enum): """Formats de rapport disponibles""" JSON = "json" MARKDOWN = "markdown" HTML = "html" ALL = "all"
[docs] def generate_reports( report_type: ReportType = typer.Option( ReportType.ALL, "--type", "-t", help="Type de rapport Ă  gĂ©nĂ©rer" ), report_format: ReportFormat = typer.Option( ReportFormat.ALL, "--format", "-f", help="Format de rapport (json, markdown, html, all)", ), output_dir: str = typer.Option( "outputs", "--output-dir", "-o", help="RĂ©pertoire de sortie pour les rapports" ), verbose: bool = typer.Option(False, "--verbose", "-v", help="Mode verbeux"), ) -> None: """ 📊 GĂ©nĂ©rer des rapports Exemples: .. code-block:: shell python report_manager.py python report_manager.py --type users-vms --format markdown python report_manager.py -t status -f html -o ./rapports --verbose python report_manager.py --format all --type all """ if verbose: typer.echo("🔧 Configuration:") typer.echo(f" Type de rapport: {report_type.value}") typer.echo(f" Format: {report_format.value}") typer.echo(f" RĂ©pertoire de sortie: {output_dir}") typer.echo() logger.info( "DĂ©but de gĂ©nĂ©ration des rapports", report_type=report_type.value, format=report_format.value, output_dir=output_dir, ) # Initialisation du client API, du gestionnaire de donnĂ©es et du service api = Api(config.DEMO_API_BASE_URL) data_manager = DataManager(api) report_service = ReportService(api) # RĂ©cupĂ©ration centralisĂ©e des donnĂ©es (une seule fois) typer.echo("📡 RĂ©cupĂ©ration des donnĂ©es...") users, vms = data_manager.fetch_all_data() if not users and not vms: typer.echo("❌ Impossible de rĂ©cupĂ©rer les donnĂ©es nĂ©cessaires") raise typer.Exit(1) typer.echo(f" ✅ {len(users)} utilisateur(s) et {len(vms)} VM(s) rĂ©cupĂ©rĂ©(s)") typer.echo() # GĂ©nĂ©ration des rapports selon le type et format demandĂ©s generated_files = [] # DĂ©terminer les formats Ă  gĂ©nĂ©rer formats_to_generate = [] if report_format == ReportFormat.ALL: formats_to_generate = [ ReportFormat.JSON, ReportFormat.MARKDOWN, ReportFormat.HTML, ] else: formats_to_generate = [report_format] # GĂ©nĂ©ration des rapports utilisateurs/VMs if report_type in [ReportType.USERS_VMS, ReportType.ALL]: typer.echo("📊 GĂ©nĂ©ration du rapport utilisateurs/VMs...") for fmt in formats_to_generate: report_file = None if fmt == ReportFormat.JSON: report_file = report_service.generate_users_vms_report( users, vms, "vm_users.json" ) elif fmt == ReportFormat.MARKDOWN: report_file = report_service.generate_users_vms_report_markdown( users, vms, "vm_users.md" ) elif fmt == ReportFormat.HTML: report_file = report_service.generate_users_vms_report_html( users, vms, "vm_users.html" ) if report_file: generated_files.append(report_file) if verbose: typer.echo(f" ✅ GĂ©nĂ©rĂ© ({fmt.value}): {report_file}") else: typer.echo( f"❌ Échec de la gĂ©nĂ©ration du rapport utilisateurs/VMs ({fmt.value})" ) # GĂ©nĂ©ration des rapports de statut if report_type in [ReportType.STATUS, ReportType.ALL]: typer.echo("📈 GĂ©nĂ©ration du rapport de statut des VMs...") for fmt in formats_to_generate: status_file = None if fmt == ReportFormat.JSON: status_file = report_service.generate_status_report( users, vms, "vm_status_report.json" ) elif fmt == ReportFormat.MARKDOWN: status_file = report_service.generate_status_report_markdown( users, vms, "vm_status_report.md" ) elif fmt == ReportFormat.HTML: status_file = report_service.generate_status_report_html( users, vms, "vm_status_report.html" ) if status_file: generated_files.append(status_file) if verbose: typer.echo(f" ✅ GĂ©nĂ©rĂ© ({fmt.value}): {status_file}") else: typer.echo( f"❌ Échec de la gĂ©nĂ©ration du rapport de statut ({fmt.value})" ) # RĂ©sumĂ© typer.echo() if generated_files: typer.echo(f"🎉 {len(generated_files)} rapport(s) gĂ©nĂ©rĂ©(s) avec succĂšs") for file in generated_files: typer.echo(f" 📄 {file}") typer.echo() typer.echo("✹ GĂ©nĂ©ration terminĂ©e!") else: typer.echo("❌ Aucun rapport n'a pu ĂȘtre gĂ©nĂ©rĂ©") raise typer.Exit(1)
if __name__ == "__main__": app = typer.Typer(help="Générer les rapports de l'API demo") app.command()(generate_reports) app()