projetcbaollm/odoo_data/odoo_toolkit/ticket_classification.py
2025-03-17 16:31:21 +01:00

123 lines
6.1 KiB
Python

from data_filter import filter_ticket_data
import os
import json
from config import EXPORT_DIR
class TicketClassification:
def classify_tickets_by_field(self, tickets, field_name):
"""Classe les tickets par un champ donné et crée des répertoires."""
classified_tickets = {}
for ticket in tickets:
ticket = filter_ticket_data(ticket)
field_value = ticket["Champs Simples"].get(field_name) or ticket["Champs Relationnels"].get(field_name)
if field_value is not None:
str_value = str(field_value).replace("/", "_").replace("\\", "_")
if str_value not in classified_tickets:
classified_tickets[str_value] = []
classified_tickets[str_value].append(ticket)
return classified_tickets
def save_tickets_by_stage(self, tickets, project_name=None):
"""Sauvegarde les tickets dans des répertoires selon leur stage_id"""
if not tickets:
print("Aucun ticket à sauvegarder.")
return
# Créer un dictionnaire pour classifier les tickets par stage_id
tickets_by_stage = {}
for ticket in tickets:
# Appliquer le filtre pour nettoyer les données
try:
# Vérifier le format du ticket et appliquer le filtre approprié
if 'Champs Simples' in ticket and 'Champs Relationnels' in ticket:
# Le ticket est déjà dans le format attendu par filter_ticket_data
filtered_ticket = filter_ticket_data(ticket)
else:
# Convertir le ticket au format attendu, puis filtrer
converted_ticket = {
"ID du Ticket": ticket.get('id', 'N/A'),
"Nom": ticket.get('name', 'N/A'),
"Code": ticket.get('code', 'N/A') if 'code' in ticket else ticket.get('name', 'N/A'),
"Date Limite": ticket.get('date_deadline', 'N/A'),
"Champs Simples": {
field: ticket.get(field, 'N/A')
for field in ['description', 'priority', 'sequence', 'create_date', 'write_date']
if field in ticket
},
"Champs Relationnels": {},
"Discussions": []
}
# Ajouter les champs relationnels
for rel_field in ['stage_id', 'project_id', 'user_id']:
if rel_field in ticket and ticket[rel_field]:
if isinstance(ticket[rel_field], list) and len(ticket[rel_field]) > 1:
converted_ticket["Champs Relationnels"][rel_field] = f"{ticket[rel_field][1]} (ID: {ticket[rel_field][0]})"
else:
converted_ticket["Champs Relationnels"][rel_field] = ticket[rel_field]
filtered_ticket = filter_ticket_data(converted_ticket)
# Conserver les données originales pour la classification
filtered_ticket['id'] = ticket.get('id')
filtered_ticket['name'] = ticket.get('name')
filtered_ticket['stage_id'] = ticket.get('stage_id')
except Exception as e:
print(f"Erreur lors du filtrage du ticket {ticket.get('id', 'inconnu')}: {str(e)}")
# Continuer avec le ticket non filtré en cas d'erreur
filtered_ticket = ticket
# Vérifier si stage_id existe et a une valeur
if 'stage_id' in filtered_ticket and filtered_ticket['stage_id']:
stage_id = filtered_ticket['stage_id'][0] # L'ID du stage
stage_name = filtered_ticket['stage_id'][1] # Le nom du stage
# Créer une clé propre pour le nom du répertoire
stage_key = f"{stage_id}_{stage_name.replace('/', '_').replace(' ', '_')}"
if stage_key not in tickets_by_stage:
tickets_by_stage[stage_key] = []
tickets_by_stage[stage_key].append(filtered_ticket)
# Créer le répertoire principal pour l'export
base_dir = EXPORT_DIR
if not os.path.exists(base_dir):
os.makedirs(base_dir)
# Créer un sous-répertoire pour ce projet spécifique si fourni
if project_name:
base_dir = os.path.join(base_dir, f"projet_{project_name.replace('/', '_').replace(' ', '_')}")
if not os.path.exists(base_dir):
os.makedirs(base_dir)
# Sauvegarder les tickets dans leurs répertoires respectifs
for stage_key, stage_tickets in tickets_by_stage.items():
# Créer un répertoire pour cette étape
stage_dir = os.path.join(base_dir, stage_key)
if not os.path.exists(stage_dir):
os.makedirs(stage_dir)
# Sauvegarder tous les tickets de cette étape dans un fichier JSON
all_tickets_file = os.path.join(stage_dir, "all_tickets.json")
with open(all_tickets_file, 'w', encoding='utf-8') as f:
json.dump(stage_tickets, f, indent=4, ensure_ascii=False)
# Sauvegarder chaque ticket dans un fichier individuel
for ticket in stage_tickets:
ticket_id = ticket['id']
ticket_name = ticket.get('name', '').replace('/', '_').replace(' ', '_')
if not ticket_name:
ticket_name = f"ticket_{ticket_id}"
file_path = os.path.join(stage_dir, f"{ticket_id}_{ticket_name}.json")
with open(file_path, 'w', encoding='utf-8') as f:
json.dump(ticket, f, indent=4, ensure_ascii=False)
print(f"Sauvegardé {len(stage_tickets)} tickets dans {stage_dir}")
return tickets_by_stage