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