#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Script pour aider à la migration des imports dans le projet. Ce script identifie les imports obsolètes et suggère des remplacements selon la nouvelle structure de répertoires. """ import os import re import sys # Mappings des anciens imports vers les nouveaux IMPORT_MAPPINGS = { 'from formatters.clean_html import': 'from formatters.clean_html import', 'from formatters.json_to_markdown import': 'from formatters.json_to_markdown import', 'from formatters.markdown_to_json import': 'from formatters.markdown_to_json import', 'from formatters.report_formatter import': 'from formatters.report_formatter import', 'from loaders.ticket_data_loader import': 'from loaders.ticket_data_loader import', 'from odoo.auth_manager import': 'from odoo.auth_manager import', 'from odoo.ticket_manager import': 'from odoo.ticket_manager import', 'from odoo.message_manager import': 'from odoo.message_manager import', 'from odoo.attachment_manager import': 'from odoo.attachment_manager import', 'from odoo.retrieve_ticket import': 'from odoo.retrieve_ticket import', 'from core.utils import': 'from core.utils import', 'import formatters.clean_html': 'import formatters.clean_html', 'import formatters.json_to_markdown': 'import formatters.json_to_markdown', 'import formatters.markdown_to_json': 'import formatters.markdown_to_json', 'import formatters.report_formatter': 'import formatters.report_formatter', 'import loaders.ticket_data_loader': 'import loaders.ticket_data_loader', 'import odoo.auth_manager': 'import odoo.auth_manager', 'import odoo.ticket_manager': 'import odoo.ticket_manager', 'import odoo.message_manager': 'import odoo.message_manager', 'import odoo.attachment_manager': 'import odoo.attachment_manager', 'import odoo.retrieve_ticket': 'import odoo.retrieve_ticket', 'import core.utils': 'import core.utils', 'from formatters.clean_html import': 'from formatters.clean_html import', 'from formatters.report_formatter import': 'from formatters.report_formatter import', 'from loaders.ticket_data_loader import': 'from loaders.ticket_data_loader import', 'import formatters.clean_html': 'import formatters.clean_html', 'import formatters.report_formatter': 'import formatters.report_formatter', 'import loaders.ticket_data_loader': 'import loaders.ticket_data_loader', } # Modules qui sont désormais dans des sous-modules utils UTILS_SUBMAPPING = { 'from agents.utils.report_utils import get_timestamp': 'from agents.utils.report_utils import get_timestamp', 'from agents.utils.report_utils import extraire_et_traiter_json': 'from agents.utils.report_utils import extraire_et_traiter_json', 'from agents.utils.report_utils import generer_tableau_questions_reponses': 'from agents.utils.report_utils import generer_tableau_questions_reponses', } def find_python_files(root_dir='.', exclude_dirs=None): """ Trouve tous les fichiers Python dans le répertoire racine. Args: root_dir: Répertoire racine pour la recherche exclude_dirs: Liste des répertoires à exclure Returns: Liste des chemins de fichiers Python """ if exclude_dirs is None: exclude_dirs = ['venv', '__pycache__', '.git'] python_files = [] for dirpath, dirnames, filenames in os.walk(root_dir): # Exclure les répertoires spécifiés dirnames[:] = [d for d in dirnames if d not in exclude_dirs] for filename in filenames: if filename.endswith('.py'): python_files.append(os.path.join(dirpath, filename)) return python_files def scan_imports(file_path): """ Scanne un fichier pour les imports à mettre à jour. Args: file_path: Chemin du fichier à scanner Returns: Liste des imports à mettre à jour (ancien, nouveau) """ with open(file_path, 'r', encoding='utf-8') as f: content = f.read() imports_to_update = [] for old_import, new_import in IMPORT_MAPPINGS.items(): if old_import in content: imports_to_update.append((old_import, new_import)) for old_import, new_import in UTILS_SUBMAPPING.items(): if old_import in content: imports_to_update.append((old_import, new_import)) return imports_to_update def update_file(file_path, imports_to_update, dry_run=True): """ Met à jour les imports dans un fichier. Args: file_path: Chemin du fichier à mettre à jour imports_to_update: Liste des imports à mettre à jour (ancien, nouveau) dry_run: Si True, affiche seulement les changements sans les appliquer Returns: True si des modifications ont été apportées, False sinon """ if not imports_to_update: return False with open(file_path, 'r', encoding='utf-8') as f: content = f.read() modified_content = content for old_import, new_import in imports_to_update: modified_content = modified_content.replace(old_import, new_import) if modified_content != content: if dry_run: print(f"Modifications pour {file_path}:") for old_import, new_import in imports_to_update: print(f" {old_import} -> {new_import}") else: with open(file_path, 'w', encoding='utf-8') as f: f.write(modified_content) print(f"Updated {file_path}") return True return False def main(): """ Fonction principale. """ dry_run = True if len(sys.argv) > 1 and sys.argv[1] == '--apply': dry_run = False python_files = find_python_files() files_with_obsolete_imports = 0 for file_path in python_files: imports_to_update = scan_imports(file_path) if update_file(file_path, imports_to_update, dry_run): files_with_obsolete_imports += 1 if dry_run: print(f"\nTrouvé {files_with_obsolete_imports} fichiers avec des imports obsolètes.") print("Exécutez avec l'option --apply pour appliquer les modifications.") else: print(f"\nMis à jour {files_with_obsolete_imports} fichiers.") if __name__ == "__main__": main()