Spaces:
Sleeping
Sleeping
File size: 7,111 Bytes
a3da09c ac348e2 a3da09c ac348e2 a3da09c ac348e2 a3da09c 7f997f8 a3da09c ac348e2 a3da09c ac348e2 a3da09c ac348e2 a3da09c ac348e2 a3da09c ac348e2 a3da09c ac348e2 a3da09c ac348e2 7f997f8 ac348e2 7f997f8 ac348e2 7f997f8 ac348e2 7f997f8 ac348e2 7f997f8 ac348e2 7f997f8 ac348e2 a3da09c 75118bc a3da09c ac348e2 a3da09c 75118bc ac348e2 75118bc a3da09c ac348e2 a3da09c ac348e2 a3da09c ac348e2 a3da09c 7f997f8 a3da09c ac348e2 a3da09c ac348e2 a3da09c ac348e2 a3da09c ac348e2 a3da09c ac348e2 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 | 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)")
|