2 Commits

Author SHA1 Message Date
54dc65f0d8 Feat: Envoie de mail à l'équipe informatique après reservation de salle necessitant un lien zoom ou ordinateur
All checks were successful
Organisation/sirh/pipeline/head This commit looks good
2026-09-14 10:42:12 +00:00
Fatimac2804
29a42ee6be feat:Ajout notification email équipe informatique
All checks were successful
Organisation/sirh/pipeline/head This commit looks good
Organisation/sirh/pipeline/pr-main This commit looks good
2026-09-10 12:23:45 +02:00
7 changed files with 43 additions and 24 deletions

View File

@@ -15,6 +15,8 @@ try:
except: except:
pass pass
EMAIL_EQUIPE_INFORMATIQUE = ["support@cerfig.org"]
def solde_conge(employe): def solde_conge(employe):
"""Fonction de calcul du solde de congé restant l'employé""" """Fonction de calcul du solde de congé restant l'employé"""
contrat = Contrat.objects.filter(employe=employe, statut='actif').order_by('-date_debut').first() contrat = Contrat.objects.filter(employe=employe, statut='actif').order_by('-date_debut').first()

View File

@@ -12,27 +12,22 @@
</div> </div>
{% if messages %} {% if messages %}
{% for message in messages %} {% for message in messages %}
<div class="alert alert-{% if message.tags == 'error' %}danger{% else %}success{% endif %} alert-dismissible fade show" role="alert"> <div class="alert alert-{% if message.tags == 'error' %}danger{% else %}success{% endif %} alert-dismissible fade show mt-2" role="alert">
{{ message }} {{ message }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button> <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div> </div>
{% endfor %} {% endfor %}
{% endif %} {% endif %}
{% if not expiration_contrat %} <div class="alert alert-danger fade show alert-dismissible mt-2"> <strong>Important :</strong>
Les informations sur votre contrat n'ont pas été renseignées,
veuillez contacter les ressources humaines. </div>
{% elif contrat_nb_jours_restant > 0 %} <div class="alert alert-danger fade show alert-dismissible mt-2"> <strong>Important :</strong> {% if not has_contrat %}
Votre contrat de travail expire dans <strong>{{ contrat_nb_jours_restant }} jour{{ contrat_nb_jours_restant|pluralize }}</strong>, <div class="alert alert-danger mt-2">
veuillez contacter les ressources humaines. </div> <strong>Important :</strong> Les informations sur votre contrat n'ont pas été renseignées, veuillez contacter les ressources humaines.
</div>
{% elif contrat_nb_jours_restant == 0 %} <div class="alert alert-danger fade show alert-dismissible mt-2"> <strong>Important :</strong> {% elif expiration_contrat %}
Votre contrat de travail <strong>expire aujourd'hui</strong>. <div class="alert alert-warning mt-2">
Veuillez contacter les ressources humaines. </div> <strong>Important :</strong> Votre contrat de travail expire dans {{ contrat_nb_jours_restant }} jours, veuillez contacter les ressources humaines.
</div>
{% elif contrat_nb_jours_restant < 0 %} <div class="alert alert-danger fade show alert-dismissible mt-2"> <strong>Important :</strong>
Votre contrat de travail est <strong>déjà expiré</strong>.
Veuillez contacter les ressources humaines. </div>
{% endif %} {% endif %}
<div class="accordion mt-2" id="accordionInformationEmploye"> <div class="accordion mt-2" id="accordionInformationEmploye">
@@ -132,7 +127,7 @@ Veuillez contacter les ressources humaines. </div>
</div> </div>
<div class="form-group mb-2"> <div class="form-group mb-2">
<label>Statut :</label> <label>Statut :</label>
<input type="text" class="form-control" value="{{ contrat.statut }}" id="statut" readonly> <input type="text" class="form-control" value="{{ contrat.statut }}" id="satut" readonly>
</div> </div>
<div class="form-group mb-2"> <div class="form-group mb-2">
<label>fichier :</label> <label>fichier :</label>

View File

@@ -3,8 +3,8 @@ from datetime import datetime, timedelta
import requests import requests
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
from decouple import config
from django.contrib import messages from django.contrib import messages
from django.contrib.auth import logout
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib.auth.password_validation import validate_password from django.contrib.auth.password_validation import validate_password
@@ -27,6 +27,18 @@ def index(request):
if not request.user.groups.filter(name="ressource_humaine").exists(): if not request.user.groups.filter(name="ressource_humaine").exists():
return redirect('gestion_employe:mon-profil') return redirect('gestion_employe:mon-profil')
response = requests.get(f"{config('SERVEUR_AUTHENTIFICATION')}recuperer-list-departement/")
if response.status_code == 200:
try:
departements_data = response.json()
for dept in departements_data:
Departement.objects.update_or_create(
nom = dept['nom']
)
except json.JSONDecodeError as e:
print(f"[ERROR] Erreur lors du décodage JSON : {e}")
employes = Employe.objects.all().order_by('-user__date_joined') employes = Employe.objects.all().order_by('-user__date_joined')
nombre_employes = Employe.objects.count() nombre_employes = Employe.objects.count()
nombre_cps = Contrat.objects.filter(type_contrat='contrat_prestation').count() nombre_cps = Contrat.objects.filter(type_contrat='contrat_prestation').count()
@@ -521,7 +533,7 @@ def modifier_mot_passe(request):
} }
response = requests.post( response = requests.post(
"http://localhost:8000/modifier-mot-de-passe/", f"{config('SERVEUR_AUTHENTIFICATION')}modifier-mot-de-passe/",
json=donnees, json=donnees,
headers=headers headers=headers
) )

View File

@@ -16,7 +16,7 @@ from .models import Reservation
@login_required @login_required
def index(request: HttpRequest): def index(request: HttpRequest):
"""Vue d'affichage de la page d'accueil de la gestion des salles"""
try: try:
employe = Employe.objects.get(user=request.user) employe = Employe.objects.get(user=request.user)
except Employe.DoesNotExist: except Employe.DoesNotExist:
@@ -37,11 +37,11 @@ def index(request: HttpRequest):
besoin_ordi = form.cleaned_data['besoin_ordi'] besoin_ordi = form.cleaned_data['besoin_ordi']
if date_fin < date_debut: if date_fin < date_debut:
messages.error(request, "Date fin invalide.") messages.error(request, "La date de fin est antérieure à la date de début.")
return redirect('gestion_salle:reservation-salle') return redirect('gestion_salle:reservation-salle')
if heure_fin <= heure_debut: if heure_fin <= heure_debut:
messages.error(request, "Heure invalide.") messages.error(request, "L'heure de fin est antérieure à l'heure de début.")
return redirect('gestion_salle:reservation-salle') return redirect('gestion_salle:reservation-salle')
if not request.user.first_name.strip() or not request.user.last_name.strip(): if not request.user.first_name.strip() or not request.user.last_name.strip():
@@ -55,7 +55,6 @@ def index(request: HttpRequest):
current_date = date_debut current_date = date_debut
while current_date <= date_fin: while current_date <= date_fin:
reservation = Reservation.objects.create( reservation = Reservation.objects.create(
employe=employe, employe=employe,
date_debut=current_date, date_debut=current_date,
@@ -74,16 +73,27 @@ def index(request: HttpRequest):
messages.success(request, "Réservation(s) créée(s) avec succès.") messages.success(request, "Réservation(s) créée(s) avec succès.")
if fonctions_utilitaire.EMAIL_ASSISTANTE_DE_DIRECTION: if fonctions_utilitaire.EMAIL_ASSISTANTE_DE_DIRECTION and salle != "lien_zoom":
fonctions_utilitaire.envoyer_mail( fonctions_utilitaire.envoyer_mail(
sujet = "Reservation de salle", sujet = "Reservation de salle",
message = f""" message = f"""Bonjour,
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}". 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}".
Veuillez vous connecter à la plateforme pour plus de détails.""", Veuillez vous connecter à la plateforme pour plus de détails.""",
destinataires = fonctions_utilitaire.EMAIL_ASSISTANTE_DE_DIRECTION destinataires = fonctions_utilitaire.EMAIL_ASSISTANTE_DE_DIRECTION
) )
if (salle == "lien_zoom" or besoin_zoom or besoin_ordi) and fonctions_utilitaire.EMAIL_EQUIPE_INFORMATIQUE:
fonctions_utilitaire.envoyer_mail(
sujet="Demande de lien Zoom",
message=f"""Bonjour,
Une nouvelle demande de réservation de salle nécessitant un lien Zoom a été effectuée par {employe.user.first_name} {employe.user.last_name} du {date_debut.strftime('%d/%m/%Y')} au {date_fin.strftime('%d/%m/%Y')} de {heure_debut.strftime('%H:%M')} a {heure_fin.strftime('%H:%M')} pour le motif {motif}
Veuillez vous connecter à la plateforme pour plus de détails.""",
destinataires=fonctions_utilitaire.EMAIL_EQUIPE_INFORMATIQUE
)
return redirect('gestion_salle:reservation-salle') return redirect('gestion_salle:reservation-salle')
formulaire_reservation = ReservationForm() formulaire_reservation = ReservationForm()
departement = employe.departement departement = employe.departement