""" Script pour récupérer les tickets depuis odoo. Extraction d'un ticket unique ou d'un groupe de tickets. """ import os import sys import json import argparse from datetime import datetime from core.utils import setup_logging, log_separator from formatters.json_to_markdown import create_markdown_from_json from odoo.retrieve_ticket import retrieve_ticket from odoo.retrieve_tickets_batch import retrieve_tickets_batch, parse_domain, list_projects, list_stages from odoo.auth_manager import get_auth_manager, load_config #importation de l'extracteur d'images HTML (optionnel) try: from utils.image_extractor import extract_images_from_ticket from utils.image_extractor.extract_all_images import enhance_ticket_data_with_images HTML_IMAGE_EXTRACTOR_AVAILABLE = True except ImportError: HTML_IMAGE_EXTRACTOR_AVAILABLE = False def parse_arguments(): """Parse les arguments de ligne de commande.""" parser = argparse.ArgumentParser(description="Extrait des données depuis Odoo (ticket unique ou par lots).") # Paramètres communs parser.add_argument("--config", "-c", help="Fichier de configuration", default="config.json") parser.add_argument("--verbose", "-v", action="store_true", help="Mode verbeux") parser.add_argument("--output", "-o", help="Répertoire de sortie", default=None) parser.add_argument("--no-md", action="store_true", help="Désactiver la génération automatique du fichier Markdown") parser.add_argument("--extract-html-images", action="store_true", help="Activer l'extraction des images intégrées dans le HTML") # Sous-parseurs pour les différentes commandes subparsers = parser.add_subparsers(dest="command", help="Commande à exécuter") # Commande pour extraire un ticket unique single_parser = subparsers.add_parser("ticket", help="Extrait un ticket unique par son code") single_parser.add_argument("ticket_code", help="Code du ticket à extraire") # Commande pour extraire un lot de tickets batch_parser = subparsers.add_parser("batch", help="Extrait un lot de tickets") batch_parser.add_argument("--domain", "-d", help="Critères de recherche (format: field1:op1:value1;field2:op2:value2)") batch_parser.add_argument("--project", "-p", type=int, help="Id du projet") batch_parser.add_argument("--stage", "-s", type=int, help="Id de l'étape/statut") batch_parser.add_argument("--limit", "-l", type=int, default=50, help="Nombre maximum de tickets à extraire") batch_parser.add_argument("--offset", type=int, default=0, help="Index de départ pour la pagination") batch_parser.add_argument("--include-existing", action="store_true", help="Inclure les tickets déjà extraits") # Commande pour lister les projets projects_parser = subparsers.add_parser("projects", help="Liste les projets disponibles") # Commande pour lister les étapes/statuts stages_parser = subparsers.add_parser("stages", help="Liste les étapes/statuts disponibles") return parser.parse_args() def main(): """Point d'entrée principal du script.""" args = parse_arguments() # Vérifier si le fichier de configuration existe if not os.path.exists(args.config): print(f"Erreur: Fichier de configuration '{args.config}' introuvable.") sys.exit(1) # Configurer la journalisation log_level = "DEBUG" if args.verbose else "INFO" setup_logging(log_level) # Vérifier la connexion Odoo une seule fois if not get_auth_manager(args.config): print("Impossible de se connecter à Odoo. Vérifiez vos informations de connexion.") sys.exit(1) # Traiter la commande appropriée if args.command == "ticket": # Extraction d'un ticket unique result = retrieve_ticket( ticket_code=args.ticket_code, output=args.output, config_file=args.config, verbose=args.verbose ) if not result: print(f"Echec de l'extraction du ticket {args.ticket_code}") sys.exit(1) if not args.no_md: # Génération du rapport Markdown json_file = os.path.join(result, "all_messages.json") if os.path.exists(json_file): md_file_path = os.path.join(result, "rapport.md") print(f"Génération du rapport Markdown...") if create_markdown_from_json(json_file, md_file_path): print(f"Rapport Markdown créé: {md_file_path}") else: print("Echec de la génération du rapport Markdown.") elif args.command == "batch": # Extraction par lot domain = [] if args.domain: domain = parse_domain(args.domain) # Ajouter project_id et stage_id si spécifiés if args.project: domain.append(["project_id", "=", args.project]) if args.stage: domain.append(["stage_id", "=", args.stage]) print(f"Démarrage de l'extraction par lot avec les critères: {domain}") print(f"Limite: {args.limit} tickets, offset: {args.offset}") result = retrieve_tickets_batch( domain=domain, limit=args.limit, offset=args.offset, output=args.output, config_file=args.config, verbose=args.verbose, skip_existing=not args.include_existing ) if not result or result.get("status") == "error": print("Echec de l'extraction par lots") sys.exit(1) # Afficher un résumé des résultats print(f"Extraction par lot terminée") print(f"Tickets traités: {result.get('processed', 0)}") print(f"Tickets ignorés: {result.get('skipped', 0)}") # Générer des rapports Markdown pour chaque ticket extrait if not args.no_md: print("Génération des rapports Markdown pour les tickets extraits...") processed_tickets = result.get("processed_tickets", []) for ticket_info in processed_tickets: ticket_dir = ticket_info.get("output_dir") if ticket_dir and os.path.exists(ticket_dir): json_file = os.path.join(ticket_dir, "all_messages.json") if os.path.exists(json_file): md_file_path = os.path.join(ticket_dir, "rapport.md") print(f"Génération du rapport Markdown pour {ticket_info.get('code')}...") if create_markdown_from_json(json_file, md_file_path): print(f"Rapport Markdown créé: {md_file_path}") else: print(f"Echec de la génération du rapport Markdown pour {ticket_info.get('code')}") else: print(f"Fichier de messages introuvable pour {ticket_info.get('code')}") else: print(f"Répertoire introuvable pour {ticket_info.get('code')}") elif args.command == "projects": # Lister les projets list_projects(args.config) elif args.command == "stages": # Lister les étapes/statuts list_stages(args.config) else: parser = argparse.ArgumentParser(description="Extrait des données depuis Odoo (ticket unique ou par lots).") parser.print_help() sys.exit(1) if __name__ == "__main__": main()