"""
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()