diff --git a/__pycache__/ticket_manager.cpython-312.pyc b/__pycache__/ticket_manager.cpython-312.pyc index 0ec0758..f10243a 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_T10929_raw.json b/exported_tickets/ticket_T10929_raw.json deleted file mode 100644 index 1ba3ba8..0000000 --- a/exported_tickets/ticket_T10929_raw.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - 10908 -] \ No newline at end of file diff --git a/ticket_manager.py b/ticket_manager.py index 1d7e1a9..4e20b3c 100644 --- a/ticket_manager.py +++ b/ticket_manager.py @@ -1,9 +1,11 @@ from odoo_connection import OdooConnection import os import json +import re from utils import save_json, ensure_export_directory, print_error from config import EXPORT_DIR from data_filter import filter_ticket_data +import odoorpc class TicketManager: """Gestionnaire de tickets simplifié avec seulement les fonctionnalités essentielles""" @@ -41,13 +43,23 @@ class TicketManager: 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""" + match = re.search(r"la colonne ([\w.]+) n'existe pas", error_message) + if match: + return match.group(1) #Retourne le champ détecté + return None def get_model_fields(self, model_name): - """Récupére tous les champs disponibles pour un modèle donné""" - fields_info = self._safe_execute(model_name, 'fields_get', [], ['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']) if not fields_info: print_error(f"Impossible de récupérer les champs pour {model_name}") return [] - return list(fields_info.keys()) #Retourne la liste des champs + + #On filtre les champs qui ne sont pas exploitables + invalid_types = [] + valid_fields = [field for field, info in fields_info.items() if info.get("type") not in invalid_types] + return valid_fields #Retourne la liste des champs exploitables def save_raw_ticket_data(self, ticket_data, filename="raw_ticket_data.json"): """Sauvegarde les données brutes du ticket dans un fichier JSON""" @@ -59,18 +71,34 @@ class TicketManager: def get_ticket_by_id(self, ticket_id): """ Récupère les détails d'un ticket par son ID et applique le filtre """ fields_to_read = self.get_model_fields(self.model_name) #Récupère tous les champs disponibles pour le modèle - - # Récupérer les données du ticket - ticket_data = self._safe_execute(self.model_name, 'read', [ticket_id], fields_to_read) - - 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") + excluded_fields = set() # Liste des champs à exlure - return ticket_data[0] + while True: + try: + #Récupérer les données du ticket avec les champs filtrés + valid_fields = [field for field in fields_to_read if field not in excluded_fields] + 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) + else: + print_error(f"Impossible d'identifier le champ problématique. Arrêt de la récupération des données.") + return None def get_ticket_by_code(self, ticket_code): """Récupérer un ticket via son code"""