From ab87baaa3a2df23369a4b83c5ce310dd93ba1c1c Mon Sep 17 00:00:00 2001 From: fatima Date: Thu, 30 Apr 2026 13:59:00 +0200 Subject: [PATCH] Bug: Affichage des details de la reservation --- .../static/gestion_salle/js/index.js | 11 +- .../parts/modalDetailResevation.html | 19 ++- gestion_salle/views.py | 144 +++++++++++------- 3 files changed, 101 insertions(+), 73 deletions(-) diff --git a/gestion_salle/static/gestion_salle/js/index.js b/gestion_salle/static/gestion_salle/js/index.js index ec30e9b..8162abd 100644 --- a/gestion_salle/static/gestion_salle/js/index.js +++ b/gestion_salle/static/gestion_salle/js/index.js @@ -170,9 +170,9 @@ tableau_reservation_attente.on("rowClick", (row, rowData) => { $("lien_zoom_container").className = 'd-none'; } - if(data.statut !== "refusee"){ - $("motif_refus_container").className = 'd-none'; - } + // if(data.statut !== "refusee"){ + // $("motif_refus_container").className = 'd-none'; + // } $("id_reservation_detail").value = data.id; $("id_reservation_refus").value = data.id; @@ -181,14 +181,15 @@ tableau_reservation_attente.on("rowClick", (row, rowData) => { $("employe").value=data.employe; $("salle").value=data.salle; $("statut-reservation").innerHTML=data.statut; - $("date_evenement").value=data.date_debut; + $("date_debut").value = data.date_debut; + $("date_fin").value = data.date_fin; $("heure_debut").value=data.heure_debut; $("heure_fin").value=data.heure_fin; $("motif_reservation").value=data.motif_reservation; $("besoin_zoom").checked=data.besoin_zoom; $("besoin_ordinateur").checked=data.besoin_ordi; $("lien_zoom").value=data.lien_zoom; - $("motif_refus").value=data.motif_refus; + // $("motif_refus").value=data.motif_refus; const modal = new bootstrap.Modal($("modalDetailReservation")); bootstrap.Modal.getOrCreateInstance($("modalReservationAttente")).hide(); diff --git a/gestion_salle/templates/gestion_salle/parts/modalDetailResevation.html b/gestion_salle/templates/gestion_salle/parts/modalDetailResevation.html index fb84ee8..86e1006 100644 --- a/gestion_salle/templates/gestion_salle/parts/modalDetailResevation.html +++ b/gestion_salle/templates/gestion_salle/parts/modalDetailResevation.html @@ -21,8 +21,12 @@
- - + + +
+
+ +
@@ -48,24 +52,19 @@
-
- - -
{% if appartient_au_departement_informatique %} {% endif %} {% if appartient_direction and reservation.statut == "en_attente" %} - {% endif %} - - {% if appartient_direction %} {% endif %} + +
- \ No newline at end of file + \ No newline at end of file diff --git a/gestion_salle/views.py b/gestion_salle/views.py index 098f156..11503d3 100644 --- a/gestion_salle/views.py +++ b/gestion_salle/views.py @@ -1,4 +1,3 @@ -import json from datetime import timedelta from django.contrib import messages from django.contrib.auth.decorators import login_required @@ -10,71 +9,97 @@ from gestion_employe.models import Employe from gestion_salle.forms import ReservationForm from .models import Reservation + @login_required -def index(request:HttpRequest): - """Vue de gestion de la reservation de la salle""" +def index(request: HttpRequest): + try: employe = Employe.objects.get(user=request.user) except Employe.DoesNotExist: - messages.error(request, "Impossible d'accéder au menu 'Reservation de salle' car votre profil Utilisateur n'est lié à aucun profil Employe. Veuillez contacter l'administrateur.") + messages.error(request, "Profil employé introuvable.") return redirect('gestion_conges:conge') - + + + if request.method == "POST": form = ReservationForm(request.POST) + if form.is_valid(): - date_debut = form.cleaned_data.get('date_debut') - date_fin = form.cleaned_data.get('date_fin') - salle = form.cleaned_data.get('salle') - heure_debut = form.cleaned_data.get('heure_debut') - heure_fin = form.cleaned_data.get('heure_fin') - motif_reservation = form.cleaned_data.get('motif_reservation') - besoin_zoom = form.cleaned_data.get('besoin_zoom') - besoin_ordi = form.cleaned_data.get('besoin_ordi') + date_debut = form.cleaned_data['date_debut'] + date_fin = form.cleaned_data['date_fin'] + salle = form.cleaned_data['salle'] + heure_debut = form.cleaned_data['heure_debut'] + heure_fin = form.cleaned_data['heure_fin'] + motif = form.cleaned_data['motif_reservation'] + besoin_zoom = form.cleaned_data['besoin_zoom'] + besoin_ordi = form.cleaned_data['besoin_ordi'] + + if date_fin < date_debut: + messages.error(request, "Date fin invalide.") + return redirect('gestion_salle:reservation-salle') + + if heure_fin <= heure_debut: + messages.error(request, "Heure invalide.") + return redirect('gestion_salle:reservation-salle') - while date_debut <= date_fin : - reservation = Reservation( - employe = employe, - date_debut = date_debut, - date_fin = date_debut, - salle = salle, - heure_debut = heure_debut, - heure_fin = heure_fin, - besoin_zoom = besoin_zoom, - besoin_ordi = besoin_ordi, - motif_reservation=motif_reservation, + if not request.user.first_name.strip() or not request.user.last_name.strip(): + messages.error( + request, + "Veuillez renseigner votre nom et prénom pour pouvoir faire une réservation." ) - reservation.save() - date_debut = date_debut + timedelta(days=1) + return redirect('gestion_salle:reservation-salle') - messages.success(request, "Réservation(s) créées avec succès.") + created = [] + current_date = date_debut + while current_date <= date_fin: + + reservation = Reservation.objects.create( + employe=employe, + date_debut=current_date, + date_fin=current_date, + salle=salle, + heure_debut=heure_debut, + heure_fin=heure_fin, + besoin_zoom=besoin_zoom, + besoin_ordi=besoin_ordi, + motif_reservation=motif, + statut="en_attente" + ) + + created.append(reservation) + current_date += timedelta(days=1) + + messages.success(request, "Réservation(s) créée(s) 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}". +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.""", destinataires = list(fonctions_utilitaire.EMAIL_ASSISTANTE_DE_DIRECTION) ) return redirect('gestion_salle:reservation-salle') formulaire_reservation = ReservationForm() - departement = Employe.objects.get(user__username=request.user).departement - appartient_direction = 'direction' in request.user.groups.values_list('name', flat=True) - liste_demande_reservation = [ - reservation.id for reservation in - Reservation.objects.filter(employe=employe, statut='en_attente') - ] - + departement = employe.departement + + appartient_direction = request.user.groups.filter(name='direction').exists() + + liste_demande_reservation = Reservation.objects.filter( + employe=employe, + statut='en_attente' + ).values_list('id', flat=True) + context = { 'formulaire_reservation': formulaire_reservation, 'nb_reservation_attente': Reservation.objects.filter(statut='en_attente').count(), - 'appartient_au_departement_informatique': 'Informatique' == departement.nom if departement else False, + 'appartient_au_departement_informatique': departement and departement.nom == "Systeme informatique", 'appartient_direction': appartient_direction, - 'liste_demande_reservation': liste_demande_reservation + 'liste_demande_reservation': list(liste_demande_reservation), } - return render(request, "gestion_salle/index.html", context) + return render(request, "gestion_salle/index.html", context) def liste_reservation(request:HttpRequest): """Vue d'affichage des creneaux disponibles""" reservations = Reservation.objects.filter(statut = "validee") @@ -96,7 +121,6 @@ def liste_reservation(request:HttpRequest): "end": reservation.heure_fin, "color": color, }) - return JsonResponse(liste_reservation, safe=False) @login_required @@ -113,10 +137,12 @@ def liste_reservation_attente(request): return JsonResponse(liste_reservation, safe=False) def detail_reservation(request:HttpRequest, reservation_id:int): + reservation = Reservation.objects.get(id=reservation_id) employe = reservation.employe.user reservation_json = { + 'id_reservation': reservation_id, 'employe': f"{employe.first_name} {employe.last_name}", 'salle': reservation.salle, @@ -129,7 +155,6 @@ def detail_reservation(request:HttpRequest, reservation_id:int): 'besoin_ordinateur': reservation.besoin_ordi, 'lien_zoom': reservation.lien_zoom or '', } - return JsonResponse(reservation_json, safe=True) @login_required @@ -175,16 +200,17 @@ def annuler_reservation(request:HttpRequest): return redirect('gestion_salle:reservation-salle') @login_required -def valider_reservation(request:HttpRequest): - """Vue de gestion de l'annulation de la reservation""" +def valider_reservation(request: HttpRequest): + """Validation d'une réservation""" if request.method == 'POST': - reservation_id= request.POST['id_reservation'] + reservation_id = request.POST.get('id_reservation') + try: - reservation = Reservation.objects.get(id=reservation_id) - except reservation.DoesNotExist: - messages.error(request, "La resevertion selectionné n'existe pas.") + 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") - + reservation.statut = 'validee' reservation.save() if fonctions_utilitaire.EMAIL_ASSISTANTE_DE_DIRECTION: @@ -198,16 +224,18 @@ def valider_reservation(request:HttpRequest): return redirect('gestion_salle:reservation-salle') @login_required -def refuser_reservation(request:HttpRequest): - """Vue de gestion de refus de la reservation""" - data = json.loads(request.body) - reservation_id = data.get("id_reservation") - try: - reservation = Reservation.objects.get(id=reservation_id) - except Reservation.DoesNotExist and ValueError: - return JsonResponse({"message": "La resevertion selectionné n'existe pas."}) - else: - reservation.statut = "refusee" +def refuser_reservation(request: HttpRequest): + """Refuser une réservation""" + if request.method == 'POST': + reservation_id = request.POST.get('id_reservation') + + try: + reservation = Reservation.objects.get(id=reservation_id) + except Reservation.DoesNotExist: + messages.error(request, "La réservation n'existe pas.") + return redirect("salle") + + reservation.statut = 'refusee' reservation.save() if fonctions_utilitaire.EMAIL_ASSISTANTE_DE_DIRECTION: @@ -217,4 +245,4 @@ def refuser_reservation(request:HttpRequest): destinataires = [reservation.employe.user.email] ) - return JsonResponse({"message": "Réservation refusée avec succès."}) \ No newline at end of file + return JsonResponse({"message": "Réservation refusée avec succès."})