# tasks.py from celery import shared_task from django.utils import timezone from Subscriptions.automate import Automate_RF_Register, updateStateMachine from .models import RegistrationForm from GestionMessagerie.models import Messagerie from N3wtSchool import settings, bdd from N3wtSchool.mailManager import sendMail, getConnection from django.template.loader import render_to_string import requests import logging logger = logging.getLogger(__name__) @shared_task def check_for_signature_deadlines(): now = timezone.now() deadline = now - timezone.timedelta(days=settings.EXPIRATION_DI_NB_DAYS) # deadline = now - timezone.timedelta(seconds=settings.EXPIRATION_DI_NB_DAYS) dossiers_en_attente = RegistrationForm.objects.filter(etat=RegistrationForm.RegistrationFormStatus.DI_ENVOYE, dateMAJ__lt=deadline) for dossier in dossiers_en_attente: send_notification(dossier) def send_notification(dossier): logger.debug(f'Dossier en attente.... {dossier} - Positionnement à l\'état TO_BE_FOLLOWED_UP') # Changer l'état de l'automate updateStateMachine(dossier, 'EVENT_FOLLOW_UP') # Envoyer un email de relance aux responsables try: # Récupérer l'établissement du dossier establishment_id = dossier.establishment.id # Obtenir la connexion SMTP pour cet établissement connection = getConnection(establishment_id) # Préparer le contenu de l'email subject = f"[RELANCE] Dossier d'inscription en attente - {dossier.eleve.first_name} {dossier.eleve.last_name}" context = { 'student_name': f"{dossier.eleve.first_name} {dossier.eleve.last_name}", 'deadline_date': (timezone.now() - timezone.timedelta(days=settings.EXPIRATION_DI_NB_DAYS)).strftime('%d/%m/%Y'), 'establishment_name': dossier.establishment.name, 'base_url': settings.BASE_URL } # Utiliser un template HTML pour l'email (si disponible) try: html_message = render_to_string('emails/relance_signature.html', context) except: # Si pas de template, message simple html_message = f"""

Relance - Dossier d'inscription en attente

Bonjour,

Le dossier d'inscription de {context['student_name']} est en attente de signature depuis plus de {settings.EXPIRATION_DI_NB_DAYS} jours.

Merci de vous connecter à votre espace pour finaliser l'inscription.

Cordialement,
L'équipe {context['establishment_name']}

""" # Récupérer les emails des responsables destinataires = [] profiles = dossier.eleve.profiles.all() for profile in profiles: if profile.email: destinataires.append(profile.email) if destinataires: # Envoyer l'email result = sendMail( subject=subject, message=html_message, recipients=destinataires, connection=connection ) logger.info(f"Email de relance envoyé pour le dossier {dossier.id} à {destinataires}") else: logger.warning(f"Aucun email trouvé pour les responsables du dossier {dossier.id}") except Exception as e: logger.error(f"Erreur lors de l'envoi de l'email de relance pour le dossier {dossier.id}: {str(e)}") # En cas d'erreur email, utiliser la messagerie interne comme fallback try: url = settings.URL_DJANGO + 'GestionMessagerie/send-message/' # Créer ou récupérer une conversation avec chaque responsable destinataires = dossier.eleve.profiles.all() for destinataire in destinataires: message_data = { "conversation_id": None, # Sera géré par l'API "sender_id": 1, # ID du système ou admin "content": f"RELANCE pour le dossier d'inscription de {dossier.eleve.first_name} {dossier.eleve.last_name}" } response = requests.post(url, json=message_data) if response.status_code != 201: logger.error(f"Erreur lors de l'envoi du message interne: {response.text}") except Exception as inner_e: logger.error(f"Erreur lors de l'envoi du message interne de fallback: {str(inner_e)}") # subject = f"Dossier d'inscription non signé - {dossier.objet}" # message = f"Le dossier d'inscription avec l'objet '{dossier.objet}' n'a pas été signé depuis {dossier.created_at}." # send_mail(subject, message, settings.EMAIL_HOST_USER, [dossier.destinataire.email])