Compare commits
5 Commits
5277b7f355
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 415860f233 | |||
| 8503689aa4 | |||
| b03a4214c0 | |||
| d4f4b7d954 | |||
| 489eeb439f |
2
Jenkinsfile
vendored
2
Jenkinsfile
vendored
@@ -39,6 +39,8 @@ pipeline
|
|||||||
|
|
||||||
python manage.py makemigrations
|
python manage.py makemigrations
|
||||||
python manage.py migrate
|
python manage.py migrate
|
||||||
|
echo $SUDO_PASSWORD | sudo -S rm -r staticfiles
|
||||||
|
python manage.py collectstatic --noinput
|
||||||
|
|
||||||
echo $SUDO_PASSWORD | sudo -S chown -R www-data:www-data /var/www/sirh
|
echo $SUDO_PASSWORD | sudo -S chown -R www-data:www-data /var/www/sirh
|
||||||
echo "Deploiement reussi"
|
echo "Deploiement reussi"
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -2,7 +2,6 @@ from datetime import date
|
|||||||
from decimal import Decimal, InvalidOperation
|
from decimal import Decimal, InvalidOperation
|
||||||
from django.http import JsonResponse
|
from django.http import JsonResponse
|
||||||
from django.shortcuts import redirect, render
|
from django.shortcuts import redirect, render
|
||||||
from django.urls import reverse
|
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -33,11 +33,6 @@ const calendrier = Schedule(document.getElementById('planning-reservation'), {
|
|||||||
$("lien_zoom_container").className = "d-none";
|
$("lien_zoom_container").className = "d-none";
|
||||||
}
|
}
|
||||||
|
|
||||||
if(data.statut !== "annulee"){
|
|
||||||
$("motif_refus_container").className = "d-none";
|
|
||||||
}else{
|
|
||||||
$("motif_refus").value=data.motif_refus;
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -83,6 +78,11 @@ $("bouton-annuler").addEventListener("click", (e) => {
|
|||||||
const csrf = document.querySelector("[name=csrfmiddlewaretoken]").value;
|
const csrf = document.querySelector("[name=csrfmiddlewaretoken]").value;
|
||||||
const url_annuler = $("formulaire-details").dataset.urlannuler;
|
const url_annuler = $("formulaire-details").dataset.urlannuler;
|
||||||
|
|
||||||
|
console.log("URL d'annulation :");
|
||||||
|
console.log($("formulaire-details"))
|
||||||
|
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
fetch(
|
fetch(
|
||||||
url_annuler,
|
url_annuler,
|
||||||
{
|
{
|
||||||
@@ -133,6 +133,9 @@ if($("refuserReservation")){
|
|||||||
const url = e.currentTarget.dataset.lienrefus;
|
const url = e.currentTarget.dataset.lienrefus;
|
||||||
const idRes = $("id_reservation_detail").value;
|
const idRes = $("id_reservation_detail").value;
|
||||||
|
|
||||||
|
console.log(idRes);
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
fetch(url, {
|
fetch(url, {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
headers: {
|
headers: {
|
||||||
@@ -168,6 +171,7 @@ tableau_reservation_attente.on("rowClick", (row, rowData) => {
|
|||||||
$("lien_zoom_container").className = 'd-none';
|
$("lien_zoom_container").className = 'd-none';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const id_user = $("current-user-id").dataset.userid;
|
||||||
$("id_reservation_detail").value = data.id;
|
$("id_reservation_detail").value = data.id;
|
||||||
$("id_reservation_refus").value = data.id;
|
$("id_reservation_refus").value = data.id;
|
||||||
$("id_reservation_zoom").value = data.id;
|
$("id_reservation_zoom").value = data.id;
|
||||||
@@ -184,6 +188,10 @@ tableau_reservation_attente.on("rowClick", (row, rowData) => {
|
|||||||
$("besoin_ordinateur").checked=data.besoin_ordi;
|
$("besoin_ordinateur").checked=data.besoin_ordi;
|
||||||
$("lien_zoom").value=data.lien_zoom;
|
$("lien_zoom").value=data.lien_zoom;
|
||||||
|
|
||||||
|
if (id_user != data.employe_id){
|
||||||
|
$("bouton-annuler").className = "d-none";
|
||||||
|
}
|
||||||
|
|
||||||
const modal = new bootstrap.Modal($("modalDetailReservation"));
|
const modal = new bootstrap.Modal($("modalDetailReservation"));
|
||||||
bootstrap.Modal.getOrCreateInstance($("modalReservationAttente")).hide();
|
bootstrap.Modal.getOrCreateInstance($("modalReservationAttente")).hide();
|
||||||
modal.show();
|
modal.show();
|
||||||
|
|||||||
@@ -26,9 +26,9 @@
|
|||||||
<div class="form-group col-5 me-2">
|
<div class="form-group col-5 me-2">
|
||||||
<label>Selectionner une salle :</label>
|
<label>Selectionner une salle :</label>
|
||||||
<select class = "form-select" id="liste-salle">
|
<select class = "form-select" id="liste-salle">
|
||||||
<option value='formation'>Salle de formation</option>
|
<option value='Salle de formation'>Salle de formation</option>
|
||||||
<option value='reunion'>Salle de réunion</option>
|
<option value='Salle de réunion'>Salle de réunion</option>
|
||||||
<option value='lien_zoom'>Lien Zoom</option>
|
<option value='Lien Zoom'>Lien Zoom</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<!-- Modal d'affichage des détails d'une reservation -->
|
<!-- Modal d'affichage des détails d'une reservation -->
|
||||||
|
{% load tags_personnaliser %}
|
||||||
<div class="modal fade" id="modalDetailReservation" tabindex="-1" aria-labelledby="modalDetailReservationLabel" aria-hidden="true">
|
<div class="modal fade" id="modalDetailReservation" tabindex="-1" aria-labelledby="modalDetailReservationLabel" aria-hidden="true">
|
||||||
<div class="modal-dialog">
|
<div class="modal-dialog">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
@@ -56,11 +57,11 @@
|
|||||||
{% if appartient_au_departement_informatique %}
|
{% if appartient_au_departement_informatique %}
|
||||||
<button class="btn btn-primary" id="ajoutZoom">Ajout du lien zoom</button>
|
<button class="btn btn-primary" id="ajoutZoom">Ajout du lien zoom</button>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if appartient_direction and reservation.statut == "en_attente" %}
|
{% if user|has_group:'direction' %}
|
||||||
<button class="btn btn-danger" id="refuserReservation" data-lienrefus="{% url 'gestion_salle:refuser-reservation' %}">Refuser</button>
|
<button class="btn btn-danger" id="refuserReservation" data-lienrefus="{% url 'gestion_salle:refuser-reservation' %}">Refuser</button>
|
||||||
<button class="btn btn-success" id="bouton-valider">Valider</button>
|
<button class="btn btn-success" id="bouton-valider">Valider</button>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<span id="current-user-id" data-user-id="{{ request.user.id }}"></span>
|
<span id="current-user-id" data-userid="{{ request.user.id }}"></span>
|
||||||
<button class="btn btn-danger" id="bouton-annuler">Annuler</button>
|
<button class="btn btn-danger" id="bouton-annuler">Annuler</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
|
import json
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
from django.shortcuts import redirect, render
|
from django.shortcuts import redirect, render
|
||||||
@@ -19,8 +20,6 @@ def index(request: HttpRequest):
|
|||||||
messages.error(request, "Profil employé introuvable.")
|
messages.error(request, "Profil employé introuvable.")
|
||||||
return redirect('gestion_conges:conge')
|
return redirect('gestion_conges:conge')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
form = ReservationForm(request.POST)
|
form = ReservationForm(request.POST)
|
||||||
|
|
||||||
@@ -71,13 +70,14 @@ def index(request: HttpRequest):
|
|||||||
current_date += timedelta(days=1)
|
current_date += timedelta(days=1)
|
||||||
|
|
||||||
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:
|
||||||
fonctions_utilitaire.envoyer_mail(
|
fonctions_utilitaire.envoyer_mail(
|
||||||
sujet = "Reservation de salle",
|
sujet = "Reservation de salle",
|
||||||
message = f"""
|
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}".
|
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 = list(fonctions_utilitaire.EMAIL_ASSISTANTE_DE_DIRECTION)
|
destinataires = fonctions_utilitaire.EMAIL_ASSISTANTE_DE_DIRECTION
|
||||||
)
|
)
|
||||||
return redirect('gestion_salle:reservation-salle')
|
return redirect('gestion_salle:reservation-salle')
|
||||||
|
|
||||||
@@ -100,10 +100,12 @@ Veuillez vous connecter à la plateforme pour plus de détails.""",
|
|||||||
}
|
}
|
||||||
|
|
||||||
return render(request, "gestion_salle/index.html", context)
|
return render(request, "gestion_salle/index.html", context)
|
||||||
|
|
||||||
def liste_reservation(request:HttpRequest):
|
def liste_reservation(request:HttpRequest):
|
||||||
"""Vue d'affichage des creneaux disponibles"""
|
"""Vue d'affichage des creneaux disponibles"""
|
||||||
reservations = Reservation.objects.filter(statut = "validee")
|
reservations = Reservation.objects.filter(statut = "validee")
|
||||||
liste_reservation = []
|
liste_reservation = []
|
||||||
|
|
||||||
for reservation in reservations:
|
for reservation in reservations:
|
||||||
color = None
|
color = None
|
||||||
if reservation.statut == "en_attente":
|
if reservation.statut == "en_attente":
|
||||||
@@ -113,6 +115,8 @@ def liste_reservation(request:HttpRequest):
|
|||||||
else:
|
else:
|
||||||
color = "#dc3545"
|
color = "#dc3545"
|
||||||
|
|
||||||
|
print(dict(Reservation.TYPE_CHOICES).get(reservation.salle))
|
||||||
|
|
||||||
liste_reservation.append({
|
liste_reservation.append({
|
||||||
"guid": reservation.pk,
|
"guid": reservation.pk,
|
||||||
"title": dict(Reservation.TYPE_CHOICES).get(reservation.salle),
|
"title": dict(Reservation.TYPE_CHOICES).get(reservation.salle),
|
||||||
@@ -130,6 +134,7 @@ def liste_reservation_attente(request):
|
|||||||
{
|
{
|
||||||
**model_to_dict(reservation),
|
**model_to_dict(reservation),
|
||||||
"employe": f"{reservation.employe.user.first_name} {reservation.employe.user.last_name}",
|
"employe": f"{reservation.employe.user.first_name} {reservation.employe.user.last_name}",
|
||||||
|
"employe_id": reservation.employe.user.id,
|
||||||
"salle": dict(Reservation.TYPE_CHOICES).get(reservation.salle),
|
"salle": dict(Reservation.TYPE_CHOICES).get(reservation.salle),
|
||||||
'statut': dict(Reservation.STATUT).get(reservation.statut),
|
'statut': dict(Reservation.STATUT).get(reservation.statut),
|
||||||
} for reservation in reservations
|
} for reservation in reservations
|
||||||
@@ -215,32 +220,31 @@ def valider_reservation(request: HttpRequest):
|
|||||||
|
|
||||||
reservation.statut = 'validee'
|
reservation.statut = 'validee'
|
||||||
reservation.save()
|
reservation.save()
|
||||||
if fonctions_utilitaire.EMAIL_ASSISTANTE_DE_DIRECTION:
|
|
||||||
fonctions_utilitaire.envoyer_mail(
|
fonctions_utilitaire.envoyer_mail(
|
||||||
sujet = "Reservation de salle",
|
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é validée. Veuillez vous connecter à la plateforme pour plus de détails.""",
|
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é validée. Veuillez vous connecter à la plateforme pour plus de détails.""",
|
||||||
destinataires = [reservation.employe.user.email]
|
destinataires = [reservation.employe.user.email]
|
||||||
)
|
)
|
||||||
|
|
||||||
messages.success(request, f"Réservation de {reservation.employe.get_full_name()} validée avec succès.")
|
messages.success(request, f"La réservation de {request.user.first_name} {request.user.last_name} validée avec succès.")
|
||||||
return redirect('gestion_salle:reservation-salle')
|
return redirect('gestion_salle:reservation-salle')
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def refuser_reservation(request: HttpRequest):
|
def refuser_reservation(request: HttpRequest):
|
||||||
"""Refuser une réservation"""
|
"""Refuser une réservation"""
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
reservation_id = request.POST.get('id_reservation')
|
reservation_id = json.loads(request.body).get('id_reservation')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
reservation = Reservation.objects.get(id=reservation_id)
|
reservation = Reservation.objects.get(id=reservation_id)
|
||||||
except Reservation.DoesNotExist:
|
except Reservation.DoesNotExist:
|
||||||
messages.error(request, "La réservation n'existe pas.")
|
messages.error(request, "La réservation n'existe pas.")
|
||||||
return redirect("salle")
|
return JsonResponse({"message": "Une erreur s'est produite lors de l'annulation de la reservation."})
|
||||||
|
|
||||||
reservation.statut = 'refusee'
|
reservation.statut = 'refusee'
|
||||||
reservation.save()
|
reservation.save()
|
||||||
|
|
||||||
if fonctions_utilitaire.EMAIL_ASSISTANTE_DE_DIRECTION:
|
|
||||||
fonctions_utilitaire.envoyer_mail(
|
fonctions_utilitaire.envoyer_mail(
|
||||||
sujet = "Reservation de salle",
|
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.""",
|
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.""",
|
||||||
|
|||||||
Reference in New Issue
Block a user