2026-04-30 13:28:57 +02:00
|
|
|
import json
|
|
|
|
|
from datetime import timedelta
|
|
|
|
|
from django.contrib import messages
|
|
|
|
|
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 gestion_employe.models import Employe
|
|
|
|
|
from gestion_salle.forms import ReservationForm
|
|
|
|
|
from .models import Reservation
|
2026-04-30 13:59:00 +02:00
|
|
|
from datetime import timedelta
|
|
|
|
|
from django.contrib.auth.models import User
|
|
|
|
|
|
2026-04-30 13:28:57 +02:00
|
|
|
|
|
|
|
|
@login_required
|
2026-04-30 13:59:00 +02:00
|
|
|
def index(request: HttpRequest):
|
|
|
|
|
|
2026-04-30 13:28:57 +02:00
|
|
|
try:
|
|
|
|
|
employe = Employe.objects.get(user=request.user)
|
|
|
|
|
except Employe.DoesNotExist:
|
2026-04-30 13:59:00 +02:00
|
|
|
messages.error(request, "Profil employé introuvable.")
|
2026-04-30 13:28:57 +02:00
|
|
|
return redirect('gestion_conges:conge')
|
2026-04-30 13:59:00 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-04-30 13:28:57 +02:00
|
|
|
if request.method == "POST":
|
|
|
|
|
form = ReservationForm(request.POST)
|
2026-04-30 13:59:00 +02:00
|
|
|
|
2026-04-30 13:28:57 +02:00
|
|
|
if form.is_valid():
|
2026-04-30 13:59:00 +02:00
|
|
|
|
|
|
|
|
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')
|
2026-04-30 13:28:57 +02:00
|
|
|
|
2026-04-30 13:59:00 +02:00
|
|
|
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."
|
2026-04-30 13:28:57 +02:00
|
|
|
)
|
2026-04-30 13:59:00 +02:00
|
|
|
return redirect('gestion_salle:reservation-salle')
|
|
|
|
|
|
|
|
|
|
created = []
|
|
|
|
|
current_date = date_debut
|
2026-04-30 13:28:57 +02:00
|
|
|
|
2026-04-30 13:59:00 +02:00
|
|
|
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.")
|
2026-04-30 13:28:57 +02:00
|
|
|
return redirect('gestion_salle:reservation-salle')
|
|
|
|
|
|
|
|
|
|
formulaire_reservation = ReservationForm()
|
2026-04-30 13:59:00 +02:00
|
|
|
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)
|
|
|
|
|
|
2026-04-30 13:28:57 +02:00
|
|
|
context = {
|
|
|
|
|
'formulaire_reservation': formulaire_reservation,
|
|
|
|
|
'nb_reservation_attente': Reservation.objects.filter(statut='en_attente').count(),
|
2026-04-30 13:59:00 +02:00
|
|
|
'appartient_au_departement_informatique': departement and departement.nom == "Systeme informatique",
|
2026-04-30 13:28:57 +02:00
|
|
|
'appartient_direction': appartient_direction,
|
2026-04-30 13:59:00 +02:00
|
|
|
'liste_demande_reservation': list(liste_demande_reservation),
|
2026-04-30 13:28:57 +02:00
|
|
|
}
|
|
|
|
|
|
2026-04-30 13:59:00 +02:00
|
|
|
return render(request, "gestion_salle/index.html", context)
|
2026-04-30 13:28:57 +02:00
|
|
|
def liste_reservation(request:HttpRequest):
|
|
|
|
|
"""Vue d'affichage des creneaux disponibles"""
|
|
|
|
|
reservations = Reservation.objects.filter(statut = "validee")
|
|
|
|
|
liste_reservation = []
|
|
|
|
|
for reservation in reservations:
|
|
|
|
|
color = None
|
|
|
|
|
if reservation.statut == "en_attente":
|
|
|
|
|
color = "#ffc107"
|
|
|
|
|
elif reservation.statut == "validee":
|
|
|
|
|
color = "#198754"
|
|
|
|
|
else:
|
|
|
|
|
color = "#dc3545"
|
|
|
|
|
|
|
|
|
|
liste_reservation.append({
|
|
|
|
|
"guid": reservation.pk,
|
|
|
|
|
"title": dict(Reservation.TYPE_CHOICES).get(reservation.salle),
|
|
|
|
|
"date": reservation.date_debut,
|
|
|
|
|
"start": reservation.heure_debut,
|
|
|
|
|
"end": reservation.heure_fin,
|
|
|
|
|
"color": color,
|
|
|
|
|
})
|
|
|
|
|
return JsonResponse(liste_reservation, safe=False)
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
def liste_reservation_attente(request):
|
|
|
|
|
reservations = Reservation.objects.filter(statut="en_attente")
|
|
|
|
|
liste_reservation = [
|
|
|
|
|
{
|
|
|
|
|
**model_to_dict(reservation),
|
|
|
|
|
"employe": f"{reservation.employe.user.first_name} {reservation.employe.user.last_name}",
|
|
|
|
|
"salle": dict(Reservation.TYPE_CHOICES).get(reservation.salle)
|
|
|
|
|
} for reservation in reservations
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
return JsonResponse(liste_reservation, safe=False)
|
|
|
|
|
|
|
|
|
|
def detail_reservation(request:HttpRequest, reservation_id:int):
|
2026-04-30 13:59:00 +02:00
|
|
|
|
2026-04-30 13:28:57 +02:00
|
|
|
reservation = Reservation.objects.get(id=reservation_id)
|
|
|
|
|
employe = reservation.employe.user
|
2026-04-30 13:59:00 +02:00
|
|
|
|
2026-04-30 13:28:57 +02:00
|
|
|
reservation_json = {
|
2026-04-30 13:59:00 +02:00
|
|
|
|
2026-04-30 13:28:57 +02:00
|
|
|
'id_reservation': reservation_id,
|
|
|
|
|
'employe': f"{employe.first_name} {employe.last_name}",
|
|
|
|
|
'salle': reservation.salle,
|
|
|
|
|
'statut': reservation.statut,
|
2026-04-30 13:59:00 +02:00
|
|
|
'date_debut': reservation.date_debut.strftime('%Y-%m-%d'),
|
|
|
|
|
'date_fin': reservation.date_fin.strftime('%Y-%m-%d'),
|
2026-04-30 13:28:57 +02:00
|
|
|
'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 '',
|
|
|
|
|
}
|
|
|
|
|
return JsonResponse(reservation_json, safe=True)
|
|
|
|
|
|
|
|
|
|
@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')
|
|
|
|
|
|
|
|
|
|
if request.method == "POST":
|
|
|
|
|
lien = request.POST.get("lien_zoom")
|
|
|
|
|
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. ")
|
|
|
|
|
return redirect('gestion_salle:reservation-salle')
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
def annuler_reservation(request:HttpRequest):
|
|
|
|
|
"""Vue de gestion de l'annulation de la reservation"""
|
|
|
|
|
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")
|
|
|
|
|
|
|
|
|
|
reservation.statut = 'annulee'
|
|
|
|
|
reservation.save()
|
|
|
|
|
messages.success(request, "Votre réservation a été annulée.")
|
|
|
|
|
return redirect('gestion_salle:reservation-salle')
|
|
|
|
|
|
|
|
|
|
@login_required
|
2026-04-30 13:59:00 +02:00
|
|
|
def valider_reservation(request: HttpRequest):
|
|
|
|
|
"""Validation d'une réservation"""
|
2026-04-30 13:28:57 +02:00
|
|
|
if request.method == 'POST':
|
2026-04-30 13:59:00 +02:00
|
|
|
reservation_id = request.POST.get('id_reservation')
|
|
|
|
|
|
2026-04-30 13:28:57 +02:00
|
|
|
try:
|
2026-04-30 13:59:00 +02:00
|
|
|
reservation = Reservation.objects.get(id=reservation_id)
|
|
|
|
|
except Reservation.DoesNotExist:
|
|
|
|
|
messages.error(request, "La réservation sélectionnée n'existe pas.")
|
2026-04-30 13:28:57 +02:00
|
|
|
return redirect("salle")
|
2026-04-30 13:59:00 +02:00
|
|
|
|
2026-04-30 13:28:57 +02:00
|
|
|
reservation.statut = 'validee'
|
|
|
|
|
reservation.save()
|
2026-04-30 13:59:00 +02:00
|
|
|
|
2026-04-30 13:28:57 +02:00
|
|
|
return redirect('gestion_salle:reservation-salle')
|
|
|
|
|
|
|
|
|
|
@login_required
|
2026-04-30 13:59:00 +02:00
|
|
|
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'
|
2026-04-30 13:28:57 +02:00
|
|
|
reservation.save()
|
2026-04-30 13:59:00 +02:00
|
|
|
|
|
|
|
|
return redirect('gestion_salle:reservation-salle')
|