mirror of
https://github.com/Ladebeze66/llm_ticket3.git
synced 2025-12-13 17:37:05 +01:00
175 lines
7.5 KiB
Python
175 lines
7.5 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
|
|
|
|
#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()
|
|
|
|
|
|
|