#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Script de validation de la migration Odoo 18.0 pour le module bemade_quotation_alternative Usage: python migration_validation.py Ce script vérifie : 1. La compatibilité des fichiers modifiés 2. La syntaxe Python et XML 3. Les imports et dépendances 4. Les conventions Odoo 18 """ import os import sys import xml.etree.ElementTree as ET from pathlib import Path def check_manifest(): """Vérifier le fichier __manifest__.py""" print("🔍 Vérification du manifest...") manifest_path = Path(__file__).parent / "__manifest__.py" try: with open(manifest_path, 'r', encoding='utf-8') as f: content = f.read() # Vérifier la version if "'version': '18.0.1.0.0'" in content: print("✅ Version mise à jour vers 18.0.1.0.0") else: print("❌ Version non mise à jour") return False # Vérifier les dépendances if "'sale_management'" in content: print("✅ Dépendance sale_management présente") else: print("⚠️ Dépendance sale_management manquante") return True except Exception as e: print(f"❌ Erreur lors de la lecture du manifest: {e}") return False def check_xml_views(): """Vérifier les vues XML""" print("\n🔍 Vérification des vues XML...") xml_files = [ "views/sale_order_views.xml", "wizard/sale_order_duplication_wizard_view.xml" ] all_valid = True for xml_file in xml_files: xml_path = Path(__file__).parent / xml_file try: # Vérifier la syntaxe XML ET.parse(xml_path) print(f"✅ {xml_file} - Syntaxe XML valide") # Vérifier les conventions Odoo 18 with open(xml_path, 'r', encoding='utf-8') as f: content = f.read() # Vérifier au lieu de if xml_file.endswith('wizard_view.xml'): if '' in content: print(f"✅ {xml_file} - Utilise (Odoo 18)") elif '' in content: print(f"⚠️ {xml_file} - Utilise encore (à migrer)") all_valid = False # Vérifier les classes CSS if 'class="oe_highlight"' in content: print(f"✅ {xml_file} - Classes CSS Odoo 18") elif 'class="btn-primary"' in content: print(f"⚠️ {xml_file} - Classes CSS anciennes détectées") all_valid = False except ET.ParseError as e: print(f"❌ {xml_file} - Erreur XML: {e}") all_valid = False except Exception as e: print(f"❌ {xml_file} - Erreur: {e}") all_valid = False return all_valid def check_python_syntax(): """Vérifier la syntaxe Python""" print("\n🔍 Vérification de la syntaxe Python...") python_files = [ "models/sale_order.py", "wizard/sale_order_duplication_wizard.py", "wizard/sale_oder_line_duplication_wizard.py" ] all_valid = True for py_file in python_files: py_path = Path(__file__).parent / py_file try: with open(py_path, 'r', encoding='utf-8') as f: content = f.read() # Vérifier la syntaxe compile(content, py_path, 'exec') print(f"✅ {py_file} - Syntaxe Python valide") # Vérifications spécifiques Odoo 18 if 'markupsafe import Markup' in content: print(f"✅ {py_file} - Import Markup correct") # Vérifier l'utilisation sécurisée de Markup if 'Markup(' in content and '% (' in content: print(f"✅ {py_file} - Utilisation sécurisée de Markup") elif 'Markup(f"' in content: print(f"⚠️ {py_file} - f-strings dans Markup (à éviter)") except SyntaxError as e: print(f"❌ {py_file} - Erreur de syntaxe: {e}") all_valid = False except Exception as e: print(f"❌ {py_file} - Erreur: {e}") all_valid = False return all_valid def check_security(): """Vérifier les fichiers de sécurité""" print("\n🔍 Vérification de la sécurité...") security_path = Path(__file__).parent / "security/ir.model.access.csv" try: with open(security_path, 'r', encoding='utf-8') as f: content = f.read() # Vérifier la présence des accès pour les wizards if 'model_sale_order_duplication_wizard' in content: print("✅ Accès définis pour le wizard principal") else: print("⚠️ Accès manquants pour le wizard principal") if 'model_sale_order_line_duplication_wizard' in content: print("✅ Accès définis pour le wizard de lignes") else: print("⚠️ Accès manquants pour le wizard de lignes") return True except Exception as e: print(f"❌ Erreur lors de la vérification de la sécurité: {e}") return False def main(): """Fonction principale""" print("🚀 Validation de la migration Odoo 18.0") print("=" * 50) checks = [ ("Manifest", check_manifest), ("Vues XML", check_xml_views), ("Syntaxe Python", check_python_syntax), ("Sécurité", check_security), ] results = [] for name, check_func in checks: try: result = check_func() results.append((name, result)) except Exception as e: print(f"❌ Erreur lors de {name}: {e}") results.append((name, False)) # Résumé print("\n" + "=" * 50) print("📊 RÉSUMÉ DE LA VALIDATION") print("=" * 50) all_passed = True for name, result in results: status = "✅ PASSÉ" if result else "❌ ÉCHEC" print(f"{name:20} : {status}") if not result: all_passed = False print("\n" + "=" * 50) if all_passed: print("🎉 MIGRATION VALIDÉE - Prêt pour Odoo 18.0!") print("📋 Prochaines étapes:") print(" 1. Installer le module dans un environnement Odoo 18") print(" 2. Exécuter les tests: python -m pytest tests/") print(" 3. Tester manuellement les fonctionnalités") else: print("⚠️ MIGRATION INCOMPLÈTE - Corrections nécessaires") print("📋 Vérifiez les erreurs ci-dessus avant de continuer") return 0 if all_passed else 1 if __name__ == "__main__": sys.exit(main())