mirror of
https://github.com/Ladebeze66/projetcbaollm.git
synced 2025-12-16 14:37:49 +01:00
343 lines
12 KiB
Python
343 lines
12 KiB
Python
from ticket_manager import TicketManager
|
|
from ticket_search import TicketSearch
|
|
from ticket_display import TicketDisplay
|
|
from ticket_classification import TicketClassification
|
|
from ui_utils import get_ticket_codes, get_field_name, confirm_action
|
|
import os
|
|
import json
|
|
from config import EXPORT_DIR, ODOO_HOST
|
|
|
|
# Initialisation des objets
|
|
ticket_manager = TicketManager()
|
|
ticket_search = TicketSearch()
|
|
ticket_display = TicketDisplay()
|
|
ticket_classification = TicketClassification()
|
|
|
|
def handle_search_by_code():
|
|
"""Gère la recherche de tickets par code"""
|
|
ticket_code = input("\nEntrez le code du ticket: ")
|
|
if not ticket_code:
|
|
print("Aucun code de ticket fourni.")
|
|
return
|
|
|
|
ticket = ticket_search.get_ticket_by_code(ticket_code)
|
|
if not ticket:
|
|
print(f"Aucun ticket trouvé avec le code {ticket_code}")
|
|
return
|
|
|
|
print(f"\nTicket trouvé: {ticket.get('name', 'Sans nom')}")
|
|
print("Voulez-vous voir plus de détails?")
|
|
if confirm_action():
|
|
ticket_display.display_ticket(ticket)
|
|
|
|
def handle_ticket_display_field():
|
|
"""Gère l'affichage d'un champ spécifique d'un ticket"""
|
|
ticket_codes = get_ticket_codes()
|
|
if not ticket_codes:
|
|
return
|
|
|
|
field_name = get_field_name()
|
|
if not field_name:
|
|
return
|
|
|
|
for code in ticket_codes:
|
|
ticket = ticket_search.get_ticket_by_code(code)
|
|
if ticket:
|
|
ticket_display.display_field(ticket, field_name)
|
|
else:
|
|
print(f"Ticket {code} non trouvé")
|
|
|
|
def handle_ticket_export():
|
|
"""Gère l'exportation des tickets en JSON"""
|
|
ticket_codes = get_ticket_codes()
|
|
if not ticket_codes:
|
|
return
|
|
|
|
tickets = []
|
|
for code in ticket_codes:
|
|
ticket = ticket_search.get_ticket_by_code(code)
|
|
if ticket:
|
|
tickets.append(ticket)
|
|
|
|
if not tickets:
|
|
print("Aucun ticket à exporter.")
|
|
return
|
|
|
|
filename = input("Nom du fichier d'export (sans extension): ")
|
|
if not filename:
|
|
filename = "tickets_export"
|
|
|
|
# Assurer que le répertoire d'export existe
|
|
if not os.path.exists(EXPORT_DIR):
|
|
os.makedirs(EXPORT_DIR)
|
|
|
|
file_path = os.path.join(EXPORT_DIR, f"{filename}.json")
|
|
with open(file_path, 'w', encoding='utf-8') as f:
|
|
json.dump(tickets, f, indent=4, ensure_ascii=False)
|
|
|
|
print(f"Tickets exportés avec succès dans {file_path}")
|
|
|
|
def handle_field_ticket_classification():
|
|
"""Gère la classification des tickets selon un champ spécifique"""
|
|
ticket_codes = get_ticket_codes()
|
|
if not ticket_codes:
|
|
return
|
|
|
|
field_name = get_field_name()
|
|
if not field_name:
|
|
return
|
|
|
|
tickets = []
|
|
for code in ticket_codes:
|
|
ticket = ticket_search.get_ticket_by_code(code)
|
|
if ticket:
|
|
tickets.append(ticket)
|
|
|
|
if not tickets:
|
|
print("Aucun ticket à classer.")
|
|
return
|
|
|
|
classified_tickets = ticket_classification.classify_tickets_by_field(tickets, field_name)
|
|
print(f"Classification terminée: {len(classified_tickets)} groupes créés.")
|
|
|
|
def handle_common_values_analysis():
|
|
"""Gère l'analyse des valeurs communes entre tickets"""
|
|
ticket_codes = get_ticket_codes()
|
|
if len(ticket_codes) < 2:
|
|
print("L'analyse des valeurs communes nécessite au moins 2 tickets.")
|
|
return
|
|
|
|
tickets = []
|
|
for code in ticket_codes:
|
|
ticket = ticket_search.get_ticket_by_code(code)
|
|
if ticket:
|
|
tickets.append(ticket)
|
|
|
|
if len(tickets) < 2:
|
|
print("Insuffisamment de tickets valides pour l'analyse.")
|
|
return
|
|
|
|
# Analyse des champs communs
|
|
common_fields = ticket_manager.analyze_common_values(tickets)
|
|
|
|
print("\nChamps avec valeurs identiques entre tous les tickets:")
|
|
for field, value in common_fields.items():
|
|
print(f"- {field}: {value}")
|
|
|
|
if not common_fields:
|
|
print("Aucun champ commun trouvé.")
|
|
|
|
def handle_search_by_relational_fields():
|
|
"""Gère la recherche et classification par champs relationnels"""
|
|
print("\nRecherche par champs relationnels:")
|
|
print("1. stage_id (État)")
|
|
print("2. project_id (Projet)")
|
|
print("3. user_id (Assigné à)")
|
|
print("4. Autre champ relationnel")
|
|
|
|
option = input("Choisissez une option (1-4): ")
|
|
field_name = ""
|
|
|
|
if option == '1':
|
|
field_name = "stage_id"
|
|
elif option == '2':
|
|
field_name = "project_id"
|
|
elif option == '3':
|
|
field_name = "user_id"
|
|
elif option == '4':
|
|
field_name = input("Entrez le nom du champ relationnel: ")
|
|
else:
|
|
print("Option invalide")
|
|
return
|
|
|
|
# Récupérer les valeurs possibles pour ce champ
|
|
field_values = ticket_search.get_field_values(field_name)
|
|
if not field_values:
|
|
print(f"Impossible de récupérer les valeurs pour le champ {field_name}")
|
|
return
|
|
|
|
print(f"\nValeurs disponibles pour {field_name}:")
|
|
for value_id, name in field_values.items():
|
|
print(f"ID: {value_id} - {name}")
|
|
|
|
value_id = input("\nEntrez l'ID à rechercher: ")
|
|
try:
|
|
value_id = int(value_id)
|
|
except ValueError:
|
|
print("L'ID doit être un nombre entier")
|
|
return
|
|
|
|
# Recherche des tickets
|
|
field_criteria = {field_name: value_id}
|
|
tickets = ticket_search.search_tickets_by_fields(field_criteria)
|
|
|
|
if not tickets:
|
|
return
|
|
|
|
print(f"{len(tickets)} tickets trouvés.")
|
|
|
|
# Demander si l'utilisateur veut classer ces tickets
|
|
print("\nVoulez-vous classer ces tickets par un champ?")
|
|
if confirm_action():
|
|
classify_field = get_field_name()
|
|
if classify_field:
|
|
classified_tickets = ticket_classification.classify_tickets_by_field(tickets, classify_field)
|
|
print(f"Classification terminée: {len(classified_tickets)} groupes créés.")
|
|
|
|
def handle_search_by_project_and_stage():
|
|
"""Gère la recherche et sauvegarde de tickets par project_id et stage_id"""
|
|
# Récupérer les projets disponibles
|
|
projects = ticket_search.get_field_values('project_id')
|
|
if not projects:
|
|
print("Impossible de récupérer la liste des projets")
|
|
return
|
|
|
|
print("\nProjets disponibles:")
|
|
for project_id, project_name in projects.items():
|
|
print(f"ID: {project_id} - {project_name}")
|
|
|
|
# Demander à l'utilisateur de choisir un projet
|
|
project_id = input("\nEntrez l'ID du projet: ")
|
|
try:
|
|
project_id = int(project_id)
|
|
if project_id not in projects:
|
|
print("ID de projet invalide")
|
|
return
|
|
except ValueError:
|
|
print("L'ID doit être un nombre entier")
|
|
return
|
|
|
|
# Récupérer les étapes disponibles
|
|
stages = ticket_search.get_field_values('stage_id')
|
|
if not stages:
|
|
print("Impossible de récupérer la liste des étapes")
|
|
return
|
|
|
|
print("\nÉtapes disponibles:")
|
|
for stage_id, stage_name in stages.items():
|
|
print(f"ID: {stage_id} - {stage_name}")
|
|
|
|
# Demander à l'utilisateur de choisir une étape ou toutes
|
|
stage_input = input("\nEntrez l'ID de l'étape (ou 'tous' pour toutes les étapes): ")
|
|
|
|
all_tickets = []
|
|
project_name = projects[project_id]
|
|
|
|
if stage_input.lower() in ('tous', 'toutes', 'all'):
|
|
# Récupérer tous les tickets du projet pour chaque étape
|
|
for stage_id, stage_name in stages.items():
|
|
tickets = ticket_search.search_by_project_and_stage(project_id, stage_id)
|
|
all_tickets.extend(tickets)
|
|
else:
|
|
try:
|
|
stage_id = int(stage_input)
|
|
if stage_id not in stages:
|
|
print("ID d'étape invalide")
|
|
return
|
|
|
|
all_tickets = ticket_search.search_by_project_and_stage(project_id, stage_id)
|
|
except ValueError:
|
|
print("L'ID doit être un nombre entier")
|
|
return
|
|
|
|
if not all_tickets:
|
|
print("Aucun ticket trouvé avec ces critères")
|
|
return
|
|
|
|
# Sauvegarder les tickets par étape
|
|
ticket_classification.save_tickets_by_stage(all_tickets, project_name)
|
|
|
|
print(f"\nTous les tickets ont été sauvegardés avec succès dans des répertoires par étape.")
|
|
|
|
def handle_project_tickets_by_stage():
|
|
"""Récupère et sauvegarde les tickets d'un projet, classés par étape"""
|
|
from ticket_search import TicketSearch
|
|
from ticket_utils import save_project_tickets_by_stage
|
|
|
|
# Créer une nouvelle instance à chaque fois pour éviter les problèmes de connexion
|
|
ticket_search = TicketSearch()
|
|
|
|
# Vérifier la connexion
|
|
if not ticket_search._check_connection():
|
|
print("\nERREUR: Impossible de se connecter à Odoo.")
|
|
print("Vérifiez vos paramètres de connexion dans config.py et assurez-vous que:")
|
|
print(f"1. L'hôte Odoo est accessible: {ODOO_HOST}")
|
|
print("2. Les identifiants sont corrects")
|
|
print("3. Le réseau permet la connexion au serveur Odoo")
|
|
return
|
|
|
|
# Récupérer les projets disponibles
|
|
projects = ticket_search.get_field_values('project_id')
|
|
if not projects:
|
|
print("\nERREUR: Impossible de récupérer la liste des projets.")
|
|
print("Causes possibles:")
|
|
print("1. Problème de permissions - votre utilisateur n'a pas accès aux projets")
|
|
print("2. Aucun projet n'existe dans le système")
|
|
print("3. Problème de connexion intermittent avec le serveur Odoo")
|
|
return
|
|
|
|
print("\nProjets disponibles:")
|
|
for project_id, project_name in projects.items():
|
|
print(f"ID: {project_id} - {project_name}")
|
|
|
|
# Demander à l'utilisateur de choisir un projet
|
|
project_input = input("\nEntrez l'ID du projet (ou 'q' pour quitter): ")
|
|
if project_input.lower() == 'q':
|
|
return
|
|
|
|
try:
|
|
project_id = int(project_input)
|
|
if project_id not in projects:
|
|
print("ID de projet invalide")
|
|
return
|
|
except ValueError:
|
|
print("L'ID doit être un nombre entier")
|
|
return
|
|
|
|
project_name = projects[project_id]
|
|
print(f"\nRécupération des tickets du projet: {project_name}")
|
|
print("Note: Seuls les champs essentiels sont récupérés pour éviter les erreurs SQL")
|
|
|
|
# Récupérer tous les tickets du projet
|
|
tickets = ticket_search.get_tickets_by_project(project_id)
|
|
|
|
if not tickets:
|
|
print("\nAucun ticket trouvé pour ce projet.")
|
|
print("Causes possibles:")
|
|
print("1. Le projet n'a pas de tickets")
|
|
print("2. Vous n'avez pas accès aux tickets de ce projet")
|
|
print("3. Il y a eu une erreur SQL lors de la récupération (vérifiez les messages d'erreur)")
|
|
return
|
|
|
|
print(f"\n{len(tickets)} tickets récupérés avec succès.")
|
|
|
|
# Sauvegarder les tickets organisés par étape
|
|
save_project_tickets_by_stage(tickets, project_name)
|
|
print("\nTraitement terminé!")
|
|
print("Vous pouvez maintenant utiliser ces fichiers JSON pour d'autres analyses.")
|
|
|
|
def handle_list_models():
|
|
"""Gère l'affichage de la liste des modèles"""
|
|
ticket_manager.list_models()
|
|
|
|
|
|
def handle_list_model_fields():
|
|
"""Gère l'affichage des champs d'un modèle"""
|
|
model_name = input("\nEntrez le nom du modèle: ")
|
|
if not model_name:
|
|
print("Aucun nom de modèle fourni.")
|
|
return
|
|
ticket_manager.list_model_fields(model_name)
|
|
|
|
|
|
def handle_export_model_fields_to_json():
|
|
"""Gère l'exportation des informations des champs d'un modèle en JSON"""
|
|
model_name = input("\nEntrez le nom du modèle: ")
|
|
if not model_name:
|
|
print("Aucun nom de modèle fourni.")
|
|
return
|
|
filename = input("Entrez le nom du fichier pour l'exportation: ")
|
|
if not filename:
|
|
print("Aucun nom de fichier fourni.")
|
|
return
|
|
ticket_manager.export_model_fields_to_json(model_name, filename) |