Spaces:
Sleeping
Sleeping
import streamlit as st | |
from utils.admin import supabase | |
import bcrypt | |
from utils.notification_handler import notify_security_alert #import du module de notifications (envoie une notification de sécurité en cas de modifications des données de l"utilisateur) | |
# Configuration de la page | |
st.set_page_config( | |
page_title="Profil Utilisateur", | |
page_icon="👤", | |
layout="centered" | |
) | |
st.title("Mon Profil") | |
# Vérification de l'authentification | |
if 'user' not in st.session_state: | |
st.error("Vous devez être connecté pour accéder à cette page.") | |
st.stop() | |
# Récupérer les informations actuelles de l'utilisateur | |
user_id = st.session_state['user']['id'] | |
user_info = supabase.table("users").select("*").eq("id", user_id).execute() | |
current_user = user_info.data[0] if user_info.data else None | |
# Section Informations Personnelles | |
st.header("📋 Informations Personnelles") | |
with st.form("personal_info_form"): | |
col1, col2 = st.columns(2) | |
with col1: | |
new_nom = st.text_input("Nom", value=current_user.get('nom', '')) | |
with col2: | |
new_prenom = st.text_input("Prénom", value=current_user.get('prenom', '')) | |
# Informations professionnelles | |
st.subheader("Informations professionnelles") | |
professional_info = current_user.get('professional_info', {}) | |
if isinstance(professional_info, str): | |
import json | |
professional_info = json.loads(professional_info) | |
new_profession = st.text_input( | |
"Profession", | |
value=professional_info.get('profession', '') | |
) | |
new_entreprise = st.text_input( | |
"Entreprise", | |
value=professional_info.get('entreprise', '') | |
) | |
submit_personal = st.form_submit_button("Mettre à jour mes informations") | |
if submit_personal: | |
try: | |
# Préparer les données à mettre à jour | |
update_data = { | |
"nom": new_nom, | |
"prenom": new_prenom, | |
"professional_info": { | |
"profession": new_profession, | |
"entreprise": new_entreprise | |
} | |
} | |
# Mettre à jour dans la base de données | |
supabase.table("users").update(update_data).eq("id", user_id).execute() | |
st.success("✅ Informations personnelles mises à jour avec succès!") | |
st.rerun() # Recharger la page pour afficher les nouvelles informations | |
# Notifier l'utilisateur | |
except Exception as e: | |
st.error(f"Une erreur est survenue : {str(e)}") | |
notify_security_alert(user_id, # notifier l'utilisateur du changement de ses impofrmations personnelles | |
"Vos informations personnelles ont été mises à jour." | |
) | |
# Section Email et Mot de passe | |
st.header("🔐 Email et Mot de passe") | |
with st.form("security_form"): | |
new_email = st.text_input("Email", value=current_user.get('email', '')) | |
# Mot de passe | |
st.subheader("Changer le mot de passe") | |
current_password = st.text_input("Mot de passe actuel", type="password") | |
new_password = st.text_input("Nouveau mot de passe", type="password") | |
confirm_password = st.text_input("Confirmer le nouveau mot de passe", type="password") | |
submit_security = st.form_submit_button("Mettre à jour les informations de sécurité") | |
if submit_security: | |
try: | |
update_data = {} | |
# Vérifier si l'email a changé | |
if new_email != current_user.get('email'): | |
# Vérifier si le nouvel email existe déjà | |
existing_email = supabase.table("users").select("id").eq("email", new_email).neq("id", user_id).execute() | |
if existing_email.data: | |
st.error("Cet email est déjà utilisé par un autre utilisateur.") | |
else: | |
update_data["email"] = new_email | |
# Vérifier si le mot de passe doit être mis à jour | |
if current_password and new_password and confirm_password: | |
# Vérifier l'ancien mot de passe | |
if not bcrypt.checkpw(current_password.encode(), current_user['password'].encode()): | |
st.error("Le mot de passe actuel est incorrect.") | |
elif new_password != confirm_password: | |
st.error("Les nouveaux mots de passe ne correspondent pas.") | |
elif len(new_password) < 8: | |
st.error("Le nouveau mot de passe doit contenir au moins 8 caractères.") | |
else: | |
# Hasher le nouveau mot de passe | |
hashed_password = bcrypt.hashpw(new_password.encode(), bcrypt.gensalt()).decode() | |
update_data["password"] = hashed_password | |
# Effectuer la mise à jour si nécessaire | |
if update_data: | |
supabase.table("users").update(update_data).eq("id", user_id).execute() | |
st.success("✅ Informations de sécurité mises à jour avec succès!") | |
if "email" in update_data: | |
st.warning("⚠️ Votre email a été modifié. Vous devrez vous reconnecter.") | |
st.session_state.clear() | |
st.rerun() | |
else: | |
st.info("Aucune modification à effectuer.") | |
except Exception as e: | |
st.error(f"Une erreur est survenue : {str(e)}") | |
# Section Préférences de Notification | |
st.header("🔔 Préférences de Notification") | |
# Récupérer les préférences actuelles | |
notification_prefs = supabase.table("notification_preferences").select("*").eq("user_id", user_id).execute() | |
current_prefs = notification_prefs.data[0] if notification_prefs.data else { | |
"email_notifications": True, | |
"security_alerts": True, | |
"assistant_updates": True, | |
"daily_summary": False | |
} | |
with st.form("notification_preferences_form"): | |
st.markdown("Choisissez les notifications que vous souhaitez recevoir :") | |
email_notif = st.toggle( | |
"Notifications par email", | |
value=current_prefs.get("email_notifications", True), | |
help="Recevoir les notifications par email" | |
) | |
security_alerts = st.toggle( | |
"Alertes de sécurité", | |
value=current_prefs.get("security_alerts", True), | |
help="Notifications concernant la sécurité de votre compte" | |
) | |
assistant_updates = st.toggle( | |
"Mises à jour des assistants", | |
value=current_prefs.get("assistant_updates", True), | |
help="Notifications sur les nouvelles fonctionnalités des assistants" | |
) | |
daily_summary = st.toggle( | |
"Résumé quotidien", | |
value=current_prefs.get("daily_summary", False), | |
help="Recevoir un résumé quotidien de vos interactions avec les assistants" | |
) | |
submit_notif = st.form_submit_button("Enregistrer mes préférences") | |
if submit_notif: | |
try: | |
# Préparer les données | |
notif_data = { | |
"user_id": user_id, | |
"email_notifications": email_notif, | |
"security_alerts": security_alerts, | |
"assistant_updates": assistant_updates, | |
"daily_summary": daily_summary, | |
"updated_at": "NOW()" | |
} | |
# Vérifier si des préférences existent déjà | |
if notification_prefs.data: | |
# Mettre à jour les préférences existantes | |
supabase.table("notification_preferences").update(notif_data).eq("user_id", user_id).execute() | |
else: | |
# Créer de nouvelles préférences | |
notif_data["created_at"] = "NOW()" | |
supabase.table("notification_preferences").insert(notif_data).execute() | |
st.success("✅ Préférences de notification mises à jour avec succès!") | |
except Exception as e: | |
st.error(f"Une erreur est survenue : {str(e)}") | |
# Maintenant que nous avons implémenté le système de préférences de notification dans le fichoer actuel, nous ajoutons la fonctionnalité pour envoyer effectivement ces notifications aux utilisateurs. | |
# Nous créyons un nouveau module pour gérer l'envoi des notifications. | |
# Voici les étapes : | |
# Créez un nouveau fichier utils/notification_handler.py qui gérera l'envoi des notifications. | |
# tester les notification (fonctions temporaires à supprimer en prod) | |
st.header("🧪 Test des Notifications") | |
test_col1, test_col2 = st.columns(2) | |
with test_col1: | |
with st.form("test_security_notification"): | |
st.subheader("Test Alerte de Sécurité") | |
test_security_msg = st.text_input( | |
"Message de test (sécurité)", | |
value="Ceci est un test d'alerte de sécurité" | |
) | |
if st.form_submit_button("Tester Alerte Sécurité"): | |
from utils.notification_handler import notify_security_alert | |
if notify_security_alert(user_id, test_security_msg): | |
st.success("✅ Notification de sécurité envoyée!") | |
else: | |
st.error("❌ Erreur lors de l'envoi de la notification") | |
with test_col2: | |
with st.form("test_assistant_notification"): | |
st.subheader("Test Mise à jour Assistant") | |
test_assistant_msg = st.text_input( | |
"Message de test (assistant)", | |
value="Ceci est un test de mise à jour assistant" | |
) | |
if st.form_submit_button("Tester Notification Assistant"): | |
from utils.notification_handler import notify_assistant_update | |
if notify_assistant_update(user_id, test_assistant_msg): | |
st.success("✅ Notification assistant envoyée!") | |
else: | |
st.error("❌ Erreur lors de l'envoi de la notification") | |
# Test du résumé quotidien | |
with st.form("test_daily_summary"): | |
st.subheader("Test Résumé Quotidien") | |
test_summary = { | |
"conversations": 5, | |
"questions": 15, | |
"usage_time": 45 | |
} | |
st.write("Données de test :") | |
st.json(test_summary) | |
if st.form_submit_button("Tester Résumé Quotidien"): | |
from utils.notification_handler import send_daily_summary | |
if send_daily_summary(user_id, test_summary): | |
st.success("✅ Résumé quotidien envoyé!") | |
else: | |
st.error("❌ Erreur lors de l'envoi du résumé") |