SuiteConsultance/run.py
2025-09-20 13:18:04 +02:00

109 lines
3.8 KiB
Python
Executable file

#!/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)