This commit is contained in:
Ladebeze66 2025-03-19 14:06:15 +01:00
parent eaba620782
commit e34c989d34
3 changed files with 23 additions and 49 deletions

View File

@ -0,0 +1,3 @@
[
10157
]

View File

@ -43,17 +43,6 @@ class TicketManager:
print_error(f" Erreur inattendue lors de '{method}' sur '{model}': {e}") print_error(f" Erreur inattendue lors de '{method}' sur '{model}': {e}")
return None 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): 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""" """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']) 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): 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
excluded_fields = set() # Liste des champs à exclure ticket_data = self._safe_execute(self.model_name, 'read', [ticket_id], fields_to_read)
while True: if ticket_data:
try: ticket = self.resolve_relational_fields(ticket_data[0])
# Mise à jour de fields_to_read en supprimant les champs invalides self.save_raw_ticket_data(ticket, f"ticket_{ticket_id}_raw.json")
valid_fields = [field for field in fields_to_read if field not in excluded_fields] return ticket
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}") print_error(f"Aucun ticket trouvé avec l'ID {ticket_id}")
return None return None
# Sauvegarde des données brutes pour analyse def resolve_relational_fields(self, ticket):
self.save_raw_ticket_data(ticket_data, f"ticket_{ticket_id}_raw.json") """Ajoute les valeurs des champs relationnels"""
return ticket_data[0] fields_info = self._safe_execute(self.model_name, 'fields_get', [], ['type'])
except odoorpc.error.RPCError as e: for field, info in fields_info.items():
error_message = str(e) if info.get("type") == "many2one" and isinstance(ticket.get(field), list):
print_error(f"Erreur RPC détectée : {error_message}") ticket[f"{field}_value"] = ticket[field[1]] #Ajoute la valeur lisible en plus du ID
return ticket
# 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
def get_ticket_by_code(self, ticket_code): def get_ticket_by_code(self, ticket_code):
"""Récupérer un ticket via son code""" """Récupérer un ticket via son code"""