diff --git a/fonction_utilitaire/__pycache__/fonctions_utilitaire.cpython-310.pyc b/fonction_utilitaire/__pycache__/fonctions_utilitaire.cpython-310.pyc
index 7e69ba4..348df85 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 9daa4ac..f751c88 100644
--- a/fonction_utilitaire/fonctions_utilitaire.py
+++ b/fonction_utilitaire/fonctions_utilitaire.py
@@ -15,7 +15,20 @@ try:
except:
pass
-EMAIL_EQUIPE_INFORMATIQUE = ["support@cerfig.org"]
+try:
+ EMAIL_EQUIPE_INFORMATIQUE = list(
+ Employe.objects.filter(departement__nom="Systeme informatique").values_list('user__email', flat=True)
+ ) or ["support@cerfig.org"]
+except:
+ EMAIL_EQUIPE_INFORMATIQUE = ["support@cerfig.org"]
+
+def est_equipe_informatique(employe):
+ """Vérifie si un employé appartient au département informatique"""
+ return employe.departement and employe.departement.nom == "Systeme informatique"
+
+def est_assistante_direction(employe):
+ """Vérifie si un employé est l'assistante de direction"""
+ return employe.fonction == "assistant_direction"
def solde_conge(employe):
"""Fonction de calcul du solde de congé restant l'employé"""
@@ -60,4 +73,4 @@ def envoyer_mail(sujet, message, destinataires):
settings.EMAIL_HOST_USER,
destinataires,
fail_silently=False,
- )
+ )
\ No newline at end of file
diff --git a/gestion_conge/__pycache__/views.cpython-310.pyc b/gestion_conge/__pycache__/views.cpython-310.pyc
index a871557..2ad7522 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_salle/__pycache__/admin.cpython-310.pyc b/gestion_salle/__pycache__/admin.cpython-310.pyc
index b6fbb6b..b327f4a 100644
Binary files a/gestion_salle/__pycache__/admin.cpython-310.pyc and b/gestion_salle/__pycache__/admin.cpython-310.pyc differ
diff --git a/gestion_salle/__pycache__/models.cpython-310.pyc b/gestion_salle/__pycache__/models.cpython-310.pyc
index 46d0b9d..e6b5052 100644
Binary files a/gestion_salle/__pycache__/models.cpython-310.pyc and b/gestion_salle/__pycache__/models.cpython-310.pyc differ
diff --git a/gestion_salle/__pycache__/views.cpython-310.pyc b/gestion_salle/__pycache__/views.cpython-310.pyc
index 0d35d66..c114dd9 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/admin.py b/gestion_salle/admin.py
index ea5d68b..f124422 100644
--- a/gestion_salle/admin.py
+++ b/gestion_salle/admin.py
@@ -1,3 +1 @@
from django.contrib import admin
-
-# Register your models here.
diff --git a/gestion_salle/static/gestion_salle/js/index.js b/gestion_salle/static/gestion_salle/js/index.js
index b9b7f80..7770404 100644
--- a/gestion_salle/static/gestion_salle/js/index.js
+++ b/gestion_salle/static/gestion_salle/js/index.js
@@ -92,9 +92,6 @@ $("bouton-annuler").addEventListener("click", (e) => {
const csrf = document.querySelector("[name=csrfmiddlewaretoken]").value;
const url_annuler = $("formulaire-details").dataset.urlannuler;
- console.log("URL d'annulation :");
- console.log($("formulaire-details"))
-
e.preventDefault();
fetch(
diff --git a/gestion_salle/templates/gestion_salle/parts/modalDetailResevation.html b/gestion_salle/templates/gestion_salle/parts/modalDetailResevation.html
index b39d80d..cba39ec 100644
--- a/gestion_salle/templates/gestion_salle/parts/modalDetailResevation.html
+++ b/gestion_salle/templates/gestion_salle/parts/modalDetailResevation.html
@@ -51,13 +51,17 @@
- {% if appartient_au_departement_informatique %}
+ {% if est_equipe_informatique %}
{% endif %}
- {% if appartient_direction %}
+ {% if est_assistante_direction %}
{% endif %}
+ {% if est_equipe_informatique %}
+
+
+ {% endif %}
@@ -65,4 +69,4 @@
-
+
\ No newline at end of file
diff --git a/gestion_salle/views.py b/gestion_salle/views.py
index 065fea8..0b3d05c 100644
--- a/gestion_salle/views.py
+++ b/gestion_salle/views.py
@@ -3,6 +3,7 @@ from datetime import timedelta
from django.contrib import messages
from django.contrib.auth.decorators import login_required
+from django.db.models import Q
from django.forms import model_to_dict
from django.http import HttpRequest, JsonResponse
from django.shortcuts import redirect, render
@@ -23,6 +24,9 @@ def index(request: HttpRequest):
messages.error(request, "Profil employé introuvable.")
return redirect('gestion_conges:conge')
+ est_equipe_info = fonctions_utilitaire.est_equipe_informatique(employe)
+ est_assistante = fonctions_utilitaire.est_assistante_direction(employe)
+
if request.method == "POST":
form = ReservationForm(request.POST)
@@ -54,6 +58,8 @@ def index(request: HttpRequest):
created = []
current_date = date_debut
+ print(f"Création de réservations pour {employe}")
+
while current_date <= date_fin:
reservation = Reservation.objects.create(
employe=employe,
@@ -73,29 +79,35 @@ def index(request: HttpRequest):
messages.success(request, "Réservation(s) créée(s) avec succès.")
- if fonctions_utilitaire.EMAIL_ASSISTANTE_DE_DIRECTION and salle != "lien_zoom":
+ # Nouvelle logique d'envoi de mails à la création :
+ # 1. Une demande de salle (formation/réunion) est envoyée à l'assistante de direction pour validation.
+ # - Si elle nécessite un lien Zoom ou un ordinateur, l'équipe informatique sera notifiée
+ # seulement après la validation par l'assistante.
+ # 2. Une demande de lien Zoom directement est envoyée à l'équipe informatique.
+ if salle != "lien_zoom" and fonctions_utilitaire.EMAIL_ASSISTANTE_DE_DIRECTION:
fonctions_utilitaire.envoyer_mail(
- sujet = "Reservation de salle",
- message = f"""Bonjour,
+ sujet="Demande de réservation de salle",
+ 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}".
+{"Cette demande nécessite un lien Zoom et/ou un ordinateur et sera traitée par l'équipe informatique après votre validation." if besoin_zoom or besoin_ordi else ""}
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:
+ if salle == "lien_zoom" 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}
+Une nouvelle demande de 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')} à {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
+Veuillez vous connecter à la plateforme pour traiter cette demande.""",
+ destinataires=fonctions_utilitaire.EMAIL_EQUIPE_INFORMATIQUE
)
return redirect('gestion_salle:reservation-salle')
formulaire_reservation = ReservationForm()
- departement = employe.departement
+ # departement = employe.departement
liste_demande_reservation = Reservation.objects.filter(
employe=employe,
@@ -105,8 +117,9 @@ Veuillez vous connecter à la plateforme pour plus de détails.""",
context = {
'formulaire_reservation': formulaire_reservation,
'nb_reservation_attente': Reservation.objects.filter(statut='en_attente').count(),
- 'appartient_au_departement_informatique': departement and departement.nom == "Systeme informatique",
- 'appartient_direction': request.user.groups.filter(name='direction').exists(),
+ 'appartient_au_departement_informatique': est_equipe_info,
+ 'est_assistante_direction': est_assistante,
+ 'est_equipe_informatique': est_equipe_info,
'liste_demande_reservation': list(liste_demande_reservation),
}
@@ -118,7 +131,6 @@ def liste_reservation(request:HttpRequest):
liste_reservation = []
for reservation in reservations:
- print(reservation.statut)
color = None
if reservation.statut == "en_attente":
color = "#ffc107"
@@ -127,8 +139,6 @@ def liste_reservation(request:HttpRequest):
else:
color = "#dc3545"
- print(dict(Reservation.TYPE_CHOICES).get(reservation.salle))
-
liste_reservation.append({
"guid": reservation.pk,
"title": dict(Reservation.TYPE_CHOICES).get(reservation.salle),
@@ -141,7 +151,35 @@ def liste_reservation(request:HttpRequest):
@login_required
def liste_reservation_attente(request):
+ """Liste des réservations en attente, filtrée selon le profil :
+ - Assistante de direction : voit les salles à valider (pas les liens choisis).
+ - Équipe informatique : voit les liens choisis et les salles demandant zoom/ordi non traités.
+ """
+ try:
+ employe = Employe.objects.get(user=request.user)
+ except Employe.DoesNotExist:
+ return JsonResponse({"success": False, "message": "Profil employé introuvable"})
+
+ est_informatique = fonctions_utilitaire.est_equipe_informatique(employe)
+ est_assistante = fonctions_utilitaire.est_assistante_direction(employe)
+
reservations = Reservation.objects.filter(statut="en_attente")
+
+ if est_assistante:
+ # L'assistante voit les demandes de salle (formation / réunion)
+ # Elle ne reçoit pas les demandes de simple lien (lien_zoom) qui vont à l'équipe info.
+ reservations = reservations.exclude(salle="lien_zoom")
+ elif est_informatique:
+ # L'équipe informatique voit :
+ # - les demandes de lien zoom directs
+ # - les demandes de salle avec besoin_zoom ou besoin_ordi (déjà validés par l'assistance)
+ # pour lesquelles le lien_zoom n'a pas encore était fourni (lien_zoom vide)
+ reservations = reservations.filter(
+ Q(salle="lien_zoom") | Q(besoin_zoom=True) | Q(besoin_ordi=True)
+ )
+
+ print("Test :", [reservation.employe for reservation in reservations])
+
liste_reservation = [
{
**model_to_dict(reservation),
@@ -177,49 +215,99 @@ def detail_reservation(request:HttpRequest, reservation_id:int):
@login_required
def ajouter_lien_zoom(request:HttpRequest):
- """Vue de gestion de l'ajout du lien zoom"""
- if request.method == 'POST':
- reservation_id= request.POST['id_reservation']
- try:
- reservation = Reservation.objects.get(id=reservation_id)
- except reservation.DoesNotExist:
- messages.error(request, "La resevertion selectionné n'existe pas.")
- return redirect("salle")
-
- if not (reservation.besoin_zoom or reservation.salle == "lien_zoom"):
- messages.error(request, "Cette réservation ne nécessite pas de lien Zoom.")
- return redirect('gestion_salle:reservation-salle')
- elif reservation.statut in ["annulee", "refusee"]:
- messages.error(request, "Le lien Zoom ne peut être ajouté pour les réservations annulée ou refusée.")
- return redirect('gestion_salle:reservation-salle')
+ """Traitement de la réservation par l'équipe informatique :
+ - Ajoute lien zoom si demandé.
+ - Valide une réservation qui exigeait un traitement par l'équipe informatique.
+ - Envoie un mail à toutes les équipes et au demandeur après validation.
+ """
+ reservation = None
- if request.method == "POST":
- lien = request.POST.get("lien_zoom")
- reservation.lien_zoom = lien
- reservation.statut = "validee"
+ if request.method == 'POST':
+ reservation_id = request.POST.get('id_reservation')
+ try:
+ reservation = Reservation.objects.get(id=reservation_id)
+ except (Reservation.DoesNotExist, ValueError):
+ messages.error(request, "La réservation sélectionnée n'existe pas.")
+ return redirect('gestion_salle:reservation-salle')
+
+ try:
+ employe = Employe.objects.get(user=request.user)
+ except Employe.DoesNotExist:
+ messages.error(request, "Profil employé introuvable.")
+ return redirect('gestion_salle:reservation-salle')
+
+ # Vérification : seule l'équipe informatique peut traiter ces demandes
+ if not fonctions_utilitaire.est_equipe_informatique(employe):
+ messages.error(request, "Vous n'êtes pas autorisé à traiter cette demande.")
+ return redirect('gestion_salle:reservation-salle')
+
+ if reservation.salle == "lien_zoom" or reservation.besoin_zoom:
+ lien = request.POST.get("lien_zoom")
+ if not lien:
+ messages.error(request, "Veuillez fournir un lien Zoom.")
+ return redirect('gestion_salle:reservation-salle')
+ reservation.lien_zoom = lien
+
+ reservation.statut = "validee"
reservation.save()
- messages.success(request, "Le lien Zoom a été ajouté et la réservation a été validée. ")
+ messages.success(request, "La demande a été traitée et validée. ")
+
+ # Mail au demandeur
+ fonctions_utilitaire.envoyer_mail(
+ sujet="Réservation traitée",
+ message=f"""Bonjour {reservation.employe.user.first_name} {reservation.employe.user.last_name}, votre demande de {dict(Reservation.TYPE_CHOICES).get(reservation.salle)}{' avec lien Zoom' if reservation.lien_zoom else ''} a été traitée. Veuillez vous connecter à la plateforme pour plus de détails.""",
+ destinataires=[reservation.employe.user.email]
+ )
+
+ # Mail aux emails de l'équipe informatique (hors utilisateur courant)
+ autres_membres = Employe.objects.filter(departement__nom="Systeme informatique").exclude(id=employe.id).values_list('user__email', flat=True)
+ if autres_membres:
+ fonctions_utilitaire.envoyer_mail(
+ sujet="Réservation validée par l'équipe informatique",
+ message=f"""Bonjour,
+La réservation {dict(Reservation.TYPE_CHOICES).get(reservation.salle)} du {reservation.date_debut.strftime('%d/%m/%Y')} pour {reservation.employe.user.first_name} {reservation.employe.user.last_name} a été traitée et validée par {employe.user.first_name} {employe.user.last_name}.\n\nVeuillez vous connecter à la plateforme pour plus de détails.""",
+ destinataires=list(autres_membres)
+ )
+
return redirect('gestion_salle:reservation-salle')
@login_required
def annuler_reservation(request:HttpRequest):
- """Vue de gestion de l'annulation de la reservation"""
+ """Vue de gestion de l'annulation de la reservation, réservée à l'employé demandeur ou aux validateurs."""
if request.method == 'POST':
reservation_id= request.POST['id_reservation']
try:
reservation = Reservation.objects.get(id=reservation_id)
except Reservation.DoesNotExist:
- messages.error(request, "La resevertion selectionné n'existe pas.")
- return redirect("salle")
-
+ messages.error(request, "La reservation selectionné n'existe pas.")
+ return redirect("gestion_salle:reservation-salle")
+
+ try:
+ employe = Employe.objects.get(user=request.user)
+ except Employe.DoesNotExist:
+ messages.error(request, "Profil employé introuvable.")
+ return redirect("gestion_salle:reservation-salle")
+
+ # Seul l'employé demandeur ou un validateur (assistante / équipe info) peut annuler
+ est_demandeur = reservation.employe == employe
+ est_validateur = fonctions_utilitaire.est_assistante_direction(employe) or fonctions_utilitaire.est_equipe_informatique(employe)
+
+ if not est_demandeur and not est_validateur:
+ messages.error(request, "Vous n'êtes pas autorisé à annuler cette réservation.")
+ return redirect('gestion_salle:reservation-salle')
+
reservation.statut = 'annulee'
reservation.save()
- messages.success(request, "Votre réservation a été annulée.")
+ messages.success(request, "La réservation a été annulée.")
return redirect('gestion_salle:reservation-salle')
@login_required
def valider_reservation(request: HttpRequest):
- """Validation d'une réservation"""
+ """Validation d'une réservation selon le profil :
+ - Assistante de direction : valide les demandes de salles (sauf lien_zoom) ;
+ - Équipe informatique : valide les demandes de lien_zoom et les
+ demandes de salle avec besoin zoom/ordi restées en attente après la première correction.
+ """
if request.method == 'POST':
reservation_id = request.POST.get('id_reservation')
@@ -227,37 +315,122 @@ def valider_reservation(request: HttpRequest):
reservation = Reservation.objects.get(id=reservation_id)
except Reservation.DoesNotExist:
messages.error(request, "La réservation sélectionnée n'existe pas.")
- return redirect("salle")
+ return redirect('gestion_salle:reservation-salle')
- reservation.statut = 'validee'
- reservation.save()
+ try:
+ employe = Employe.objects.get(user=request.user)
+ except Employe.DoesNotExist:
+ messages.error(request, "Profil employé introuvable.")
+ return redirect('gestion_salle:reservation-salle')
- fonctions_utilitaire.envoyer_mail(
- sujet = "Reservation de salle",
- message = f"""Bonjour {reservation.employe.user.first_name} {reservation.employe.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]
- )
+ est_assistante = fonctions_utilitaire.est_assistante_direction(employe)
+ est_equipe_info = fonctions_utilitaire.est_equipe_informatique(employe)
- messages.success(request, f"La réservation de {request.user.first_name} {request.user.last_name} validée avec succès.")
+ if est_assistante:
+ # L'assistante ne doit pas traiter les simple lien_zoom
+ if reservation.salle == "lien_zoom":
+ messages.error(request, "Les demandes de lien Zoom sont traitées par l'équipe informatique.")
+ return redirect('gestion_salle:reservation-salle')
+
+ if reservation.besoin_zoom or reservation.besoin_ordi:
+ # La demande reste en attente, l'équipe informatique doit être notifiée
+ # L'assistante a donné sa validation "salle", on garde le statut "en_attente"
+ # pour que l'équipe informatique puisse traiter, et on envoie le mail à l'équipe.
+ if fonctions_utilitaire.EMAIL_EQUIPE_INFORMATIQUE:
+ fonctions_utilitaire.envoyer_mail(
+ sujet="Réservation de salle à traiter par l'équipe informatique",
+ message=f"""Bonjour,
+L'assistante de direction a validé la réservation de la salle {dict(Reservation.TYPE_CHOICES).get(reservation.salle)} pour {reservation.employe.user.first_name} {reservation.employe.user.last_name} le {reservation.date_debut.strftime('%d/%m/%Y')} (de {reservation.heure_debut.strftime('%H:%M')} à {reservation.heure_fin.strftime('%H:%M')}).
+Cette demande nécessite {"un lien zoom" if reservation.besoin_zoom else ""}{" - un ordinateur" if reservation.besoin_ordi else ""}.
+
+Veuillez vous connecter à la plateforme pour traiter cette demande.""",
+ destinataires=fonctions_utilitaire.EMAIL_EQUIPE_INFORMATIQUE
+ )
+
+ messages.success(request, "Réservation validée, une demande a été envoyée à l'équipe informatique.")
+ reservation.statut = "en_attente" # reste en attente pour l'équipe info
+ reservation.save()
+ else:
+ # Validation directe sans traitement informatique
+ reservation.statut = "validee"
+ reservation.save()
+ fonctions_utilitaire.envoyer_mail(
+ sujet="Réservation de salle validée",
+ message=f"""Bonjour {reservation.employe.user.first_name} {reservation.employe.user.last_name}, votre réservation de la {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]
+ )
+
+ elif est_equipe_info:
+ # L'équipe informatique traite le reste : lien_zoom et besoins info
+ if reservation.salle == "lien_zoom" or reservation.besoin_zoom or reservation.besoin_ordi:
+ if reservation.besoin_zoom and not reservation.lien_zoom:
+ # La demande exige un lien zoom qui n'a pas été encore rempli,
+ # il est préférable de passer par ajouter_lien_zoom. On laisse traiter.
+ messages.success(request, "Veuillez ajouter le lien Zoom via le champs dédié.")
+ return redirect('gestion_salle:reservation-salle')
+
+ reservation.statut = "validee"
+ reservation.save()
+
+ # Mail au demandeur + autres membres de l'équipe
+ fonctions_utilitaire.envoyer_mail(
+ sujet="Réservation validée",
+ message=f"""Bonjour {reservation.employe.user.first_name} {reservation.employe.user.last_name}, votre demande de {dict(Reservation.TYPE_CHOICES).get(reservation.salle)} a été traitée et validée. Veuillez vous connecter pour plus de détails.""",
+ destinataires=[reservation.employe.user.email]
+ )
+
+ autres = Employe.objects.filter(departement__nom="Systeme informatique").exclude(id=employe.id).values_list('user__email', flat=True)
+ if autres:
+ fonctions_utilitaire.envoyer_mail(
+ sujet="Réservation traitée par un collègue",
+ message=f"""Bonjour {request.user.first_name} {request.user.last_name}, la demande de {dict(Reservation.TYPE_CHOICES).get(reservation.salle)} du {reservation.date_debut.strftime('%d/%m/%Y')} pour {reservation.employe.user.first_name} {reservation.employe.user.last_name} a été traitée et validée par {employe.user.first_name} {employe.user.last_name}. Veuillez vous connecter pour plus de détails.""",
+ destinataires=list(autres)
+ )
+ else:
+ messages.error(request, "Cette réservation ne relève pas de l'équipe informatique.")
+ return redirect('gestion_salle:reservation-salle')
+ else:
+ messages.error(request, "Vous n'êtes pas autorisé à effectuer cette validation.")
+ return redirect('gestion_salle:reservation-salle')
+
+ messages.success(request, f"La réservation de {request.user.first_name} {request.user.last_name} a été validée avec succès.")
return redirect('gestion_salle:reservation-salle')
@login_required
def refuser_reservation(request:HttpRequest):
- """Vue de gestion de refus de la reservation"""
+ """Vue de gestion de refus de la reservation, autorisée à l'assistant de direction
+ et l'équipe informatique selon le type de demande."""
data = json.loads(request.body)
reservation_id = data.get("id_reservation")
try:
reservation = Reservation.objects.get(id=reservation_id)
except Reservation.DoesNotExist:
- return JsonResponse({"message": "La resevertion selectionné n'existe pas."})
- else:
- reservation.statut = "refusee"
- reservation.save()
+ return JsonResponse({"message": "La reservation selectionné n'existe pas."})
- 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]
- )
+ try:
+ employe = Employe.objects.get(user=request.user)
+ except Employe.DoesNotExist:
+ return JsonResponse({"message": "Profil employé introuvable."})
- return JsonResponse({"message": "Réservation refusée avec succès."})
+ est_assistante = fonctions_utilitaire.est_assistante_direction(employe)
+ est_equipe_info = fonctions_utilitaire.est_equipe_informatique(employe)
+
+ peut_refuser = False
+ if est_assistante and reservation.salle != "lien_zoom":
+ peut_refuser = True
+ elif est_equipe_info and (reservation.salle == "lien_zoom" or reservation.besoin_zoom or reservation.besoin_ordi):
+ peut_refuser = True and (not reservation.besoin_zoom or reservation.lien_zoom)
+
+ if not peut_refuser:
+ return JsonResponse({"message": "Vous n'êtes pas autorisé à refuser cette réservation."})
+
+ reservation.statut = "refusee"
+ reservation.save()
+
+ fonctions_utilitaire.envoyer_mail(
+ sujet = "Réservation refusée",
+ message = f"""Bonjour {reservation.employe.user.first_name} {reservation.employe.user.last_name}, votre demande de réservation du {reservation.date_debut.strftime('%d/%m/%Y')} de {reservation.date_debut.strftime('%d/%m/%Y')} de {reservation.heure_debut.strftime('%H:%M')} à {reservation.heure_fin.strftime('%H:%M')} a été refusée.""",
+ destinataires = [reservation.employe.user.email]
+ )
+
+ return JsonResponse({"message": "Réservation refusée avec succès."})
\ No newline at end of file