diff --git a/gestion_salle/static/gestion_salle/js/index.js b/gestion_salle/static/gestion_salle/js/index.js index 8b5bff8..44cb922 100644 --- a/gestion_salle/static/gestion_salle/js/index.js +++ b/gestion_salle/static/gestion_salle/js/index.js @@ -167,9 +167,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; @@ -178,14 +178,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 de589cf..6ccc645 100644 --- a/gestion_salle/views.py +++ b/gestion_salle/views.py @@ -8,63 +8,93 @@ from django.forms import model_to_dict from gestion_employe.models import Employe from gestion_salle.forms import ReservationForm from .models import Reservation +from datetime import timedelta +from django.contrib.auth.models import User + @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') - - 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, - ) - reservation.save() - date_debut = date_debut + timedelta(days=1) - messages.success(request, "Réservation(s) créées avec succès.") + if form.is_valid(): + + 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') + + 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." + ) + return redirect('gestion_salle:reservation-salle') + + 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.") 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") @@ -86,7 +116,6 @@ def liste_reservation(request:HttpRequest): "end": reservation.heure_fin, "color": color, }) - return JsonResponse(liste_reservation, safe=False) @login_required @@ -103,23 +132,25 @@ 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, 'statut': reservation.statut, - 'date_evenement': reservation.date_debut.strftime('%Y-%m-%d'), + 'date_debut': reservation.date_debut.strftime('%Y-%m-%d'), + 'date_fin': reservation.date_fin.strftime('%Y-%m-%d'), 'heure_debut': reservation.heure_debut.strftime('%H:%M'), 'heure_fin': reservation.heure_fin.strftime('%H:%M'), 'motif_reservation': reservation.motif_reservation, 'besoin_zoom': reservation.besoin_zoom, 'besoin_ordinateur': reservation.besoin_ordi, 'lien_zoom': reservation.lien_zoom or '', - 'motif_refus': reservation.motif_refus or '', } - return JsonResponse(reservation_json, safe=True) @login_required @@ -165,31 +196,35 @@ 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() - messages.success(request, f"Réservation de {reservation.employe.get_full_name()} 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""" - 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() - return JsonResponse({"message": "Réservation refusée avec succès."}) \ No newline at end of file + + return redirect('gestion_salle:reservation-salle') \ No newline at end of file