adam-hassen
version finale avec modele des news
7f997f8
Raw
History Blame Contribute Delete
6.86 kB
import sqlite3
from services.database import get_connection
import datetime
def get_all_users():
"""Récupère tous les utilisateurs avec infos complètes (8 colonnes)"""
conn = get_connection()
cursor = conn.cursor()
try:
cursor.execute("""
SELECT id, email, is_admin, face_image,
COALESCE(prenom, '') as prenom,
COALESCE(nom, '') as nom,
COALESCE(created_at, '') as created_at,
COALESCE(public_stats, 0) as public_stats
FROM users ORDER BY id DESC
""")
return [(u[0], u[1], u[2] or 0, u[3], u[4], u[5], u[6], bool(u[7])) for u in cursor.fetchall()]
except Exception as e:
print(f" Erreur get_all_users: {e}")
return []
finally:
conn.close()
def get_registration_stats(days=30):
"""Retourne les inscriptions par jour sur les N derniers jours"""
conn = get_connection()
cursor = conn.cursor()
try:
cursor.execute("""
SELECT DATE(created_at) as day, COUNT(*) as cnt
FROM users
WHERE created_at >= DATE('now', ?)
GROUP BY DATE(created_at)
ORDER BY day
""", (f'-{days} days',))
return {row[0]: row[1] for row in cursor.fetchall()}
except Exception as e:
print(f" Erreur get_registration_stats: {e}")
return {}
finally:
conn.close()
def get_platform_trade_stats():
"""Statistiques globales des trades pour le dashboard admin"""
conn = get_connection()
cursor = conn.cursor()
try:
cursor.execute("""
SELECT COUNT(*),
SUM(CASE WHEN status='closed' THEN 1 ELSE 0 END),
SUM(CASE WHEN pnl > 0 THEN 1 ELSE 0 END),
COALESCE(SUM(pnl), 0),
COUNT(DISTINCT user_email)
FROM user_trades
""")
total, closed, wins, total_pnl, active = cursor.fetchone()
closed = closed or 0
wins = wins or 0
win_rate = round((wins / closed * 100) if closed > 0 else 0, 1)
return {
'total': total or 0,
'closed': closed,
'wins': wins,
'win_rate': win_rate,
'total_pnl': total_pnl or 0,
'active_users': active or 0,
}
except Exception as e:
print(f" Erreur get_platform_trade_stats: {e}")
return {'total': 0, 'closed': 0, 'wins': 0, 'win_rate': 0, 'total_pnl': 0, 'active_users': 0}
finally:
conn.close()
def get_top_traders(limit=5):
"""Top traders par PnL total (trades fermés uniquement)"""
conn = get_connection()
cursor = conn.cursor()
try:
cursor.execute("""
SELECT ut.user_email,
COALESCE(u.prenom, ''), COALESCE(u.nom, ''),
COUNT(*) as trades,
COALESCE(SUM(ut.pnl), 0) as total_pnl,
COALESCE(SUM(CASE WHEN ut.pnl > 0 THEN 1 ELSE 0 END), 0) as wins
FROM user_trades ut
LEFT JOIN users u ON u.email = ut.user_email
WHERE ut.status = 'closed'
GROUP BY ut.user_email
ORDER BY total_pnl DESC
LIMIT ?
""", (limit,))
result = []
for email, prenom, nom, trades, pnl, wins in cursor.fetchall():
name = " ".join(filter(None, [prenom, nom])).strip() or email.split('@')[0].capitalize()
win_rate = round((wins / trades * 100) if trades > 0 else 0, 1)
result.append({'email': email, 'name': name, 'trades': trades, 'pnl': pnl, 'win_rate': win_rate})
return result
except Exception as e:
print(f" Erreur get_top_traders: {e}")
return []
finally:
conn.close()
def get_user_count():
"""Nombre total d'utilisateurs"""
conn = get_connection()
cursor = conn.cursor()
try:
cursor.execute("SELECT COUNT(*) FROM users")
return cursor.fetchone()[0] or 0
except Exception as e:
print(f" Erreur get_user_count: {e}")
return 0
finally:
conn.close()
def get_users_with_faces():
conn = get_connection()
cursor = conn.cursor()
try:
cursor.execute("SELECT COUNT(*) FROM users WHERE face_image IS NOT NULL AND face_image != ''")
return cursor.fetchone()[0] or 0
except Exception as e:
print(f" Erreur get_users_with_faces: {e}")
return 0
finally:
conn.close()
def get_users_without_faces():
conn = get_connection()
cursor = conn.cursor()
try:
cursor.execute("SELECT COUNT(*) FROM users WHERE face_image IS NULL OR face_image = ''")
return cursor.fetchone()[0] or 0
except Exception as e:
print(f" Erreur get_users_without_faces: {e}")
return 0
finally:
conn.close()
def delete_user(user_id):
"""Supprime un utilisateur"""
conn = get_connection()
cursor = conn.cursor()
try:
cursor.execute("DELETE FROM users WHERE id = ?", (user_id,))
conn.commit()
return cursor.rowcount > 0
except Exception as e:
print(f" Erreur delete_user: {e}")
return False
finally:
conn.close()
def init_login_logs_table():
"""Crée la table des logs si elle n'existe pas"""
conn = get_connection()
cursor = conn.cursor()
try:
cursor.execute("""
CREATE TABLE IF NOT EXISTS login_logs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_email TEXT,
success BOOLEAN,
method TEXT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
)
""")
conn.commit()
except Exception as e:
print(f" Erreur création table logs: {e}")
finally:
conn.close()
def create_login_log(user_email, success, method="face"):
"""Crée un log de connexion"""
init_login_logs_table()
conn = get_connection()
cursor = conn.cursor()
try:
cursor.execute(
"INSERT INTO login_logs (user_email, success, method) VALUES (?, ?, ?)",
(user_email, 1 if success else 0, method)
)
conn.commit()
return True
except Exception as e:
print(f" Erreur create_login_log: {e}")
return False
finally:
conn.close()
def get_login_logs(limit=100):
"""Récupère les derniers logs"""
init_login_logs_table()
conn = get_connection()
cursor = conn.cursor()
try:
cursor.execute("""
SELECT id, user_email, success, method, timestamp
FROM login_logs
ORDER BY timestamp DESC
LIMIT ?
""", (limit,))
return cursor.fetchall()
except Exception as e:
print(f" Erreur get_login_logs: {e}")
return []
finally:
conn.close()