diff --git a/SIRH/__pycache__/settings.cpython-310.pyc b/SIRH/__pycache__/settings.cpython-310.pyc index f05b619..430e452 100644 Binary files a/SIRH/__pycache__/settings.cpython-310.pyc and b/SIRH/__pycache__/settings.cpython-310.pyc differ diff --git a/SIRH/settings.py b/SIRH/settings.py index ed7ef78..a6d62f9 100644 --- a/SIRH/settings.py +++ b/SIRH/settings.py @@ -150,6 +150,7 @@ MEDIA_ROOT = BASE_DIR / "media" DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' +# Configuration de l'email EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'ssl0.ovh.net' EMAIL_PORT = 465 diff --git a/fonction_utilitaire/__pycache__/fonctions_utilitaire.cpython-310.pyc b/fonction_utilitaire/__pycache__/fonctions_utilitaire.cpython-310.pyc index 3ff9247..e8fd69c 100644 Binary files a/fonction_utilitaire/__pycache__/fonctions_utilitaire.cpython-310.pyc and b/fonction_utilitaire/__pycache__/fonctions_utilitaire.cpython-310.pyc differ diff --git a/fonction_utilitaire/fonctions_utilitaire.py b/fonction_utilitaire/fonctions_utilitaire.py index 1ccdba0..eb56ca3 100644 --- a/fonction_utilitaire/fonctions_utilitaire.py +++ b/fonction_utilitaire/fonctions_utilitaire.py @@ -1,5 +1,5 @@ from django.utils import timezone -from gestion_employe.models import Contrat +from gestion_employe.models import Contrat, Employe from gestion_conge.models import Conge @@ -7,6 +7,7 @@ QUOTA_CONGE_ANNUEL = 30 NOMBRE_PAGINATION = 8 DEBUT_RAPPEL = 60 DUREE_FIN_CONTRAT = 90 +EMAIL_ASSISTANTE_DE_DIRECTION = list(Employe.objects.filter(fonction="assistant_direction").values_list('user__email', flat=True)) def solde_conge(employe): """Fonction de calcul du solde de congé restant l'employé""" @@ -31,4 +32,26 @@ def solde_conge(employe): "success": True, "quota_annuel": QUOTA_CONGE_ANNUEL - jours_conges_valider, "nombre_jours_valide": jours_conges_valider - } \ No newline at end of file + } + +def envoyer_mail(sujet, message, destinataires): + """Fonction d'envoi de mail""" + from django.core.mail import send_mail + from django.conf import settings + + send_mail( + sujet, + message, + settings.EMAIL_HOST_USER, + destinataires, + fail_silently=False, + ) + +def destinataire_mail_demande_conges(employe): + """Fonction de récupération des destinataires pour les mails de demande de congés""" + if employe.chef: + return EMAIL_ASSISTANTE_DE_DIRECTION + else: + if employe.departement: + chefs_departement = Employe.objects.filter(departement=employe.departement, chef=True) + return list(chefs_departement.values_list('user__email', flat=True)) diff --git a/gestion_conge/__pycache__/urls.cpython-310.pyc b/gestion_conge/__pycache__/urls.cpython-310.pyc index f60e9ec..36ac70d 100644 Binary files a/gestion_conge/__pycache__/urls.cpython-310.pyc and b/gestion_conge/__pycache__/urls.cpython-310.pyc differ diff --git a/gestion_conge/__pycache__/views.cpython-310.pyc b/gestion_conge/__pycache__/views.cpython-310.pyc index 53bdfa6..4c8be54 100644 Binary files a/gestion_conge/__pycache__/views.cpython-310.pyc and b/gestion_conge/__pycache__/views.cpython-310.pyc differ diff --git a/gestion_conge/views.py b/gestion_conge/views.py index 0b92e84..338770c 100644 --- a/gestion_conge/views.py +++ b/gestion_conge/views.py @@ -83,7 +83,6 @@ def index(request): Q(validation_hierarchique = True) | Q(validation_hierarchique = False) ).order_by('-date_demande') - return render(request, 'gestion_conge/index.html', { "nombre_conges_valide": nombre_conges_valide, "nombre_conges_refuse": nombre_conges_refuse, @@ -123,6 +122,13 @@ def demander_conge(request): conge_obj.save() messages.success(request, "Votre demande de congé a été enregistrée.") + + fonctions_utilitaire.envoyer_mail( + sujet = "Demande de congé", + message = f"""Bonjour {employe.user.first_name} {employe.user.last_name}, votre demande de congé a été enregistrée. Veuillez consulter votre profil pour plus de détails.""", + destinataires = fonctions_utilitaire.destinataire_mail_demande_conges() + [employe.user.email] + ) + return redirect("gestion_conges:conge") return redirect("gestion_conges:conge") diff --git a/gestion_employe/__pycache__/views.cpython-310.pyc b/gestion_employe/__pycache__/views.cpython-310.pyc index 4d272bc..09b99be 100644 Binary files a/gestion_employe/__pycache__/views.cpython-310.pyc and b/gestion_employe/__pycache__/views.cpython-310.pyc differ diff --git a/gestion_employe/views.py b/gestion_employe/views.py index dc61818..80d902c 100644 --- a/gestion_employe/views.py +++ b/gestion_employe/views.py @@ -109,6 +109,13 @@ def affecter_employe_projet(request): } ) messages.success(request, f"L'employé {employe.user.first_name} {employe.user.last_name} a été affecté au projet {projet.nom_projet}.") + + fonctions_utilitaire.envoyer_mail( + sujet = "Affectation à un projet", + message = f"""Bonjour {employe.user.first_name} {employe.user.last_name}, vous avez été affecté au projet {projet.nom_projet.upper()} pour la période du {form.cleaned_data['date_affectation'].strftime('%d/%m/%Y')} au {date_fin_affectation.strftime('%d/%m/%Y')} en tant que {dict(Affectation.ROLE_CHOICES).get(form.cleaned_data['role'])}. +Veuillez consulter votre profil pour plus de détails.""", + destinataires = [employe.user.email] + ) return redirect('gestion_employe:index') else: messages.error(request, "Erreur : Formulaire non valide.") diff --git a/gestion_salle/__pycache__/views.cpython-310.pyc b/gestion_salle/__pycache__/views.cpython-310.pyc index aa6461b..8b47dab 100644 Binary files a/gestion_salle/__pycache__/views.cpython-310.pyc and b/gestion_salle/__pycache__/views.cpython-310.pyc differ diff --git a/gestion_salle/views.py b/gestion_salle/views.py index de589cf..3b81588 100644 --- a/gestion_salle/views.py +++ b/gestion_salle/views.py @@ -5,6 +5,7 @@ from django.contrib.auth.decorators import login_required from django.shortcuts import redirect, render from django.http import JsonResponse, HttpRequest from django.forms import model_to_dict +from fonction_utilitaire import fonctions_utilitaire from gestion_employe.models import Employe from gestion_salle.forms import ReservationForm from .models import Reservation @@ -29,6 +30,8 @@ def index(request:HttpRequest): motif_reservation = form.cleaned_data.get('motif_reservation') besoin_zoom = form.cleaned_data.get('besoin_zoom') besoin_ordi = form.cleaned_data.get('besoin_ordi') + + while date_debut <= date_fin : reservation = Reservation( @@ -46,6 +49,15 @@ def index(request:HttpRequest): date_debut = date_debut + timedelta(days=1) messages.success(request, "Réservation(s) créées avec succès.") + + if fonctions_utilitaire.EMAIL_ASSISTANTE_DE_DIRECTION: + fonctions_utilitaire.envoyer_mail( + sujet = "Reservation de salle", + message = f""" +Une nouvelle demande de réservation de la {dict(Reservation.TYPE_CHOICES).get(salle)} a été effectuée par {employe.user.first_name} {employe.user.last_name} du {form.cleaned_data.get('date_debut').strftime('%d/%m/%Y')} au {form.cleaned_data.get('date_fin').strftime('%d/%m/%Y')} pour motif "{motif_reservation}". +Veuillez vous connecter à la plateforme pour plus de détails.""", + destinataires = list(fonctions_utilitaire.EMAIL_ASSISTANTE_DE_DIRECTION) + ) return redirect('gestion_salle:reservation-salle') formulaire_reservation = ReservationForm() @@ -177,6 +189,13 @@ def valider_reservation(request:HttpRequest): reservation.statut = 'validee' reservation.save() + if fonctions_utilitaire.EMAIL_ASSISTANTE_DE_DIRECTION: + fonctions_utilitaire.envoyer_mail( + sujet = "Reservation de salle", + message = f"""Bonjour {request.user.first_name} {request.user.last_name}, votre reservation de la salle {dict(Reservation.TYPE_CHOICES).get(reservation.salle)} du {reservation.date_debut.strftime('%d/%m/%Y')} au {reservation.date_fin.strftime('%d/%m/%Y')} pour motif "{reservation.motif_reservation}" a été validée. Veuillez vous connecter à la plateforme pour plus de détails.""", + destinataires = [reservation.employe.user.email] + ) + messages.success(request, f"Réservation de {reservation.employe.get_full_name()} validée avec succès.") return redirect('gestion_salle:reservation-salle') @@ -192,4 +211,12 @@ def refuser_reservation(request:HttpRequest): else: reservation.statut = "refusee" reservation.save() + + if fonctions_utilitaire.EMAIL_ASSISTANTE_DE_DIRECTION: + fonctions_utilitaire.envoyer_mail( + sujet = "Reservation de salle", + message = f"""Bonjour {request.user.first_name} {request.user.last_name}, votre reservation de la salle {dict(Reservation.TYPE_CHOICES).get(reservation.salle)} du {reservation.date_debut.strftime('%d/%m/%Y')} au {reservation.date_fin.strftime('%d/%m/%Y')} pour motif "{reservation.motif_reservation}" a été refusée. Veuillez vous connecter à l'Assistante de Direction pour plus de détails.""", + destinataires = [reservation.employe.user.email] + ) + return JsonResponse({"message": "Réservation refusée avec succès."}) \ No newline at end of file