diff --git a/.gitignore b/.gitignore index 97f1089..f581bfe 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ /odtkit +/exported_tickets +config.py \ No newline at end of file diff --git a/__pycache__/menu_handlers.cpython-312.pyc b/__pycache__/menu_handlers.cpython-312.pyc index e8a9f59..4b6e9da 100644 Binary files a/__pycache__/menu_handlers.cpython-312.pyc and b/__pycache__/menu_handlers.cpython-312.pyc differ diff --git a/__pycache__/menu_principal.cpython-312.pyc b/__pycache__/menu_principal.cpython-312.pyc index 8b57736..a8fc52a 100644 Binary files a/__pycache__/menu_principal.cpython-312.pyc and b/__pycache__/menu_principal.cpython-312.pyc differ diff --git a/__pycache__/ticket_manager.cpython-312.pyc b/__pycache__/ticket_manager.cpython-312.pyc index 1680351..c5f9951 100644 Binary files a/__pycache__/ticket_manager.cpython-312.pyc and b/__pycache__/ticket_manager.cpython-312.pyc differ diff --git a/menu_handlers.py b/menu_handlers.py index 8d2dc13..d44e421 100644 --- a/menu_handlers.py +++ b/menu_handlers.py @@ -4,6 +4,27 @@ from utils import get_user_choice, print_error # Initialisation de l'objet 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(): """Gère la recherche d'un ticket par ID""" ticket_id_input = input("Entrez l'ID du ticket(ou 'q' pour quitter): ") diff --git a/menu_principal.py b/menu_principal.py index da38d13..9e8d7c6 100644 --- a/menu_principal.py +++ b/menu_principal.py @@ -1,7 +1,9 @@ from menu_handlers import ( handle_project_tickets_by_stage, 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(): @@ -10,8 +12,10 @@ def display_main_menu(): print("1. Exporter les tickets d'un project_id par étape") print("2. Rechercher un ticket par ID") print("3. Rechercher un ticket par Code") - print("4. Quitter") - return input("\nChoisissez une option (1-4): ") + print("4. Afficher la liste des modèles disponibles") + print("5. Afficher les champs d'un modèle donné") + print("6. Quitter") + return input("\nChoisissez une option (1-6): ") def run_menu(): @@ -25,6 +29,10 @@ def run_menu(): elif choice == '3': handle_search_ticket_by_code() elif choice == '4': + handle_list_models() + elif choice == '5': + handle_list_model_fields() + elif choice == '6': print("Au revoir!") break else: diff --git a/ticket_manager.py b/ticket_manager.py index 464200a..2bb0eb0 100644 --- a/ticket_manager.py +++ b/ticket_manager.py @@ -61,7 +61,43 @@ class TicketManager: with open(file_path, "w", encoding="utf-8") as f: json.dump(ticket_data, f, indent=4, ensure_ascii=False) 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): """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 @@ -79,7 +115,7 @@ class TicketManager: """Ajoute les valeurs des champs relationnels""" 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): ticket[f"{field}_value"] = ticket[field][1] if len(ticket[field]) > 1 else None #Ajoute la valeur lisible en plus du ID return ticket