"""Views pour la gestion des véhicules.""" from django.shortcuts import render, redirect from django.http import JsonResponse from authentification.models import Profile from django.contrib.auth.models import Group from django.contrib.auth.decorators import login_required from . import forms from . import models @login_required(login_url="login") def index(request): """Page d'accueil de la gestion des véhicules. Parameters ---------- request : HttpRequest La requête HTTP reçue. Returns ------- HttpResponse La réponse HTTP avec le rendu de la page d'accueil de la gestion des véhicules. """ formulaire_enregistrer_vehicule = forms.EnregistrerVehicule() formulaire_demande_vehicule = forms.EnregistrerDemande() parc_vehicule = models.Vehicule.objects.all().order_by("-id") return render( request, "gestion_vehicule/index.html", { "formulaire_enregistrer_vehicule": formulaire_enregistrer_vehicule, "parc_vehicule": parc_vehicule, "formulaire_demande_vehicule": formulaire_demande_vehicule, }, ) @login_required(login_url="login") def enregistrer_voiture(request): """Enregistrer un nouveau véhicule dans le système. Parameters ---------- request : HttpRequest La requête HTTP reçue. Returns ------- HttpResponseRedirect Redirige vers la page d'accueil de la gestion des véhicules après l'enregistrement du véhicule. """ if request.method == "POST": form_enregistrement = forms.EnregistrerVehicule( request.POST, request.FILES, ) if form_enregistrement.is_valid: form_enregistrement.save() return redirect("gestion_vehicule:index") return None @login_required(login_url="login") def enregistrer_demande(request): """Enregistrer une nouvelle demande de véhicule. Parameters ---------- request : HttpRequest La requête HTTP reçue. Returns ------- JsonResponse Une réponse JSON indiquant le succès ou l'échec de l'enregistrement de la demande de véhicule. """ if request.method == "POST": form_demande = forms.EnregistrerDemande(request.POST) if form_demande.is_valid(): form = form_demande.save(commit=False) form.nom_passager = request.user.profile form.save() models.CarnetBord.objects.create( course=models.DemandeVehicule.objects.get(id=form.id) ) return JsonResponse( {"success": True, "message": "Demande enregistrée avec succès"} ) return JsonResponse( { "success": False, "message": ( "Une erreur s'est produit lors de " "l'enregistrement de la demande" ), } ) return None @login_required(login_url="login") def liste_demande(request): """Afficher la liste des demandes de véhicules. La liste des demandes affichées dépend du groupe de l'utilisateur connecté: - Si l'utilisateur appartient au groupe "Chauffeur", seules les demandes qui lui sont assignées sont affichées. - Sinon, toutes les demandes de véhicules sont affichées. Parameters ---------- request : HttpRequest La requête HTTP reçue. Returns ------- JsonResponse Une réponse JSON contenant la liste des demandes de véhicules. """ liste_demande_vehicule = [] if request.user.groups.filter(name="Chauffeur").exists(): liste_demande_vehicule = models.DemandeVehicule.objects.filter( chauffeur__user_id=request.user.id ) else: liste_demande_vehicule = models.DemandeVehicule.objects.all() demandes_en_cours = [] parc_vehicule = [ {"id": vehicule.id, "immatriculation": vehicule.immatriculation} for vehicule in models.Vehicule.objects.filter(disponible=True) ] chauffeur_group = Group.objects.get(name="Chauffeur") chauffeurs = [ { "chauffeur_id": chauffeur.user.id, "chauffeur_name": ( f"{chauffeur.user.first_name} {chauffeur.user.last_name}" ), } for chauffeur in Profile.objects.filter(user__groups=chauffeur_group) ] demandes_en_cours = [ { "id_demande": demande.id, "nom_passager": ( f"{demande.nom_passager.user.first_name} " f"{demande.nom_passager.user.last_name}" ), "lieu_depart": demande.lieu_depart, "date_heure_depart": demande.date_heure.strftime("%d/%m/%Y %H:%M"), "lieu_arrivee": demande.lieu_arrive, "validation": demande.validation, "vehicule": parc_vehicule, "chauffeurs": chauffeurs, "motif_refus": demande.motif_refus, "user_id": demande.nom_passager.user.id, "is_logisticien": ( request.user.profile.departement .nom_departement == "Logistique" ), "is_chauffeur": ( request.user.groups.filter(name="Chauffeur") .exists() ), } for demande in liste_demande_vehicule ] return JsonResponse(demandes_en_cours, safe=False) def detail_course(request, id_demande): """Afficher les détails d'une demande de véhicule spécifique. Parameters ---------- request : HttpRequest La requête HTTP reçue. id_demande : int L'identifiant de la demande de véhicule. Returns ------- HttpResponse La réponse HTTP avec le rendu de la page de détails de la demande de véhicule. """ la_demande = models.DemandeVehicule.objects.get(id=id_demande) vehicule = la_demande.vehicule details_course = models.CarnetBord.objects.get(course=la_demande) print("Détails course:", la_demande.id) return render( request, "gestion_vehicule/detail_course.html", { "detail_demande": { "id": la_demande.id, "nom_passager": ( f"{la_demande.nom_passager.user.first_name} " f"{la_demande.nom_passager.user.last_name}" ), "lieu_depart": la_demande.lieu_depart, "date_heure": la_demande.date_heure, "lieu_arrive": la_demande.lieu_arrive, "immatriculation": la_demande.vehicule.immatriculation, "id_vehicule": la_demande.vehicule.id, "details_course": details_course, "prise_carburant_formulaire": forms.PriseCarburant( initial={"vehicule": vehicule.immatriculation} ), }, }, ) @login_required(login_url="login") def statut_demande(request): """Mettre à jour le statut d'une demande de véhicule. Parameters ---------- request : HttpRequest La requête HTTP reçue. request.id-demande : int L'identifiant de la demande de véhicule à mettre à jour. request.radioValider : str Le statut de validation de la demande ("Valider", "Refuser", ou autre). request.vehicule : int L'identifiant du véhicule assigné (si validée). request.chauffeur : int L'identifiant du chauffeur assigné (si validée). request.motif : str Le motif de refus (si refusée). request.course_termine : str Indique si la course est terminée ("on" si cochée). request.date_heure_retour : str La date et l'heure de retour de la course (si terminée). request.heure_course_termine : str L'heure de fin de la course (si terminée). Returns ------- HttpResponseRedirect Redirige vers la page d'accueil de la gestion des véhicules après la mise à jour du statut de la demande. """ if request.method == "POST": demande = models.DemandeVehicule.objects.get( id=request.POST["id-demande"] ) if "radioValider" in request.POST: if request.POST["radioValider"] == "Valider": demande.validation = True demande.vehicule = models.Vehicule.objects.get( id=request.POST["vehicule"] ) demande.chauffeur = models.Profile.objects.get( user_id=request.POST["chauffeur"] ) elif request.POST["radioValider"] == "Refuser": demande.validation = False demande.motif_refus = request.POST["motif"] else: demande.validation = None if ( "course_termine" in request.POST and "date_heure_retour" in request.POST and request.POST["course_termine"] == "on" and request.POST["date_heure_retour"] != "" ): demande.course_terminer = True demande.heure_course_termine = request.POST["date_heure_retour"] demande.save() return redirect("gestion_vehicule:index") @login_required(login_url="login") def detail_voiture(request, vehicule_id): """Afficher les détails d'un véhicule spécifique. Parameters ---------- request : HttpRequest La requête HTTP reçue. vehicule_id : int L'identifiant du véhicule. Returns ------- HttpResponse La réponse HTTP avec le rendu de la page de détails du véhicule. """ vehicule = models.Vehicule.objects.get(id=vehicule_id) return render( request, "gestion_vehicule/detail_vehicule.html", { "vehicule": vehicule, "carnet_bord_formulaire": forms.CarnetBord( initial={"vehicule": vehicule.immatriculation} ), }, ) @login_required(login_url="login") def enregistrer_prise_carburant(request, course_id): """Enregistrer une prise de carburant pour une course spécifique. Parameters ---------- request : HttpRequest La requête HTTP reçue. course_id : int L'identifiant de la course pour laquelle enregistrer la prise de carburant. Returns ------- HttpResponseRedirect Redirige vers la page de détails de la course après l'enregistrement de la prise de carburant. """ course = models.DemandeVehicule(id=course_id) if request.method == "POST": prise_carburant = forms.PriseCarburant(request.POST) if prise_carburant.is_valid(): d = prise_carburant.save(commit=False) d.course = course d.save() return redirect("gestion_vehicule:detail-course", id_demande=course_id) @login_required(login_url="login") def carnet_carburant(request, vehicule_id): """Afficher le carnet de carburant d'un véhicule spécifique. Parameters ---------- request : HttpRequest La requête HTTP reçue. vehicule_id : int L'identifiant du véhicule. Returns ------- HttpResponse La réponse HTTP avec le rendu de la page du carnet de carburant du véhicule. """ return render( request, "gestion_vehicule/carnet_carburant.html", { "id_vehicule": vehicule_id } ) def carnet_sortie_vehicule(request, vehicule_id): """Afficher le carnet de sortie d'un véhicule spécifique. Parameters ---------- request : HttpRequest La requête HTTP reçue. vehicule_id : int L'identifiant du véhicule. Returns ------- HttpResponse La réponse HTTP avec le rendu de la page du carnet de sortie du véhicule. """ return render( request, "gestion_vehicule/carnet_sortie_vehicule.html", {"id_vehicule": vehicule_id}, ) @login_required(login_url="login") def filtre_carnet_carburant(request): """Filtrer les prises de carburant d'un véhicule pour un mois spécifique. Parameters ---------- request : HttpRequest La requête HTTP reçue. request.id_vehicule : int L'identifiant du véhicule. request.mois : str Le mois au format "YYYY-MM". Returns ------- JsonResponse Une réponse JSON contenant la liste des prises de carburant filtrées. """ id_vehicule = request.GET["id_vehicule"] annee, mois = request.GET["mois"].split("-") prises_carburant = models.CarnetCarburant.objects.filter( course__vehicule=models.Vehicule.objects.get(id=id_vehicule), date__year=annee, date__month=mois, ) mon_carnet = [ { "date": p.date, "nom_station": p.nom_station, "type_carburant": p.type_carburant, "litre": p.litre, "prix": p.prix, "montant_total": p.litre * p.prix, "kilometrage": p.kilometrage, "observation": p.observation, "nom_chauffeur": ( f"{p.course.chauffeur.user.first_name} " f"{p.course.chauffeur.user.last_name}" ), } for p in prises_carburant ] return JsonResponse(mon_carnet, safe=False) def filtre_sortie_vehicule(request): """Filtrer les sorties d'un véhicule pour un mois spécifique. Parameters ---------- request : HttpRequest La requête HTTP reçue. request.id_vehicule : int L'identifiant du véhicule. request.mois : str Le mois au format "YYYY-MM". Returns ------- JsonResponse Une réponse JSON contenant la liste des sorties de véhicule filtrées. """ id_vehicule = request.GET["id_vehicule"] annee, mois = request.GET["mois"].split("-") sortie_vehicule = models.CarnetBord.objects.filter( course__vehicule=models.Vehicule.objects.get(id=id_vehicule), heure_effectif_depart__year=annee, heure_effectif_depart__month=mois, ) mes_sorties = [ { "nom_passager": ( f"{p.course.nom_passager.user.first_name} " f"{p.course.nom_passager.user.last_name}" ), "lieu_depart": p.course.lieu_depart, "heure_depart_prevu": p.course.date_heure, "heure_depart_effectif": p.heure_effectif_depart, "lieu_arrive": p.course.lieu_arrive, "heure_arrive": p.heure_arrive, "nom_chauffeur": ( f"{p.course.chauffeur.user.first_name} " f"{p.course.chauffeur.user.last_name}" ), } for p in sortie_vehicule ] return JsonResponse(mes_sorties, safe=False) @login_required(login_url="login") def enregistrer_carnet_bord(request, vehicule_id): """Enregistrer ou mettre à jour le carnet de bord d'un véhicule. Parameters ---------- request : HttpRequest La requête HTTP reçue. request.mois_concerne : str Le mois concerné au format "YYYY-MM". request.km_debut_mois : int Le kilométrage au début du mois. request.km_fin_mois : int Le kilométrage à la fin du mois. vehicule_id : int L'identifiant du véhicule. Returns ------- HttpResponseRedirect Redirige vers la page de détails du véhicule après l'enregistrement ou la mise à jour du carnet de bord. """ if request.method == "POST": annee, mois = request.POST["mois_concerne"].split("-") carnet_bord, created = models.CarnetBord.objects.update_or_create( mois_concerne="-".join([annee, mois, "01"]), defaults={ "km_debut_mois": request.POST["km_debut_mois"], "km_fin_mois": request.POST["km_fin_mois"], "vehicule": models.Vehicule.objects.get(id=vehicule_id), }, ) if created: print("Création effectuée") else: print("Mise à jour effectué") return redirect(detail_voiture, vehicule_id) @login_required(login_url="login") def carnet_vehicule_information(request, mois_concerne): # noqa: ARG001 """Récupérer les informations du carnet de bord pour un mois spécifique. Parameters ---------- request : HttpRequest La requête HTTP reçue. mois_concerne : str Le mois concerné au format "YYYY-MM". Returns ------- JsonResponse Une réponse JSON contenant les informations du carnet de bord pour le mois spécifié. """ annee, mois = mois_concerne.split("-") try: carnet_bord = models.CarnetBord.objects.get( mois_concerne="-".join([annee, mois, "01"]) ) except models.CarnetBord.DoesNotExist: carnet_dict = {} else: carnet_dict = { "km_debut": carnet_bord.km_debut_mois, "km_fin": carnet_bord.km_fin_mois, } return JsonResponse(carnet_dict) def enregistrer_information_course_depart(request, id_demande): """Enregistrer les informations de départ d'une course spécifique. Parameters ---------- request : HttpRequest La requête HTTP reçue. id_demande : int L'identifiant de la demande de véhicule. Returns ------- HttpResponseRedirect Redirige vers la page de détails de la course après l'enregistrement des informations de départ. """ demande = models.DemandeVehicule.objects.get(id=id_demande) vehicule = models.Vehicule.objects.get(id=request.POST["id-vehicule"]) course = models.CarnetBord.objects.get(course=demande) course.vehicule = vehicule course.course = demande course.heure_effectif_depart = request.POST["heure-depart"] course.km_depart = request.POST["kilometrage_depart"] course.save() return redirect("gestion_vehicule:detail-course", id_demande) def enregistrer_information_course_arrive(request, id_demande): """Enregistrer les informations d'arrivée d'une course spécifique. Parameters ---------- request : HttpRequest La requête HTTP reçue. id_demande : int L'identifiant de la demande de véhicule. Returns ------- HttpResponseRedirect Redirige vers la page de détails de la course après l'enregistrement des informations d'arrivée. """ demande = models.DemandeVehicule.objects.get(id=id_demande) vehicule = models.Vehicule.objects.get(id=demande.vehicule.id) course_termier = False if "course_terminer" in request.POST: course_termier = True course = models.CarnetBord.objects.get(course=demande) course.vehicule = vehicule course.course = demande course.heure_arrive = request.POST["heure-effectif-arrivee"] course.km_arrive = request.POST["kilometrage-arrivee"] course.course_termine = course_termier course.save() return redirect("gestion_vehicule:detail-course", id_demande)