"""
Module d'initialisation de l'API IHM.
Ce module initialise l'application Flask et configure les différents composants :
- Base de données
- Authentification
- Blueprints
Version: 1.0.1 (2023-12-20)
Auteur: Kahina et franck - Groupe 2
Commit: bigmoletos@yopmail.com
"""
import os
from pathlib import Path
from flask import Flask
from flask_login import LoginManager
from .database.models import db, User
from .auth.routes import auth_bp
from .main.routes import main_bp
import logging
# Configuration du logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
[docs]
def create_app():
app = Flask(__name__)
# Configuration
base_dir = Path(__file__).parent.resolve() # Chemin absolu
db_path = base_dir / 'database' / 'db.sqlite'
logger.info(f"Chemin de base: {base_dir}")
logger.info(f"Chemin de la base de données: {db_path}")
# Création du dossier database s'il n'existe pas
try:
db_path.parent.mkdir(exist_ok=True, parents=True)
logger.info(f"Dossier database créé/vérifié: {db_path.parent}")
logger.info(
f"Permissions du dossier: {oct(db_path.parent.stat().st_mode)[-3:]}"
)
except Exception as e:
logger.error(f"Erreur lors de la création du dossier database: {e}")
raise
# Configuration de la base de données
app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite:///{db_path}'
app.config['SECRET_KEY'] = os.getenv('FLASK_SECRET_KEY', 'dev_key')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
logger.info(
f"URI de la base de données: {app.config['SQLALCHEMY_DATABASE_URI']}")
# Extensions
db.init_app(app)
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'auth.login'
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
# Initialisation de la base de données
with app.app_context():
try:
if not db_path.exists():
db.create_all()
logger.info(f"Base de données créée avec succès à {db_path}")
logger.info(
f"Permissions du fichier: {oct(db_path.stat().st_mode)[-3:]}"
)
else:
logger.info(f"Base de données existante à {db_path}")
logger.info(
f"Permissions du fichier: {oct(db_path.stat().st_mode)[-3:]}"
)
# Vérifier que les tables sont bien créées
tables = db.engine.table_names()
logger.info(f"Tables dans la base de données: {tables}")
except Exception as e:
logger.error(
f"Erreur lors de l'initialisation de la base de données : {e}")
raise
# Blueprints
app.register_blueprint(auth_bp, url_prefix='/auth')
app.register_blueprint(main_bp)
return app