Gouzi Mohaled
Ajoute des fichiers et sous-dossiers supplémentaires
fe4792e
raw
history blame
10.5 kB
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"):
# Email
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é")