#!/usr/bin/env python3 """ Script pour récupérer un ticket Odoo en utilisant TicketManager. Exemple d'usage: python retrieve_ticket.py T0123 """ import os import sys from utils.ticket_manager2 import TicketManager import json import argparse def main(): """Fonction principale du script""" 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") parser.add_argument("--keep-html", action="store_true", help="Conserver le contenu HTML dans les messages") parser.add_argument("--no-original", action="store_true", help="Ne pas conserver le corps de message original") parser.add_argument("--keep-all", action="store_true", help="Conserver tous les messages (y compris ceux d'OdooBot et les messages vides)") 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}") # Créer et connecter le gestionnaire de tickets ticket_manager = TicketManager(url, db, username, api_key) # Personnaliser le nettoyage des messages HTML si demandé if args.keep_html: # Remplacer la méthode de nettoyage par une qui ne fait rien ticket_manager._clean_messages = lambda messages: [ {**msg, "body_original": msg["body"] if isinstance(msg.get("body"), str) else msg.get("body")} for msg in messages ] elif args.keep_all: # Modifier la méthode pour garder tous les messages mais nettoyer leur contenu original_clean_method = ticket_manager._clean_messages def keep_all_messages(messages): result = [] for message in messages: cleaned = message.copy() if "body" in cleaned and cleaned["body"] and isinstance(cleaned["body"], str): # Nettoyer le contenu mais garder tous les messages cleaned["body_original"] = cleaned["body"] # Appliquer le nettoyage de base import re from html import unescape body = cleaned["body"] body = re.sub(r']*?>', '', body) body = re.sub(r']*?>.*?', '', body, flags=re.DOTALL) body = re.sub(r']*?>.*?', '', body, flags=re.DOTALL) body = re.sub(r' style="[^"]*"', '', body) body = re.sub(r'<(?:p|div)[^>]*?>', '\n', body) body = re.sub(r'', '\n', body) body = re.sub(r']*?>', '\n', body) body = re.sub(r'<[^>]*?>', '', body) body = unescape(body) body = re.sub(r'\n\s*\n', '\n\n', body) body = re.sub(r' +', ' ', body) body = body.strip() cleaned["body"] = body result.append(cleaned) return result ticket_manager._clean_messages = keep_all_messages elif args.no_original: # Modifier la méthode pour ne pas conserver le corps original original_clean_method = ticket_manager._clean_messages ticket_manager._clean_messages = lambda messages: [ {k: v for k, v in msg.items() if k != "body_original"} for msg in original_clean_method(messages) ] if not ticket_manager.login(): print("Échec de la connexion à Odoo") sys.exit(1) # Récupérer le ticket if args.verbose: print(f"Recherche du ticket {args.ticket_code}...") ticket = ticket_manager.get_ticket_by_code(args.ticket_code) if not ticket: print(f"Ticket {args.ticket_code} non trouvé") sys.exit(1) if args.verbose: print(f"Ticket {args.ticket_code} trouvé (ID: {ticket.get('id')})") print(f"Extraction des données vers {output_dir}...") # Extraire et sauvegarder toutes les données result = ticket_manager.extract_ticket_data(ticket["id"], output_dir) if "error" in result: print(f"Erreur: {result['error']}") sys.exit(1) print(f"Extraction terminée avec succès") print(f"- Informations du ticket: {result['ticket_info']}") print(f"- Messages: {result['messages_file']}") print(f"- Données complètes: {result['ticket_data_file']}") print(f"- Pièces jointes: {len(result['attachments'])} fichiers") # Afficher un résumé print(f"\nRésumé du ticket {args.ticket_code}:") print(f"- Nom: {ticket.get('name', 'N/A')}") print(f"- Description: {ticket.get('description', 'N/A')[:100]}...") print(f"- Étape: {ticket.get('stage_id', ['N/A'])[1] if isinstance(ticket.get('stage_id'), (list, tuple)) else 'N/A'}") if __name__ == "__main__": main()