Ajout de la barre de navigation
All checks were successful
Organisation/sirh/pipeline/head This commit looks good
SGL/sirh/pipeline/head This commit looks good

This commit is contained in:
2026-09-04 12:19:27 +00:00
parent 900343a4f8
commit 1a21998c39
19 changed files with 62 additions and 42 deletions

Binary file not shown.

View File

@@ -12,8 +12,6 @@ class SIRHClient(Client):
"""Crée le User et son Profile avec les infos reçues du serveur.""" """Crée le User et son Profile avec les infos reçues du serveur."""
user_data_copy = user_data.copy() user_data_copy = user_data.copy()
print("Un petit test", user_data_copy)
user_data.pop("departement", None) user_data.pop("departement", None)
user_data.pop("chef_departement", None) user_data.pop("chef_departement", None)
user_data.pop("groups", None) user_data.pop("groups", None)

View File

@@ -14,8 +14,8 @@
</head> </head>
<body> <body>
<div class="container-fluid"> <div class="container-fluid">
<div class="row flex-nowrap">
{% include 'parts/menu_application.html' %} {% include 'parts/menu_application.html' %}
<div class="row flex-nowrap">
{% include 'parts/menu_principal.html' %} {% include 'parts/menu_principal.html' %}
<div class="col p-4"> <div class="col p-4">
{% block 'contenu' %} {% endblock %} {% block 'contenu' %} {% endblock %}

View File

@@ -1,8 +1,21 @@
<div class="col-1 bg-danger border d-flex flex-column vh-100 pt-5 sticky-top"> {% load static %}
<a href="{{ SIRH_LIEN }}" class="text-white text-center fw-bold text-decoration-none mb-4" style="font-size:1.4em"> <nav class="navbar navbar-expand-lg bg-body-tertiary">
<i class="bi bi-people-fill fs-1 d-block"></i>SIRH <div class="container-fluid">
<a class="navbar-brand" href="#">
<img src="{% static 'img/cerfig.jpg' %}" alt="Logo" width="85" height="30" class="d-inline-block align-text-top">
</a> </a>
<a href="{{ SGL_LIEN }}" class="text-white text-center fw-bold text-decoration-none mb-4" style="font-size:1.4em"> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-building-gear fs-1 d-block"></i> SGL <span class="navbar-toggler-icon"></span>
</a> </button>
</div> <div class="collapse navbar-collapse" id="navbarNav">
<ul class="nav nav-tabs justify-content-end w-100">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="{{ SIRH_LIEN }}">SIRH</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{{ SGL_LIEN }}">SGL</a>
</li>
</ul>
</div>
</div>
</nav>

View File

@@ -1,3 +1,5 @@
from django.conf import settings
from django.core.mail import send_mail
from django.utils import timezone from django.utils import timezone
from gestion_conge.models import Conge from gestion_conge.models import Conge
@@ -46,3 +48,14 @@ def destinataire_mail_demande_conges(employe):
if employe.departement: if employe.departement:
chefs_departement = Employe.objects.filter(departement=employe.departement, chef=True) chefs_departement = Employe.objects.filter(departement=employe.departement, chef=True)
return list(chefs_departement.values_list('user__email', flat=True)) return list(chefs_departement.values_list('user__email', flat=True))
def envoyer_mail(sujet, message, destinataires):
"""Fonction d'envoi de mail"""
send_mail(
sujet,
message,
settings.EMAIL_HOST_USER,
destinataires,
fail_silently=False,
)

View File

@@ -129,7 +129,7 @@ def demander_conge(request):
fonctions_utilitaire.envoyer_mail( fonctions_utilitaire.envoyer_mail(
sujet = "Demande de congé", sujet = "Demande de congé",
message = f"""Bonjour {employe.user.first_name} {employe.user.last_name}, votre demande de congé a été enregistrée. Veuillez consulter votre profil pour plus de détails.""", message = f"""Bonjour {employe.user.first_name} {employe.user.last_name}, votre demande de congé a été enregistrée. Veuillez consulter votre profil pour plus de détails.""",
destinataires = fonctions_utilitaire.destinataire_mail_demande_conges() + [employe.user.email] destinataires = fonctions_utilitaire.destinataire_mail_demande_conges(employe)
) )
return redirect("gestion_conges:conge") return redirect("gestion_conges:conge")

View File

@@ -13,6 +13,10 @@ const tableau_certificat = new Tabulator("#tableau-certificat", {
inputFormat:"yyyy-MM-dd", inputFormat:"yyyy-MM-dd",
outputFormat:"dd/MM/yy", outputFormat:"dd/MM/yy",
}}, }},
{"title": "Fichier", "field": "certificat", formatter:"link", formatterParams:{
label:"Voir le fichier",
target:"_blank",
}},
], ],
ajaxURL: url_certificat, ajaxURL: url_certificat,
}) })

View File

@@ -8,7 +8,7 @@
</h5> </h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button> <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div> </div>
<div class="modal-body" id="modalDetailEmployeBody" data-url="{% url 'gestion_employe:enregistrer-detail-employe' %}" data-url-departements="{% url 'gestion_employe:liste-departements' %}"> <div class="modal-body" id="modalDetailEmployeBody">
<div class="row g-3"> <div class="row g-3">
<input type="hidden" id="detail-id"> <input type="hidden" id="detail-id">
<div class="col-md-6"> <div class="col-md-6">
@@ -98,9 +98,6 @@
</h5> </h5>
{% if user|has_group:"ressource_humaine" %} {% if user|has_group:"ressource_humaine" %}
<div> <div>
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#modalContratsEmploye">
Liste contrat
</button>
<button type="button" class="btn btn-success" data-bs-toggle="modal" data-bs-target="#modalContrat{{ item.employe.id }}"> <button type="button" class="btn btn-success" data-bs-toggle="modal" data-bs-target="#modalContrat{{ item.employe.id }}">
<i class="bi bi-file-earmark-text"></i> Créer contrat <i class="bi bi-file-earmark-text"></i> Créer contrat
</button> </button>

View File

@@ -147,15 +147,6 @@ def mon_profil(request):
date_fin_daffectation__gte=timezone.now().date() date_fin_daffectation__gte=timezone.now().date()
).select_related('projet') ).select_related('projet')
has_contrat = contrats is not None
expiration_contrat = False
contrat_nb_jours_restant = None
if contrats:
nb_jours = contrats.nombre_jours_restant
contrat_nb_jours_restant = nb_jours
expiration_contrat = nb_jours <= fonctions_utilitaire.DUREE_FIN_CONTRAT
return render( return render(
request, request,
'gestion_employe/monprofil.html', 'gestion_employe/monprofil.html',
@@ -180,9 +171,9 @@ def mon_profil(request):
], ],
"formation_form": FormationForm(), "formation_form": FormationForm(),
"has_contrat": has_contrat, "has_contrat": contrats is not None,
"expiration_contrat": expiration_contrat, "expiration_contrat": contrats.nombre_jours_restant <= fonctions_utilitaire.DUREE_FIN_CONTRAT if contrats else False,
"contrat_nb_jours_restant": contrat_nb_jours_restant "contrat_nb_jours_restant": max(0, contrats.nombre_jours_restant if contrats else 0)
} }
) )
@login_required @login_required
@@ -232,7 +223,6 @@ def modifier_employer(request):
messages.success(request, "Profil mis à jour avec succès.") messages.success(request, "Profil mis à jour avec succès.")
return redirect("gestion_employe:mon-profil") return redirect("gestion_employe:mon-profil")
def enregistrement_document(request): def enregistrement_document(request):
"""Vue pour permettre à un utilisateur de télécharger et enregistrer des documents liés à son profil""" """Vue pour permettre à un utilisateur de télécharger et enregistrer des documents liés à son profil"""
employe = Employe.objects.get(user=request.user) employe = Employe.objects.get(user=request.user)

View File

@@ -1,8 +1,6 @@
const btnEnregistrerBailleur = document.getElementById('btnEnregistrerBailleur'); const btnEnregistrerBailleur = document.getElementById('btnEnregistrerBailleur');
let table; let table;
let table;
btnEnregistrerBailleur.addEventListener('click', function() { btnEnregistrerBailleur.addEventListener('click', function() {
const form = document.getElementById('formBailleur'); const form = document.getElementById('formBailleur');
const formData = new FormData(form); const formData = new FormData(form);

View File

@@ -188,6 +188,7 @@ tableau_reservation_attente.on("rowClick", (row, rowData) => {
} }
const id_user = $("current-user-id").dataset.userid; 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;
@@ -204,6 +205,16 @@ 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;
console.log("Verification de data :", data);
const refuserReservation = document.querySelector("#refuserReservation");
const bouton_valider = document.querySelector("#bouton-valider");
if((refuserReservation | bouton_valider) && data.statut === "En attente"){
refuserReservation.style.display = "inline-block";
bouton_valider.style.display = "inline-block";
}
if (id_user != data.employe_id){ if (id_user != data.employe_id){
$("bouton-annuler").className = "d-none"; $("bouton-annuler").className = "d-none";
} }

View File

@@ -12,7 +12,7 @@
<div class="modal-body"> <div class="modal-body">
<form method="POST" data-urlannuler="{% url 'gestion_salle:annuler-reservation' %}" data-urlvalider="{% url 'gestion_salle:valider-reservation' %}" id="formulaire-details"> <form method="POST" data-urlannuler="{% url 'gestion_salle:annuler-reservation' %}" data-urlvalider="{% url 'gestion_salle:valider-reservation' %}" id="formulaire-details">
{% csrf_token %} {% csrf_token %}
<input type='' class="form-control" id="id_reservation_detail" name='id_reservation'> <input type='' class="form-control" id="id_reservation_detail" name='id_reservation' hidden>
<div class="form-group mb-2"> <div class="form-group mb-2">
<label>Employé :</label> <label>Employé :</label>
<input class="form-control" id="employe" readonly> <input class="form-control" id="employe" readonly>
@@ -50,14 +50,14 @@
<input type="url" class="form-control" id="lien_zoom" readonly > <input type="url" class="form-control" id="lien_zoom" readonly >
</div> </div>
<div class="form-check mb-2"> <div class="form-check mb-2">
<label class="form-check-label">Besoin d'un ordinateur</label> <label class="form-check-label">Besoin d'un ordinateur {{ reservation.statut }}</label>
<input type="checkbox" class="form-check-input" id="besoin_ordinateur" readonly > <input type="checkbox" class="form-check-input" id="besoin_ordinateur" readonly >
</div> </div>
<div class='d-flex justify-content-around mt-2'> <div class='d-flex justify-content-around mt-2'>
{% 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 appartient_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 %}

View File

@@ -87,8 +87,6 @@ Veuillez vous connecter à la plateforme pour plus de détails.""",
formulaire_reservation = ReservationForm() formulaire_reservation = ReservationForm()
departement = employe.departement departement = employe.departement
appartient_direction = request.user.groups.filter(name='direction').exists()
liste_demande_reservation = Reservation.objects.filter( liste_demande_reservation = Reservation.objects.filter(
employe=employe, employe=employe,
statut='en_attente' statut='en_attente'
@@ -98,7 +96,7 @@ Veuillez vous connecter à la plateforme pour plus de détails.""",
'formulaire_reservation': formulaire_reservation, 'formulaire_reservation': formulaire_reservation,
'nb_reservation_attente': Reservation.objects.filter(statut='en_attente').count(), 'nb_reservation_attente': Reservation.objects.filter(statut='en_attente').count(),
'appartient_au_departement_informatique': departement and departement.nom == "Systeme informatique", 'appartient_au_departement_informatique': departement and departement.nom == "Systeme informatique",
'appartient_direction': appartient_direction, 'appartient_direction': request.user.groups.filter(name='direction').exists(),
'liste_demande_reservation': list(liste_demande_reservation), 'liste_demande_reservation': list(liste_demande_reservation),
} }
@@ -147,12 +145,10 @@ def liste_reservation_attente(request):
return JsonResponse(liste_reservation, safe=False) return JsonResponse(liste_reservation, safe=False)
def detail_reservation(request:HttpRequest, reservation_id:int): def detail_reservation(request:HttpRequest, reservation_id:int):
reservation = Reservation.objects.get(id=reservation_id) reservation = Reservation.objects.get(id=reservation_id)
employe = reservation.employe.user employe = reservation.employe.user
reservation_json = { reservation_json = {
'id_reservation': reservation_id, 'id_reservation': reservation_id,
'employe': f"{employe.first_name} {employe.last_name}", 'employe': f"{employe.first_name} {employe.last_name}",
'salle': reservation.salle, 'salle': reservation.salle,
@@ -227,7 +223,7 @@ def valider_reservation(request: HttpRequest):
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 {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] destinataires = [reservation.employe.user.email]
) )