adam-hassen
fix: nouvelles modifications ajout de chatbot
ac348e2
Raw
History Blame Contribute Delete
7.11 kB
import sqlite3
import bcrypt
import os
# Chemin absolu basé sur __file__ : remonter 3 niveaux depuis services/database.py
# → toujours <racine_projet>/users.db, peu importe le répertoire de lancement
_HERE = os.path.dirname(os.path.abspath(__file__)) # .../Interface Graphique/services
_APP_DIR = os.path.dirname(_HERE) # .../Interface Graphique
_ROOT_DIR = os.path.dirname(_APP_DIR) # .../Projet4A_PredictionsBoursieres-main
DB_NAME = os.path.join(_ROOT_DIR, "users.db")
def get_connection():
return sqlite3.connect(DB_NAME)
def init_db():
"""Initialise la base de données avec toutes les tables"""
conn = get_connection()
cursor = conn.cursor()
# === TABLE USERS ===
cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='users'")
table_exists = cursor.fetchone()
if not table_exists:
print("Création de la table users...")
cursor.execute("""
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
email TEXT UNIQUE NOT NULL,
password BLOB NOT NULL,
face_image TEXT,
is_admin INTEGER DEFAULT 0,
prenom TEXT,
nom TEXT,
telephone TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
""")
conn.commit()
print("Table users créée avec succès")
# Créer un admin par défaut
create_default_admin(conn)
else:
# Vérifier les colonnes existantes
cursor.execute("PRAGMA table_info(users)")
columns = [col[1] for col in cursor.fetchall()]
if 'is_admin' not in columns:
print("Migration: ajout de la colonne is_admin...")
cursor.execute("ALTER TABLE users ADD COLUMN is_admin INTEGER DEFAULT 0")
conn.commit()
print("Migration is_admin réussie")
if 'face_image' not in columns:
print("Migration: ajout de la colonne face_image...")
cursor.execute("ALTER TABLE users ADD COLUMN face_image TEXT")
conn.commit()
print("Migration face_image réussie")
if 'created_at' not in columns:
print("Migration: ajout de la colonne created_at...")
cursor.execute("ALTER TABLE users ADD COLUMN created_at DATETIME")
conn.commit()
cursor.execute("UPDATE users SET created_at = CURRENT_TIMESTAMP WHERE created_at IS NULL")
conn.commit()
print("Migration created_at réussie")
if 'prenom' not in columns:
cursor.execute("ALTER TABLE users ADD COLUMN prenom TEXT")
conn.commit()
print("Migration prenom réussie")
if 'nom' not in columns:
cursor.execute("ALTER TABLE users ADD COLUMN nom TEXT")
conn.commit()
print("Migration nom réussie")
if 'telephone' not in columns:
cursor.execute("ALTER TABLE users ADD COLUMN telephone TEXT")
conn.commit()
print("Migration telephone réussie")
if 'public_stats' not in columns:
cursor.execute("ALTER TABLE users ADD COLUMN public_stats INTEGER DEFAULT 0")
conn.commit()
print("Migration public_stats réussie")
if 'is_online' not in columns:
cursor.execute("ALTER TABLE users ADD COLUMN is_online INTEGER DEFAULT 0")
conn.commit()
print("Migration is_online réussie")
print("Table users déjà existante, conservation des données")
ensure_admin_exists(conn)
# === TABLE USER_TRADES ===
cursor.execute("""
CREATE TABLE IF NOT EXISTS user_trades (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_email TEXT NOT NULL,
symbol TEXT NOT NULL,
entry_price REAL NOT NULL,
exit_price REAL,
entry_date DATETIME DEFAULT CURRENT_TIMESTAMP,
exit_date DATETIME,
quantity REAL,
prediction_direction TEXT,
actual_direction TEXT,
pnl REAL,
pnl_percentage REAL,
status TEXT DEFAULT 'open',
model_type TEXT DEFAULT 'sentiment',
FOREIGN KEY (user_email) REFERENCES users(email)
)
""")
print("Table user_trades vérifiée/créée")
# Migration: model_type column (for existing databases)
cursor.execute("PRAGMA table_info(user_trades)")
trade_columns = [col[1] for col in cursor.fetchall()]
if 'model_type' not in trade_columns:
cursor.execute("ALTER TABLE user_trades ADD COLUMN model_type TEXT DEFAULT 'sentiment'")
conn.commit()
print("Migration model_type réussie")
# === TABLE PREDICTIONS_LOG ===
cursor.execute("""
CREATE TABLE IF NOT EXISTS predictions_log (
id INTEGER PRIMARY KEY AUTOINCREMENT,
symbol TEXT NOT NULL,
prediction_price REAL,
prediction_direction TEXT,
confidence REAL,
model_version TEXT,
predicted_date DATE,
actual_price REAL,
actual_direction TEXT,
accuracy BOOLEAN,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
""")
print("Table predictions_log vérifiée/créée")
# === TABLE TESTIMONIALS ===
cursor.execute("""
CREATE TABLE IF NOT EXISTS testimonials (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_email TEXT NOT NULL,
user_name TEXT NOT NULL,
content TEXT NOT NULL,
rating INTEGER DEFAULT 5,
investment REAL,
gain REAL,
period TEXT,
status TEXT DEFAULT 'pending',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
approved_at DATETIME,
FOREIGN KEY (user_email) REFERENCES users(email)
)
""")
print("Table testimonials vérifiée/créée")
conn.commit()
conn.close()
print("Toutes les tables sont initialisées avec succès")
def create_default_admin(conn):
"""Crée un admin par défaut"""
cursor = conn.cursor()
default_email = "admin@ensim.com"
default_password = "Admin123!"
hashed = bcrypt.hashpw(default_password.encode(), bcrypt.gensalt())
try:
cursor.execute(
"INSERT INTO users (email, password, is_admin) VALUES (?, ?, ?)",
(default_email, hashed, 1)
)
conn.commit()
print("Admin par défaut créé: admin@ensim.com / Admin123!")
print("CHANGE CE MOT DE PASSE DÈS QUE POSSIBLE !")
except sqlite3.IntegrityError:
print("Admin par défaut déjà existant")
except Exception as e:
print(f"Erreur création admin: {e}")
def ensure_admin_exists(conn):
"""S'assure qu'il y a au moins un admin"""
cursor = conn.cursor()
cursor.execute("SELECT COUNT(*) FROM users WHERE is_admin = 1")
count = cursor.fetchone()[0]
if count == 0:
print("Aucun admin trouvé, création d'un admin par défaut...")
create_default_admin(conn)
else:
print(f"{count} administrateur(s) trouvé(s)")