colibri.assistant.ai / utils /notification_handler.py
Gouzi Mohaled
Ajoute des fichiers et sous-dossiers supplémentaires
fe4792e
raw
history blame
3.65 kB
# utils/notification_handler.py (fichier en relation avec profile.py)
import streamlit as st
from utils.email_utils import send_email
from utils.admin import supabase
from datetime import datetime
import pytz
import logging
def send_user_notification(user_id: int, notification_type: str, message: str) -> bool:
"""
Envoie une notification à l'utilisateur en respectant ses préférences
"""
try:
logging.info(f"Début de l'envoi de notification pour user_id: {user_id}, type: {notification_type}")
# Récupérer les préférences de l'utilisateur
user_prefs = supabase.table("notification_preferences").select("*").eq("user_id", user_id).execute()
user_info = supabase.table("users").select("email").eq("id", user_id).execute()
if not user_prefs.data:
logging.error(f"Aucune préférence trouvée pour user_id: {user_id}")
return False
if not user_info.data:
logging.error(f"Aucun utilisateur trouvé pour user_id: {user_id}")
return False
prefs = user_prefs.data[0]
user_email = user_info.data[0]['email']
logging.info(f"Préférences trouvées pour {user_email}: {prefs}")
# Vérifier si les notifications sont activées pour ce type
if notification_type == "security" and not prefs['security_alerts']:
logging.info(f"Alertes de sécurité désactivées pour {user_email}")
return False
elif notification_type == "assistant" and not prefs['assistant_updates']:
logging.info(f"Mises à jour assistant désactivées pour {user_email}")
return False
elif notification_type == "daily" and not prefs['daily_summary']:
logging.info(f"Résumé quotidien désactivé pour {user_email}")
return False
# Si les notifications par email sont activées
logging.info(f"Envoi d'email à {user_email}")
success = send_email(user_email,
f"Notification - {notification_type.capitalize()}",
f"""
<html>
<body>
<h2>Notification {notification_type}</h2>
<p>{message}</p>
<p>Date : {datetime.now(pytz.UTC).strftime('%Y-%m-%d %H:%M:%S UTC')}</p>
</body>
</html>
""")
if success:
logging.info(f"Email envoyé avec succès à {user_email}")
else:
logging.error(f"Échec de l'envoi de l'email à {user_email}")
return success
except Exception as e:
logging.error(f"Erreur lors de l'envoi de la notification : {str(e)}")
logging.error(f"Traceback complet : ", exc_info=True)
return False
def notify_security_alert(user_id: int, message: str) -> bool:
"""Envoie une alerte de sécurité"""
return send_user_notification(user_id, "security", message)
def notify_assistant_update(user_id: int, message: str) -> bool:
"""Envoie une notification de mise à jour des assistants"""
return send_user_notification(user_id, "assistant", message)
def send_daily_summary(user_id: int, summary_data: dict) -> bool:
"""Envoie le résumé quotidien"""
message = f"""
Résumé de vos activités :
- Nombre de conversations : {summary_data.get('conversations', 0)}
- Questions posées : {summary_data.get('questions', 0)}
- Temps total d'utilisation : {summary_data.get('usage_time', '0')} minutes
"""
return send_user_notification(user_id, "daily", message)