llm_ticket3/retrieve_ticket.py
2025-04-03 14:59:35 +02:00

130 lines
4.7 KiB
Python
Executable File

#!/usr/bin/env python3
import os
import sys
import json
import argparse
from datetime import datetime
from utils.auth_manager import AuthManager
from utils.ticket_manager import TicketManager
from utils.attachment_manager import AttachmentManager
from utils.message_manager import MessageManager
from utils.utils import save_json
def main():
parser = argparse.ArgumentParser(description="Extraction de tickets Odoo")
parser.add_argument("ticket_code", help="Code du ticket à extraire (ex: T0167)")
parser.add_argument("--config", default="config.json", help="Chemin vers le fichier de configuration")
parser.add_argument("--output-dir", help="Répertoire de sortie (par défaut: output/ticket_CODE)")
parser.add_argument("--verbose", "-v", action="store_true", help="Afficher plus d'informations")
args = parser.parse_args()
# Charger la configuration
try:
with open(args.config, "r", encoding="utf-8") as f:
config = json.load(f)
if args.verbose:
print(f"Configuration chargée depuis {args.config}")
except Exception as e:
print(f"Erreur lors du chargement de la configuration: {e}")
sys.exit(1)
# 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_dir or os.path.join(config.get("output_dir", "output"), f"ticket_{args.ticket_code}")
os.makedirs(output_dir, exist_ok=True)
# Authentification Odoo
auth = AuthManager(url, db, username, api_key)
if not auth.login():
print("Échec de connexion à Odoo")
sys.exit(1)
# Initialiser les gestionnaires
ticket_manager = TicketManager(auth)
attachment_manager = AttachmentManager(auth)
message_manager = MessageManager(auth)
# Récupérer le ticket
ticket = ticket_manager.get_ticket_by_code(args.ticket_code)
if not ticket:
print(f"Ticket {args.ticket_code} non trouvé")
sys.exit(1)
ticket_id = ticket.get('id')
# Sauvegarder ticket_info.json
ticket_info_path = os.path.join(output_dir, "ticket_info.json")
save_json(ticket, ticket_info_path)
if args.verbose:
print(f"Ticket {args.ticket_code} trouvé (ID: {ticket_id})")
print(f"Extraction des données vers {output_dir}...")
# Récupérer et sauvegarder les messages
messages = message_manager.get_ticket_messages(ticket_id)
all_messages_path = os.path.join(output_dir, "all_messages.json")
save_json(messages, all_messages_path)
# Récupérer et sauvegarder les pièces jointes
attachments = attachment_manager.get_ticket_attachments(ticket_id)
attachments_info = []
attachment_dir = os.path.join(output_dir, "attachments")
os.makedirs(attachment_dir, exist_ok=True)
for attachment in attachments:
file_data = attachment.get("datas")
if file_data:
file_name = attachment.get("name", "unnamed_file")
file_path = os.path.join(attachment_dir, file_name)
# Sauvegarder le fichier binaire
with open(file_path, "wb") as f:
f.write(base64.b64decode(file_data))
# Ajouter l'information de l'attachement à la liste
attachments_info.append({
"id": attachment.get("id"),
"name": file_name,
"path": file_path,
"mimetype": attachment.get("mimetype"),
"create_date": attachment.get("create_date")
})
# Sauvegarder les métadonnées des pièces jointes
attachments_info_path = os.path.join(output_dir, "attachments_info.json")
save_json(attachments_info, attachments_info_path)
# Génération de structure.json
structure = {
"date_extraction": datetime.now().isoformat(),
"ticket_dir": output_dir,
"fichiers_json": [
"ticket_info.json",
"all_messages.json",
"attachments_info.json"
]
}
structure_path = os.path.join(output_dir, "structure.json")
save_json(structure, structure_path)
print("Extraction terminée avec succès")
print(f"- Informations du ticket: {ticket_info_path}")
print(f"- Messages: {all_messages_path}")
print(f"- Pièces jointes: {attachments_info_path}")
print(f"- Structure: {structure_path}")
if __name__ == "__main__":
main()