#!/usr/bin/env python3 import os import sys import importlib.util import threading import time def check_dependency(package_name): """Vérifie si un package est installé.""" if package_name.lower() == "pillow": try: import PIL return True except ImportError: return False return importlib.util.find_spec(package_name) is not None def check_dependencies(require_webview: bool = False): """Vérifie que toutes les dépendances requises sont installées.""" required_packages = ["fpdf", "dateutil", "pillow", "packaging"] missing_packages = [] # Vérifie les dépendances de base for package in required_packages: if not check_dependency(package): missing_packages.append(package) # Vérifier pour CustomTkinter si demandé explicitement if "--ctk" in sys.argv: if not check_dependency("customtkinter"): print("Le package 'customtkinter' est requis pour le mode GUI CustomTkinter.") print("Veuillez l'installer avec :") print("pip install customtkinter") return False # Vérifier pywebview si demandé if require_webview and not check_dependency("webview"): print("Le mode --webview nécessite le package 'pywebview'.") print("Veuillez l'installer avec :") print("pip install pywebview") return False if missing_packages: print("Certaines dépendances requises ne sont pas installées:") for package in missing_packages: print(f" - {package}") print("\nVeuillez exécuter le script d'installation:") print("python install.py") return False return True def check_directories(): """Vérifie que les répertoires nécessaires existent.""" directories = [ "Data", "Data/clients", "Data/prospects", "output", "output/devis", "output/propositions" ] for directory in directories: dir_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), directory) if not os.path.exists(dir_path): print(f"Le répertoire {directory} n'existe pas.") print("Veuillez exécuter le script d'installation:") print("python install.py") return False return True def _run_flask_server(host: str = "127.0.0.1", port: int = 8080, debug: bool = False): """Démarre le serveur Flask (sans reloader)""" from app import app from modules.tasks.web import tasks_bp from modules.crm.web import crm_api_bp app.register_blueprint(tasks_bp) app.register_blueprint(crm_api_bp) # use_reloader=False pour éviter le double démarrage lorsque lancé en thread app.run(debug=debug, host=host, port=port, use_reloader=False) def launch_application(on_browser: bool = False): """Lance l'application principale, soit en mode webview, soit en mode navigateur.""" if not on_browser: # Lancer Flask en arrière-plan server_thread = threading.Thread(target=_run_flask_server, kwargs={"host": "127.0.0.1", "port": 8080, "debug": False}, daemon=True) server_thread.start() # Petite attente pour laisser le serveur démarrer time.sleep(0.5) # Ouvrir la fenêtre desktop import webview webview.create_window("Suite Consultance", "http://127.0.0.1:8080", width=1280, height=800) webview.start() else: # Mode interface web avec Flask classique from app import app from modules.tasks.web import tasks_bp from modules.crm.web import crm_api_bp app.register_blueprint(tasks_bp) app.register_blueprint(crm_api_bp) app.run(debug=True, host='0.0.0.0', port=8080) if __name__ == "__main__": app_mode_flag = "--browser" in sys.argv launch_application(on_browser=app_mode_flag)