2025-03-17 16:31:21 +01:00

184 lines
7.7 KiB
Python

from odoo_connection import OdooConnection
class TicketSearch:
def __init__(self):
"""Initialise la classe de recherche de tickets et établit la connexion à Odoo"""
try:
self.conn = OdooConnection()
self.odoo = self.conn.get_odoo_instance()
# Force la connexion immédiatement
if not self.conn.connected:
success = self.conn.connect()
if success:
print("Connexion à Odoo établie avec succès.")
self.odoo = self.conn.get_odoo_instance()
else:
print("Échec de la connexion à Odoo.")
self.odoo = None
self.model_name = "project.task"
except Exception as e:
print(f"Erreur lors de l'initialisation de TicketSearch: {str(e)}")
self.odoo = None
self.model_name = "project.task"
def initialize_connection(self):
"""Initialise la connexion à Odoo"""
if self.odoo is None:
self.conn = OdooConnection()
self.odoo = self.conn.get_odoo_instance()
if self.odoo is None:
print("Erreur: Impossible de se connecter à Odoo.")
return False
return True
def _check_connection(self):
"""Vérifie que la connexion Odoo est active"""
if not self.initialize_connection():
return False
return True
def search_tickets_by_fields(self, field_criteria, limit=50):
"""Recherche des tickets selon des critères de champs"""
if not self._check_connection():
return []
domain = [(field, '=', value) for field, value in field_criteria.items()]
print(f"\nRecherche de tickets avec les critères: {field_criteria}")
try:
ticket_ids = self.odoo.execute(self.model_name, 'search', domain, 0, limit)
if not ticket_ids:
print("Aucun ticket ne correspond aux critères de recherche.")
return []
# Spécifier explicitement les champs à récupérer pour éviter les erreurs de relation
fields_to_read = ['id', 'name', 'stage_id', 'create_date', 'write_date',
'description', 'priority', 'sequence', 'date_deadline', 'project_id']
tickets = self.odoo.execute(self.model_name, 'read', ticket_ids, fields_to_read)
print(f"{len(tickets)} tickets trouvés.")
return tickets
except Exception as e:
print(f"Erreur lors de la recherche de tickets: {str(e)}")
return []
def get_ticket_by_id(self, ticket_id):
"""Récupère un ticket par son ID"""
if not self._check_connection():
return None
try:
ticket_data = self.odoo.execute(self.model_name, 'read', [ticket_id])
return ticket_data[0] if ticket_data else None
except Exception as e:
print(f"Erreur lors de la récupération du ticket {ticket_id}: {str(e)}")
return None
def get_ticket_by_code(self, ticket_code):
"""Récupère un ticket par son code (numéro de séquence)"""
if not self._check_connection():
return None
try:
# Recherche par le champ name qui contient généralement le code du ticket
domain = [('name', '=', ticket_code)]
ticket_ids = self.odoo.execute(self.model_name, 'search', domain, 0, 1)
if not ticket_ids:
# Essayer avec un match partiel si la recherche exacte échoue
domain = [('name', 'ilike', ticket_code)]
ticket_ids = self.odoo.execute(self.model_name, 'search', domain, 0, 1)
if not ticket_ids:
print(f"Aucun ticket trouvé avec le code {ticket_code}")
return None
ticket_data = self.odoo.execute(self.model_name, 'read', [ticket_ids[0]])
return ticket_data[0] if ticket_data else None
except Exception as e:
print(f"Erreur lors de la recherche du ticket {ticket_code}: {str(e)}")
return None
def get_field_values(self, field_name):
"""Récupère les valeurs possibles pour un champ relationnel"""
if not self._check_connection():
return {}
# Déterminer le modèle à interroger en fonction du champ
relation_models = {
'stage_id': 'project.task.type',
'project_id': 'project.project',
'user_id': 'res.users',
# Ajouter d'autres relations si nécessaire
}
model = relation_models.get(field_name)
if not model:
print(f"Modèle relationnel inconnu pour le champ {field_name}")
return {}
try:
# Récupérer tous les enregistrements du modèle relationnel
record_ids = self.odoo.execute(model, 'search', [], 0, 100)
records = self.odoo.execute(model, 'read', record_ids, ['name'])
# Créer un dictionnaire {id: name}
values = {record['id']: record['name'] for record in records}
return values
except Exception as e:
print(f"Erreur lors de la récupération des valeurs pour {field_name}: {str(e)}")
return {}
def search_by_project_and_stage(self, project_id, stage_id, limit=100):
"""Recherche des tickets par project_id et stage_id"""
if not self._check_connection():
return []
domain = [
('project_id', '=', project_id),
('stage_id', '=', stage_id)
]
print(f"\nRecherche de tickets du projet {project_id} à l'étape {stage_id}")
try:
ticket_ids = self.odoo.execute(self.model_name, 'search', domain, 0, limit)
if not ticket_ids:
print("Aucun ticket ne correspond aux critères de recherche.")
return []
# Spécifier explicitement les champs à récupérer pour éviter les erreurs de relation
fields_to_read = ['id', 'name', 'stage_id', 'create_date', 'write_date',
'description', 'priority', 'sequence', 'date_deadline']
tickets = self.odoo.execute(self.model_name, 'read', ticket_ids, fields_to_read)
print(f"{len(tickets)} tickets trouvés.")
return tickets
except Exception as e:
print(f"Erreur lors de la recherche: {str(e)}")
return []
def get_tickets_by_project(self, project_id, limit=200):
"""Récupère tous les tickets d'un projet spécifique"""
if not self._check_connection():
return []
domain = [('project_id', '=', project_id)]
try:
# Récupérer d'abord les IDs des tickets
ticket_ids = self.odoo.execute(self.model_name, 'search', domain, 0, limit)
if not ticket_ids:
print(f"Aucun ticket trouvé pour le projet ID: {project_id}")
return []
# Spécifier explicitement les champs à récupérer pour éviter les erreurs de relation
fields_to_read = ['id', 'name', 'stage_id', 'create_date', 'write_date',
'description', 'priority', 'sequence', 'date_deadline']
tickets = self.odoo.execute(self.model_name, 'read', ticket_ids, fields_to_read)
print(f"{len(tickets)} tickets trouvés pour le projet ID: {project_id}")
return tickets
except Exception as e:
print(f"Erreur lors de la recherche de tickets par projet: {str(e)}")
return []