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..577808e 100644 --- a/SIRH/settings.py +++ b/SIRH/settings.py @@ -12,6 +12,7 @@ https://docs.djangoproject.com/en/5.2/ref/settings/ import os from pathlib import Path + from decouple import config # Build paths inside the project like this: BASE_DIR / 'subdir'. @@ -150,6 +151,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 4beb01a..94a89d0 100644 --- a/fonction_utilitaire/fonctions_utilitaire.py +++ b/fonction_utilitaire/fonctions_utilitaire.py @@ -1,4 +1,9 @@ from django.utils import timezone +<<<<<<< HEAD +======= +from gestion_employe.models import Contrat, Employe +from gestion_conge.models import Conge +>>>>>>> bb93a85 (Gestion de l'envoie des mails) from gestion_conge.models import Conge from gestion_employe.models import Contrat @@ -7,6 +12,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 +37,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 adc7aa4..d2c32e7 100644 --- a/gestion_conge/views.py +++ b/gestion_conge/views.py @@ -87,7 +87,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, @@ -126,6 +125,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 10de90c..528c9f9 100644 --- a/gestion_employe/views.py +++ b/gestion_employe/views.py @@ -1,10 +1,6 @@ import json -<<<<<<< HEAD from datetime import datetime, timedelta -======= -from datetime import date, timedelta, datetime ->>>>>>> 99434a2 (Fonctionnalite: verifier qu'aucun contrat n'est actif avant la creation d'un nouveau pour un employe) from dateutil.relativedelta import relativedelta from django.contrib import messages from django.contrib.auth import authenticate @@ -114,6 +110,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 a4a3f7c..e5bbbe3 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