From bb93a853db7b692da9d0a15c9fabf0ff28d081f0 Mon Sep 17 00:00:00 2001 From: Soriba SYLLA Date: Thu, 7 May 2026 11:22:14 +0000 Subject: [PATCH] Gestion de l'envoie des mails --- SIRH/__pycache__/settings.cpython-310.pyc | Bin 3074 -> 3074 bytes SIRH/settings.py | 1 + .../fonctions_utilitaire.cpython-310.pyc | Bin 1376 -> 2234 bytes fonction_utilitaire/fonctions_utilitaire.py | 27 ++++++++++++++++-- .../__pycache__/urls.cpython-310.pyc | Bin 554 -> 554 bytes .../__pycache__/views.cpython-310.pyc | Bin 5896 -> 6196 bytes gestion_conge/views.py | 8 +++++- .../__pycache__/views.cpython-310.pyc | Bin 14032 -> 14436 bytes gestion_employe/views.py | 7 +++++ .../__pycache__/views.cpython-310.pyc | Bin 6129 -> 7366 bytes gestion_salle/views.py | 27 ++++++++++++++++++ 11 files changed, 67 insertions(+), 3 deletions(-) diff --git a/SIRH/__pycache__/settings.cpython-310.pyc b/SIRH/__pycache__/settings.cpython-310.pyc index f05b619bb6e9253dc5af3b4d12457e43145af399..430e45201a8f929e69e03deb74b9e94c7b355b9b 100644 GIT binary patch delta 38 jcmZpYXp-Q~=jG*M0D_ZYe=_|x@;>9{XJ%nUKn_L#q>BcR delta 38 jcmZpYXp-Q~=jG*M0D}Ca-yi@MtN91ELZYIeq#}xVZ!g3oqnS5v-n`G>d#`IRH@aD)QL}J8 znEe&1s%5>Q$LGtz$4xwX`mB3)k%*CC7Fb}%PU4PSrk5@H9mw&j!l@QWI4&wk}v8rEtT)fBnac-k`-bS z2j=_fzFZqKbbn~O-yIS6o$ z9Q=0?gUXXLxBn@j4cjt(oP}+WZK^^sbci*sX_+u6J8-?={+`i};^hiL2QStO0x zr0)hujbQ>4Alh1y6SW{i^*@w6%J~4Hr(hRQLAQ{2++&<`#+kswS?z=R9>rrS>C@uK z5P&6kSCN@pk)<5N2E=i-W$Z{q4)Fx*5nmiK#2XH`*qn$1)@Mlt10pSY7CE$=q<{CKH{IFEIZ(?A)S$aG-}G5$qP zl!w7o14+MARX^ZeoIgQxXE4|s40rm&o_`DX-oxJRaPNL!T_yuT)1$*xlYTZRi1t^3%?aptO6bek{7*3@^r&8@e=@K7J9MNePnQek@)m0`@wd8$ zf_`T+|5IGzO60G^mP;K_+xa_j6{rWR1l5o9yh4QLzU*J=;Ij!>B~-nhWH5{64eGEa Wxo0(*$Am3#1Oz+Bs=RvEYkUMnP9By3 delta 319 zcmdlb_<&10pO=@50SN9S{?7cs!octt#6bp3K#l_t7duSUmP}=2NMT4}&SA-Ajba6| zS)$ldSfkie*rGU6*rPa8I8r!U7^1jRxPlopxnF{e(PX^EQIeUPT9u!d3S_f8=jW9a zC6)l0tUzXZ>PtDGqL&;X!UjY{0g26$j1w3cxhAh-s$>%Y@{0r}Ycl&XicKzOp1{a6 znS&*Uk!5l!iz!gaY!+=9h!T)G5g>7kyEs25B{e=7WIFfcM=a{>sz6~sP43BO*bOE# za)`45y~$9dI9ZOv!Wtx1gfIZi0-M5NlbfGXnv-hB2vkuF66ayyVdPaX(i}kiCxx$r&drDf1!s}YkwR{*Tqbiglw`-et>m* zDnc(_b}oVx+LIJdCE`JkJ@^-R$<;r?i-I!|>M-v!@5lE&9?X8{^P(21>Xg9F?d-Sr zqjjPU5Y%agu8VD;pU|!~N#wEME6mhAaknzA9BM}bnb2GH^?S&lb~RTYgD?5!2f;N; zZ-#k|gKB~fts|k#GzVY_?)i5T2+28D+Jlv|*SU~?tiOeYw83_`i--Nt#WuSyqi}F~ zyo2sUp&zBhF2GK=nWSxJ6S=)+ui?}S0=&b8aT+9;*jbbiY>!B^?FIITH;sZc=EL06 z!Sy{Cvvy;f{l-tX-&CiR74S)U_k8;sv(hViplnz;ezZb%*~9!3?)!nlW+5F&Q?YyO_9mGJk68u@%XbP0!=SA zm~70e&&I*X!BiBsxrkSenfVr@!sMv}O7cNK>7qao;R7Tzd5b{KDG~<}dO%|GJRWiO zq9_nIX!3IbS#GdWUJ&1BGQXfULjV8( 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 4d272bcfd219e3ae3f20e6271ca7d5cecfdf2397..09b99be5081078aaafd22170d25b242d466bd062 100644 GIT binary patch delta 2263 zcmaKteQZ-z6u^65KlZk@1NPCa-MT&2cBA{~#x@ZI6&aggz$pw8-b_Sizm{lZUex!I)f(B5NQ-O4vLP;alJdUMRi2!iafy30R={d~ zs2G!~F0$}-4Q!t|ZKKq_=3z;a^Pv0>Tk3q;*6t)h>{{E|gh(t=Vn>fJ0UCQ*vY zzL1xBP$>#`jisanW}D7FL9sr?D229$Uy^8BkVR1Ru}DOs3Llker|b(#bg}BQs%1q} zTjR2p<&90N6}^P6aNX3O?`Kw{)<`&#O|poQ{c?9RbQ$n+R#UEyfLbFvW%REBI`mj1RH8>$(Yqa$X+;5xQgt8TZPtY5Bj}_ z*vp`Bjce&)934R%MeIhX)pbEb(IWB#Y$+;drFiW&I9v21*#!G+3taor>j2^)A{$YK zSb~_m<$v2&*nVZoDEiD~rTckrVMltg)IlQfd#Q`l5U|>t$+@K0UQK4Uqj>;vf9;1Hb67Fsj*ZJbsGYJ`_|8pR z#z$!Q7;zqfsa;xHhw>mSE-HW>&O+jVA*Y>;CNDU5am7Bg^&lQ@W%@MJJqdw1b>u}D zoO9Uv3Hp4B_zdwmVj*G-Hn`lR8Fst+$Z?oaQJZ%h)mFq~6JB3JYegk_9$u|*kZo|Z zVqG(4c5$=`T|Puivw)3+9SF~i1`WrV?-}mV=g?E#O|`-hEUmP+;(b&yMJeK?vJ{j; zGJUWSYPYL>k1bC>Kuq*2+Z=4-RNLYOXk{zvLd_tYuM~SzIdJ?n;w{AghsMv(gZNXT zQ|vVtpE?kHmFXZtEk}J$#&L+%(6111sLDp>!Dv-KxdhKt|728eKfWN%^bE{*yV#X% zcegL~pmRO~ZPWH%>N=t|6M+rq(xn!nroRAuO+D#_MKvYlGQ0TSG>oC&eDu@OERj8He#&d;XhvbVlZACOqNvy4#$=@DII`By&3m{~d;%L33fmowIV% zRmZsM`aCF2SCM)+*w@3UzE+Grv8^*qgX$NMUVv}w%Gj&@N1dJA05aDG4fUg$S25c6 zh-+}Weu3jZGoC~rHN|x(F1F0T56pw;C*aiv8?P`QR|DOjJlYT>OJtm}1F;7&ggAyc eg&0AcLyRIWAuc1XAZ{QOXq~r)JPs%3mHi9WQ8Y*Z delta 1793 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 S(?Jq5)C5?Yffd1(Ab$hJR@`F% 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