mirror of
https://git.v0id.ovh/n3wt-innov/n3wt-school.git
synced 2026-01-28 23:43:22 +00:00
111 lines
4.7 KiB
Python
111 lines
4.7 KiB
Python
# 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"""
|
|
<html>
|
|
<body>
|
|
<h2>Relance - Dossier d'inscription en attente</h2>
|
|
<p>Bonjour,</p>
|
|
<p>Le dossier d'inscription de <strong>{context['student_name']}</strong> est en attente de signature depuis plus de {settings.EXPIRATION_DI_NB_DAYS} jours.</p>
|
|
<p>Merci de vous connecter à votre espace pour finaliser l'inscription.</p>
|
|
<p>Cordialement,<br>L'équipe {context['establishment_name']}</p>
|
|
</body>
|
|
</html>
|
|
"""
|
|
|
|
# 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])
|