mirror of
https://github.com/Ladebeze66/llm_ticket3.git
synced 2025-12-13 17:27:18 +01:00
178 lines
7.4 KiB
Python
Executable File
178 lines
7.4 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Script principal pour récupérer un ticket depuis Odoo et extraire ses données.
|
|
Ce script fait appel aux utilitaires dans le package utils pour effectuer l'extraction.
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
import json
|
|
import argparse
|
|
from datetime import datetime
|
|
from odoo.auth_manager import AuthManager
|
|
from odoo.ticket_manager import TicketManager
|
|
from core.utils import setup_logging, log_separator
|
|
from formatters.json_to_markdown import create_markdown_from_json
|
|
|
|
# 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="Récupère un ticket Odoo par son code et extrait ses données.")
|
|
parser.add_argument("ticket_code", help="Code du ticket à extraire")
|
|
parser.add_argument("--output", "-o", help="Répertoire de sortie", default=None)
|
|
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("--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")
|
|
return parser.parse_args()
|
|
|
|
def load_config(config_file):
|
|
"""Charge le fichier de configuration."""
|
|
try:
|
|
with open(config_file, 'r') as f:
|
|
return json.load(f)
|
|
except Exception as e:
|
|
print(f"Erreur lors du chargement du fichier de configuration: {e}")
|
|
sys.exit(1)
|
|
|
|
def main():
|
|
"""Fonction principale du script."""
|
|
args = parse_arguments()
|
|
config = load_config(args.config)
|
|
|
|
# Configurer la journalisation
|
|
log_level = "DEBUG" if args.verbose else "INFO"
|
|
setup_logging(log_level)
|
|
|
|
# Extraire les informations de connexion
|
|
odoo_config = config.get("odoo", {})
|
|
url = odoo_config.get("url")
|
|
db = odoo_config.get("db")
|
|
username = odoo_config.get("username")
|
|
api_key = odoo_config.get("api_key")
|
|
|
|
if not all([url, db, username, api_key]):
|
|
print("Informations de connexion Odoo manquantes dans le fichier de configuration")
|
|
sys.exit(1)
|
|
|
|
# Définir le répertoire de sortie
|
|
output_dir = args.output or os.path.join(config.get("output_dir", "output"), f"ticket_{args.ticket_code}")
|
|
|
|
# Créer le répertoire de sortie spécifique au ticket avec horodatage
|
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
ticket_dir = os.path.join(output_dir, f"{args.ticket_code}_{timestamp}")
|
|
os.makedirs(ticket_dir, exist_ok=True)
|
|
|
|
print(f"Extraction du ticket {args.ticket_code}...")
|
|
|
|
try:
|
|
# Initialiser l'authentification
|
|
auth_manager = AuthManager(
|
|
url=url,
|
|
db=db,
|
|
username=username,
|
|
api_key=api_key
|
|
)
|
|
|
|
if not auth_manager.login():
|
|
print("Échec de l'authentification à Odoo")
|
|
sys.exit(1)
|
|
|
|
# Extraire les données du ticket
|
|
ticket_manager = TicketManager(auth_manager)
|
|
result = ticket_manager.extract_ticket_data(args.ticket_code, ticket_dir)
|
|
|
|
if not result:
|
|
print(f"Échec de l'extraction du ticket {args.ticket_code}")
|
|
sys.exit(1)
|
|
|
|
# Extraire les images intégrées dans le HTML si demandé
|
|
html_images = []
|
|
if args.extract_html_images and HTML_IMAGE_EXTRACTOR_AVAILABLE:
|
|
print("Extraction des images intégrées dans le HTML...")
|
|
html_images = extract_images_from_ticket(ticket_dir)
|
|
|
|
if html_images:
|
|
# Ajouter les images HTML au résultat
|
|
result["html_images"] = html_images
|
|
result["html_images_count"] = len(html_images)
|
|
|
|
# Créer un fichier JSON avec toutes les images
|
|
# Récupérer d'abord les images standard
|
|
ticket_data = {
|
|
"ticket_dir": ticket_dir,
|
|
"attachments": result.get("attachments", [])
|
|
}
|
|
|
|
# Enrichir les données avec toutes les images
|
|
enhanced_data = enhance_ticket_data_with_images(ticket_data)
|
|
|
|
# Sauvegarder le résultat
|
|
all_images_path = os.path.join(ticket_dir, "all_images.json")
|
|
with open(all_images_path, 'w', encoding='utf-8') as f:
|
|
json.dump({
|
|
"images": enhanced_data.get("images", []),
|
|
"standard_images": enhanced_data.get("standard_images", []),
|
|
"embedded_images": enhanced_data.get("embedded_images", []),
|
|
"stats": enhanced_data.get("images_stats", {})
|
|
}, f, indent=2, ensure_ascii=False)
|
|
|
|
print(f"Trouvé {len(html_images)} images intégrées dans le HTML")
|
|
|
|
# Générer un rapport de fin
|
|
summary = {
|
|
"timestamp": timestamp,
|
|
"ticket_code": args.ticket_code,
|
|
"output_directory": ticket_dir,
|
|
"message_count": result.get("messages_count", 0),
|
|
"attachment_count": result.get("attachments_count", 0),
|
|
"html_images_count": len(html_images) if HTML_IMAGE_EXTRACTOR_AVAILABLE and args.extract_html_images else 0,
|
|
"files_created": [
|
|
os.path.basename(result.get("ticket_info", "")),
|
|
os.path.basename(result.get("ticket_summary", "")),
|
|
os.path.basename(result.get("messages_file", "")),
|
|
os.path.basename(result.get("ticket_data_file", ""))
|
|
]
|
|
}
|
|
|
|
# Générer automatiquement le fichier Markdown si demandé
|
|
md_file_path = None
|
|
if not args.no_md:
|
|
json_file = result.get("messages_file", "")
|
|
if json_file and os.path.exists(json_file):
|
|
md_file_path = os.path.join(ticket_dir, "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}")
|
|
summary["files_created"].append("rapport.md")
|
|
else:
|
|
print("Échec de la génération du rapport Markdown")
|
|
|
|
# Afficher le résumé
|
|
print("\nExtraction terminée avec succès")
|
|
print(f"Ticket: {args.ticket_code}")
|
|
print(f"Répertoire: {ticket_dir}")
|
|
print(f"Messages traités: {result.get('messages_count', 0)}")
|
|
print(f"Pièces jointes: {result.get('attachments_count', 0)}")
|
|
|
|
# Afficher le nombre d'images HTML si l'extracteur est disponible
|
|
if HTML_IMAGE_EXTRACTOR_AVAILABLE and args.extract_html_images:
|
|
print(f"Images HTML: {len(html_images)}")
|
|
|
|
if md_file_path:
|
|
print(f"Rapport Markdown: {md_file_path}")
|
|
|
|
except Exception as e:
|
|
print(f"Une erreur est survenue: {e}")
|
|
sys.exit(1)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|