This commit is contained in:
Ladebeze66 2025-03-19 15:11:29 +01:00
parent ed678e4a2c
commit d4416f43c3
7 changed files with 71 additions and 4 deletions

2
.gitignore vendored
View File

@ -1 +1,3 @@
/odtkit /odtkit
/exported_tickets
config.py

View File

@ -4,6 +4,27 @@ from utils import get_user_choice, print_error
# Initialisation de l'objet # Initialisation de l'objet
ticket_manager = TicketManager() ticket_manager = TicketManager()
def handle_list_models():
"""Affiche et sauvegarde la liste des modèles disponibles"""
models = ticket_manager.get_all_models()
if models:
print("\n Modèles disponibles:")
for model, name in models.items():
print(f"- {model} : {name}")
def handle_list_model_fields():
"""Demande à l'utilisateur un modèle et affiche ses champs avec leur type."""
model_name = input("\nEntrez le nom du modèle à inspecter (ou 'q' pour quitter): ")
if model_name.lower() == 'q':
return
fields = ticket_manager.get_model_fields_with_types(model_name)
if fields:
print(f"\nChamps du modèle '{model_name}':")
for field, info in fields.items():
relation_info = f" (relation avec {info['relation']})" if info["relation"] else ""
print(f"- {field} : {info['type']}{relation_info}")
def handle_search_ticket_by_id(): def handle_search_ticket_by_id():
"""Gère la recherche d'un ticket par ID""" """Gère la recherche d'un ticket par ID"""
ticket_id_input = input("Entrez l'ID du ticket(ou 'q' pour quitter): ") ticket_id_input = input("Entrez l'ID du ticket(ou 'q' pour quitter): ")

View File

@ -1,7 +1,9 @@
from menu_handlers import ( from menu_handlers import (
handle_project_tickets_by_stage, handle_project_tickets_by_stage,
handle_search_ticket_by_id, handle_search_ticket_by_id,
handle_search_ticket_by_code handle_search_ticket_by_code,
handle_list_models,
handle_list_model_fields
) )
def display_main_menu(): def display_main_menu():
@ -10,8 +12,10 @@ def display_main_menu():
print("1. Exporter les tickets d'un project_id par étape") print("1. Exporter les tickets d'un project_id par étape")
print("2. Rechercher un ticket par ID") print("2. Rechercher un ticket par ID")
print("3. Rechercher un ticket par Code") print("3. Rechercher un ticket par Code")
print("4. Quitter") print("4. Afficher la liste des modèles disponibles")
return input("\nChoisissez une option (1-4): ") print("5. Afficher les champs d'un modèle donné")
print("6. Quitter")
return input("\nChoisissez une option (1-6): ")
def run_menu(): def run_menu():
@ -25,6 +29,10 @@ def run_menu():
elif choice == '3': elif choice == '3':
handle_search_ticket_by_code() handle_search_ticket_by_code()
elif choice == '4': elif choice == '4':
handle_list_models()
elif choice == '5':
handle_list_model_fields()
elif choice == '6':
print("Au revoir!") print("Au revoir!")
break break
else: else:

View File

@ -61,7 +61,43 @@ class TicketManager:
with open(file_path, "w", encoding="utf-8") as f: with open(file_path, "w", encoding="utf-8") as f:
json.dump(ticket_data, f, indent=4, ensure_ascii=False) json.dump(ticket_data, f, indent=4, ensure_ascii=False)
print(f"Données brutes du ticket sauvegardées dans : {file_path}") print(f"Données brutes du ticket sauvegardées dans : {file_path}")
def get_all_models(self):
"""Récupérer et sauvegarder tous les modèles disponibles"""
models = self._safe_execute('ir.model', 'search_read', [], ['model', 'name'] )
if not models:
print_error("Impossible de récupérer la liste des modèles.")
return None
#Convertir en dictionnaire {nom_du_modèle: description}
models_dict = {model['model']: model['name'] for model in models}
#Sauvegarder dans un fichier JSON
self.save_raw_ticket_data(models_dict, "all_models.json")
print(f"Liste des modèles sauvegardée dans 'available_models.json")
return models_dict
def get_model_fields_with_types(self, model_name):
"""Récupère et sauvegarde les champs d'un modèle avec leurs types"""
fields_info = self._safe_execute(model_name, 'fields_get', [], ['name', 'type', 'relation'])
if not fields_info:
print_error(f"Impossible de récupérer les champs pour {model_name}")
return {}
# Construire un dictionnaire {champ: {type, relation (si relationnel)}}
fields_dict = {
field: {
"type": info["type"],
"relation": info.get("relation", None)
}
for field, info in fields_info.items()
}
# Sauvegarde en JSON
self.save_raw_ticket_data(fields_dict, f"fields_{model_name}.json")
print(f"Liste des champs du modèle '{model_name}' sauvegardée dans 'fields_{model_name}.json'")
return fields_dict
def get_ticket_by_id(self, ticket_id): def get_ticket_by_id(self, ticket_id):
"""Récupère les détails d'un ticket par son ID et exclut dynamiquement les champs invalides""" """Récupère les détails d'un ticket par son ID et exclut dynamiquement les champs invalides"""
fields_to_read = self.get_model_fields(self.model_name) # Récupère tous les champs fields_to_read = self.get_model_fields(self.model_name) # Récupère tous les champs
@ -79,7 +115,7 @@ class TicketManager:
"""Ajoute les valeurs des champs relationnels""" """Ajoute les valeurs des champs relationnels"""
fields_info = self._safe_execute(self.model_name, 'fields_get', [], ['type']) fields_info = self._safe_execute(self.model_name, 'fields_get', [], ['type'])
for field, info in fields_info.items(): for field, info in fields_info.items(): # type: ignore
if info.get("type") == "many2one" and isinstance(ticket.get(field), list): if info.get("type") == "many2one" and isinstance(ticket.get(field), list):
ticket[f"{field}_value"] = ticket[field][1] if len(ticket[field]) > 1 else None #Ajoute la valeur lisible en plus du ID ticket[f"{field}_value"] = ticket[field][1] if len(ticket[field]) > 1 else None #Ajoute la valeur lisible en plus du ID
return ticket return ticket