llm_ticket3/odoo_extractor.py
2025-04-18 15:18:46 +02:00

166 lines
7.0 KiB
Python

"""
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
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")
# 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()