Ajout de la prise en charge des photos de profil
This commit is contained in:
225
gestion_conge/views.py
Normal file
225
gestion_conge/views.py
Normal file
@@ -0,0 +1,225 @@
|
||||
import json
|
||||
from django.http import JsonResponse
|
||||
from django.shortcuts import redirect, render
|
||||
from django.contrib import messages
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from gestion_conge.forms import CongeForm
|
||||
from gestion_employe.models import Affectation, Employe
|
||||
from django.forms.models import model_to_dict
|
||||
from django.utils import timezone
|
||||
from django.db.models import Q
|
||||
from fonction_utilitaire import fonctions_utilitaire
|
||||
from .models import Conge
|
||||
|
||||
@login_required
|
||||
def index(request):
|
||||
"""Vue de gestion de l'index"""
|
||||
|
||||
employe = Employe.objects.get(user__username = request.user)
|
||||
membre_direction = 'direction' in employe.user.groups.values_list('name', flat=True)
|
||||
|
||||
try:
|
||||
affectation = Affectation.objects.get(employe = employe, date_fin_daffectation__gte = timezone.now().date())
|
||||
except Affectation.DoesNotExist:
|
||||
affectation = None
|
||||
|
||||
try:
|
||||
projet = Affectation.objects.get(employe=employe, date_fin_daffectation__gte = timezone.now().date())
|
||||
except Affectation.DoesNotExist:
|
||||
pass
|
||||
|
||||
if employe.chef:
|
||||
nombre_conges_valide = Conge.objects.filter(validation_hierarchique = True, employe__departement = employe.departement).count()
|
||||
nombre_conges_refuse = Conge.objects.filter(validation_hierarchique = False, employe__departement = employe.departement).count()
|
||||
conges_en_attente = Conge.objects.filter(validation_hierarchique = None, employe__departement = employe.departement).order_by('-date_demande')
|
||||
|
||||
elif membre_direction:
|
||||
nombre_conges_valide = Conge.objects.filter(validation_direction = True).count()
|
||||
nombre_conges_refuse = Conge.objects.filter(validation_direction = False).count()
|
||||
conges_en_attente = Conge.objects.filter(validation_hierarchique = True, validation_direction = None).order_by('-date_demande')
|
||||
|
||||
elif affectation and affectation.role == "chef_projet":
|
||||
employes_du_projet = Affectation.objects.filter(
|
||||
projet = projet.projet,
|
||||
date_fin_daffectation__gte = timezone.now().date()
|
||||
).values('employe')
|
||||
|
||||
nombre_conges_valide = Conge.objects.filter(
|
||||
employe__in = employes_du_projet,
|
||||
validation_hierarchique = True
|
||||
).count()
|
||||
|
||||
nombre_conges_refuse = Conge.objects.filter(
|
||||
Q(employe__in = employes_du_projet) &
|
||||
(Q(validation_hierarchique = False) | Q(validation_direction = False))
|
||||
).count()
|
||||
|
||||
conges_en_attente = Conge.objects.filter(
|
||||
Q(employe__in = employes_du_projet) &
|
||||
(
|
||||
Q(validation_hierarchique__isnull = True) | Q(validation_direction__isnull = True)
|
||||
)
|
||||
).exclude(
|
||||
Q(validation_hierarchique = True) | Q(validation_hierarchique = False) |
|
||||
Q(validation_direction = True) | Q(validation_direction = False)
|
||||
).order_by('-date_demande')
|
||||
|
||||
else:
|
||||
nombre_conges_valide = Conge.objects.filter(
|
||||
employe=employe,
|
||||
validation_direction = True
|
||||
).count()
|
||||
|
||||
nombre_conges_refuse = Conge.objects.filter(Q(employe=employe) & (
|
||||
Q(validation_direction = False) | Q(validation_hierarchique = False)
|
||||
)).count()
|
||||
|
||||
conges_en_attente = Conge.objects.filter(
|
||||
Q(employe = employe) &
|
||||
(
|
||||
Q(validation_direction__isnull = True) | Q(validation_hierarchique__isnull = True)
|
||||
)
|
||||
).exclude(
|
||||
Q(validation_hierarchique = True) | Q(validation_hierarchique = False)
|
||||
).order_by('-date_demande')
|
||||
|
||||
|
||||
return render(request, 'gestion_conge/index.html', {
|
||||
"nombre_conges_valide": nombre_conges_valide,
|
||||
"nombre_conges_refuse": nombre_conges_refuse,
|
||||
"nombre_conges_en_attente": conges_en_attente.count(),
|
||||
"formulaire_demande_conge": CongeForm,
|
||||
"employe_est_il_chef": employe.chef,
|
||||
"membre_de_la_direction": membre_direction,
|
||||
"est_chef_projet": affectation.role == "chef_projet" if affectation else False,
|
||||
})
|
||||
|
||||
@login_required
|
||||
def demander_conge(request):
|
||||
"""Vue de gestion des demandes de congés"""
|
||||
try:
|
||||
employe = Employe.objects.get(user__username = request.user)
|
||||
except Employe.DoesNotExist:
|
||||
messages.error(request, "Votre demande de congé a échoué car votre profil Utilisateur n'est lié à aucun profil Employé. Veuillez contacter l'administrateur.")
|
||||
return redirect("gestion_conges:conge")
|
||||
|
||||
retour_quota = fonctions_utilitaire.solde_conge(employe)
|
||||
if retour_quota["success"]:
|
||||
quota_annuel = retour_quota['quota_annuel']
|
||||
else:
|
||||
messages.error(request, retour_quota['message'])
|
||||
return redirect("gestion_conges:conge")
|
||||
|
||||
if request.method == "POST":
|
||||
form = CongeForm(request.POST, request.FILES)
|
||||
if form.is_valid():
|
||||
conge_obj = form.save(commit=False)
|
||||
conge_obj.employe = employe
|
||||
|
||||
if conge_obj.type == "conge_annuel":
|
||||
if retour_quota["nombre_jours_valide"] + conge_obj.nombre_jours > quota_annuel:
|
||||
messages.error(request, "Quota annuel dépassé (30 jours max).")
|
||||
return redirect("gestion_conges:conge")
|
||||
|
||||
conge_obj.save()
|
||||
messages.success(request, "Votre demande de congé a été enregistrée.")
|
||||
return redirect("gestion_conges:conge")
|
||||
|
||||
return redirect("gestion_conges:conge")
|
||||
|
||||
@login_required
|
||||
def liste_demande_conges(request):
|
||||
"""Vue de liste des demandes de congés en attente de validation selon le statut de l'utilisateur actuel"""
|
||||
try:
|
||||
employe = Employe.objects.get(user__username = request.user)
|
||||
except Employe.DoesNotExist:
|
||||
return JsonResponse({
|
||||
"success": False,
|
||||
"message": "Votre profil Utilisateur n'est lié à aucun profil Employé. Veuillez contacter l'administrateur."
|
||||
})
|
||||
|
||||
try:
|
||||
affectation = Affectation.objects.get(
|
||||
employe=employe,
|
||||
date_fin_daffectation__gte=timezone.now().date()
|
||||
)
|
||||
except Affectation.DoesNotExist:
|
||||
affectation = None
|
||||
|
||||
if employe.chef:
|
||||
print("chef")
|
||||
conges_en_attente = Conge.objects.filter(
|
||||
employe__departement = employe.departement,
|
||||
validation_hierarchique = None
|
||||
).order_by('-date_demande')
|
||||
|
||||
elif affectation and affectation.role == "chef_projet":
|
||||
employes_du_projet = Affectation.objects.filter(
|
||||
projet = affectation.projet,
|
||||
date_fin_daffectation__gte = timezone.now().date()
|
||||
).values('employe')
|
||||
|
||||
conges_en_attente = Conge.objects.filter(
|
||||
employe__in = employes_du_projet,
|
||||
validation_hierarchique = None
|
||||
).order_by('-date_demande')
|
||||
|
||||
elif 'direction' in employe.user.groups.values_list('name', flat=True):
|
||||
conges_en_attente = Conge.objects.filter(
|
||||
validation_hierarchique = True,
|
||||
validation_direction = None
|
||||
).order_by('-date_demande')
|
||||
|
||||
else:
|
||||
conges_en_attente = Conge.objects.filter(
|
||||
employe__user__username = request.user
|
||||
).order_by('-date_demande')
|
||||
|
||||
return JsonResponse({
|
||||
"success": True,
|
||||
"data":[
|
||||
{
|
||||
**model_to_dict(conge),
|
||||
"prenom_nom": f"{conge.employe.user.first_name} {conge.employe.user.last_name}",
|
||||
"date_demande": conge.date_demande,
|
||||
"nombre_jours": conge.nombre_jours,
|
||||
"type": dict(conge.TYPE_CHOICES).get(conge.type),
|
||||
"solde_conge": fonctions_utilitaire.solde_conge(conge.employe)["quota_annuel"]
|
||||
}
|
||||
for conge in conges_en_attente]},
|
||||
safe=False
|
||||
)
|
||||
|
||||
@login_required
|
||||
def validation_de_conge(request):
|
||||
"""
|
||||
Vue de validation de conges par le superieur hierarchique.
|
||||
1- Si l'employe appartient à un département, le congé est validé par le chef de département.
|
||||
2- Si l'employé n'appartient pas à un département, le congé est validé par le chef de projet.
|
||||
"""
|
||||
request_data = json.loads(request.body)
|
||||
conge_id = request_data.get("id_conge", None)
|
||||
try:
|
||||
conge = Conge.objects.get(id=conge_id)
|
||||
except conge.DoesNotExist:
|
||||
return JsonResponse({"message": "Le congé selectionné n'existe pas."})
|
||||
|
||||
if request.method == "POST":
|
||||
validation_hierarchique = request_data.get("validation_hierarchique", None)
|
||||
validation_direction = request_data.get("validation_direction", None)
|
||||
motif_refus = request_data.get("motif_refus", "")
|
||||
|
||||
if validation_hierarchique is not None:
|
||||
conge.validation_hierarchique = True if validation_hierarchique == "valide" else False
|
||||
if validation_hierarchique == "refuse" and not motif_refus:
|
||||
return JsonResponse({"message": "Veuillez fournir un motif de refus."})
|
||||
conge.motif_refus = motif_refus if validation_hierarchique == "refuse" else ""
|
||||
|
||||
if validation_direction is not None:
|
||||
conge.validation_direction = True if validation_direction == "valide" else False
|
||||
if validation_direction == "refuse" and not motif_refus:
|
||||
return JsonResponse({"message": "Veuillez fournir un motif de refus."})
|
||||
conge.motif_refus = motif_refus if validation_direction == "refuse" else ""
|
||||
|
||||
conge.save()
|
||||
return JsonResponse({"message": "La décision a été enregistrée avec succès."})
|
||||
Reference in New Issue
Block a user