109 lines
3.8 KiB
Python
Executable file
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)
|