diff --git a/__pycache__/ticket_manager.cpython-312.pyc b/__pycache__/ticket_manager.cpython-312.pyc index bcaa58d..d355324 100644 Binary files a/__pycache__/ticket_manager.cpython-312.pyc and b/__pycache__/ticket_manager.cpython-312.pyc differ diff --git a/exported_tickets/ticket_T10178_raw.json b/exported_tickets/ticket_T10178_raw.json new file mode 100644 index 0000000..80bbc25 --- /dev/null +++ b/exported_tickets/ticket_T10178_raw.json @@ -0,0 +1,3 @@ +[ + 10157 +] \ No newline at end of file diff --git a/ticket_manager.py b/ticket_manager.py index f776fe7..689b4eb 100644 --- a/ticket_manager.py +++ b/ticket_manager.py @@ -42,18 +42,7 @@ class TicketManager: except Exception as e: print_error(f" Erreur inattendue lors de '{method}' sur '{model}': {e}") return None - - def extract_invalid_field(self, error_message): - """Extrait le nom du champ invalide depuis un message d'erreur RPC""" - print(f"Analyse du message d'erreur : {error_message}") #debug - - match = re.search(r"la colonne ([\w.]+) n'existe pas", error_message) - if match: - print(f"Champ détecté comme invalide : {match.group(1)}") #debug - return match.group(1) #Retourne le champ détecté - print("Aucun champ invalide détecté") #debug - return None - + def get_model_fields(self, model_name): """Récupére tous les champs disponibles pour un modèle donné, en filtrant ceux qui ne sont pas exploitables""" fields_info = self._safe_execute(model_name, 'fields_get', [], ['name', 'type']) @@ -76,43 +65,25 @@ class TicketManager: 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 - excluded_fields = set() # Liste des champs à exclure - - while True: - try: - # Mise à jour de fields_to_read en supprimant les champs invalides - valid_fields = [field for field in fields_to_read if field not in excluded_fields] - - if not valid_fields: - print_error("Aucun champ valide disponible pour la requête.") - return None - - # Récupérer les données du ticket avec les champs filtrés - ticket_data = self._safe_execute(self.model_name, 'read', [ticket_id], valid_fields) - - if not ticket_data: - print_error(f"Aucun ticket trouvé avec l'ID {ticket_id}") - return None - - # Sauvegarde des données brutes pour analyse - self.save_raw_ticket_data(ticket_data, f"ticket_{ticket_id}_raw.json") - return ticket_data[0] - - except odoorpc.error.RPCError as e: - error_message = str(e) - print_error(f"Erreur RPC détectée : {error_message}") - - # Identifier le champ problématique - invalid_field = self.extract_invalid_field(error_message) - if invalid_field: - print(f"Exclusion du champ invalide : {invalid_field}") - excluded_fields.add(invalid_field) - - # Relancer la boucle immédiatement avec le champ exclu - continue - else: - print_error("Impossible d'identifier le champ problématique.") - return None + ticket_data = self._safe_execute(self.model_name, 'read', [ticket_id], fields_to_read) + + if ticket_data: + ticket = self.resolve_relational_fields(ticket_data[0]) + self.save_raw_ticket_data(ticket, f"ticket_{ticket_id}_raw.json") + return ticket + + print_error(f"Aucun ticket trouvé avec l'ID {ticket_id}") + return None + + def resolve_relational_fields(self, ticket): + """Ajoute les valeurs des champs relationnels""" + fields_info = self._safe_execute(self.model_name, 'fields_get', [], ['type']) + + for field, info in fields_info.items(): + if info.get("type") == "many2one" and isinstance(ticket.get(field), list): + ticket[f"{field}_value"] = ticket[field[1]] #Ajoute la valeur lisible en plus du ID + return ticket + def get_ticket_by_code(self, ticket_code): """Récupérer un ticket via son code"""