Code source de services.api_ihm.src.database.clean_db

"""
Version: 1.2.0 (2023-12-20)
Auteur: Kahina et franck - Groupe 2
Commit: bigmoletos@yopmail.com

Script de nettoyage et réinitialisation de la base de données.

Ce module permet de nettoyer complètement et recréer la base de données
de l'application. Il assure:
- La suppression sécurisée des anciennes données
- La recréation des tables avec le schéma à jour
- La réinitialisation du compte administrateur

Architecture:
------------
1. Nettoyage:
   - Suppression du fichier SQLite existant
   - Vérification des permissions
   - Gestion des erreurs

2. Réinitialisation:
   - Création des dossiers nécessaires
   - Configuration de Flask
   - Initialisation SQLAlchemy

3. Configuration:
   - Gestion des chemins absolus
   - Configuration de la base SQLite
   - Création de l'admin par défaut

Utilisation:
-----------
    python clean_db.py

ATTENTION:
---------
    Ce script supprime TOUTES les données existantes.
    À utiliser avec précaution en production.

Dépendances:
-----------
    - flask : Application minimale
    - models : Modèles SQLAlchemy
    - pathlib : Gestion des chemins
"""

import os
import logging
from pathlib import Path
from flask import Flask
import sys

# Ajouter le chemin parent au PYTHONPATH
current_dir = Path(__file__).parent.parent
sys.path.append(str(current_dir))

from database.models import db, User
from database.config import config

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)


[docs] def clean_databases(): """ Nettoie et réinitialise complètement la base de données. Cette fonction: 1. Supprime la base de données existante 2. Recrée la structure des tables 3. Initialise les données par défaut Processus: --------- 1. Nettoyage: - Détermination des chemins absolus - Suppression du fichier SQLite - Vérification des permissions 2. Préparation: - Création des dossiers requis - Configuration de Flask - Initialisation de SQLAlchemy 3. Réinitialisation: - Création des tables - Configuration de l'admin - Validation de la structure Notes: ----- - Utilise des chemins absolus pour la fiabilité - Vérifie les permissions avant suppression - Crée un utilisateur admin par défaut Environment Variables: ------------------- ADMIN_PASSWORD : str Mot de passe admin (requis) Raises: ------ Exception - Si la suppression échoue - Si la création échoue - Si les permissions sont insuffisantes - Si ADMIN_PASSWORD n'est pas défini """ # Chemin de base (absolu) base_path = current_dir.resolve() logger.info(f"Chemin de base: {base_path}") # Chemin de la base de données db_path = base_path / 'database' / 'db.sqlite' db_path = db_path.resolve() # Obtenir le chemin absolu logger.info(f"Chemin de la base de données: {db_path}") # Supprimer l'ancien fichier de base de données s'il existe try: if db_path.exists(): db_path.unlink() logger.info(f"Ancienne base de données supprimée : {db_path}") except Exception as e: logger.error(f"Erreur lors de la suppression de {db_path}: {e}") # S'assurer que le dossier database existe db_path.parent.mkdir(exist_ok=True) (db_path.parent / '.gitkeep').touch() logger.info(f"Dossier database vérifié : {db_path.parent}") # Créer une application Flask minimale app = Flask(__name__) # Utiliser /// pour un chemin absolu dans SQLite sqlite_uri = f'sqlite:///{db_path}' logger.info(f"URI SQLite: {sqlite_uri}") app.config['SQLALCHEMY_DATABASE_URI'] = sqlite_uri app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db.init_app(app) # Recréer la base de données avec la nouvelle structure with app.app_context(): try: db.create_all() logger.info("Base de données recréée avec succès") # Vérifier que ADMIN_PASSWORD est défini admin_password = os.getenv('ADMIN_PASSWORD') if not admin_password: raise ValueError( "ADMIN_PASSWORD doit être défini dans les variables d'environnement" ) # Créer l'utilisateur admin admin = User(username='admin', email='contact@iaproject.fr', is_admin=True) admin.set_password(admin_password) db.session.add(admin) db.session.commit() logger.info("Utilisateur admin créé avec succès") except Exception as e: logger.error(f"Erreur lors de la recréation de la base de données : {e}") logger.error(f"URI SQLite: {sqlite_uri}") logger.error(f"Permissions dossier: {os.access(db_path.parent, os.W_OK)}") raise
if __name__ == "__main__": clean_databases()