Mon commit initial
This commit is contained in:
334
SGL/views.py
Normal file
334
SGL/views.py
Normal file
@@ -0,0 +1,334 @@
|
||||
"""Fichier views.py de gestion de la page dashboard de l'application SGL.
|
||||
|
||||
Principales fonctionnalités couvertes :
|
||||
1- Gestion des stocks des produits (rupture, pré-rupture, normal).
|
||||
2- Affichage des commandes en cours et validations des dites commandes
|
||||
3- Affichage des demandes en cours et validations des dites demandes.
|
||||
"""
|
||||
|
||||
from django.shortcuts import render, redirect
|
||||
from django.http import JsonResponse
|
||||
from gestion_produit.models import Commander, Demander, Produit
|
||||
from django.views.decorators.csrf import csrf_exempt
|
||||
from django.contrib.auth.decorators import login_required
|
||||
|
||||
import json
|
||||
|
||||
from gestion_produit.views import calcul_stock_produit
|
||||
|
||||
|
||||
def dashboard_quantite_produit():
|
||||
"""Calculez les quantités des produits en rupture, pré-rupture et normal.
|
||||
|
||||
Returns
|
||||
-------
|
||||
dict
|
||||
Dictionnaire contenant les nombres et les listes des produits par
|
||||
catégorie.
|
||||
|
||||
"""
|
||||
tous_les_produits = Produit.objects.all()
|
||||
|
||||
nombre_rupture = 0
|
||||
nombre_pre_rupture = 0
|
||||
nombre_normal = 0
|
||||
|
||||
produit_rupture = []
|
||||
produit_pre_rupture = []
|
||||
produit_normal = []
|
||||
|
||||
for produit in tous_les_produits:
|
||||
stock_actuel = calcul_stock_produit(produit)
|
||||
stock_actuel.pop("image")
|
||||
if stock_actuel["stockActuel"] == 0:
|
||||
nombre_rupture += 1
|
||||
produit_rupture.append(stock_actuel)
|
||||
elif stock_actuel["stockActuel"] < produit.seuil_pre_rupture:
|
||||
nombre_pre_rupture += 1
|
||||
produit_pre_rupture.append(stock_actuel)
|
||||
else:
|
||||
nombre_normal += 1
|
||||
produit_normal.append(stock_actuel)
|
||||
|
||||
return {
|
||||
"nombre_rupture": nombre_rupture,
|
||||
"nombre_pre_rupture": nombre_pre_rupture,
|
||||
"nombre_normal": nombre_normal,
|
||||
"produit_rupture": produit_rupture,
|
||||
"produit_pre_rupture": produit_pre_rupture,
|
||||
"produit_normale": produit_normal,
|
||||
}
|
||||
|
||||
|
||||
@login_required(login_url="authentification:login")
|
||||
def index(request):
|
||||
"""Vue pour la page d'accueil du dashboard.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
request : HttpRequest
|
||||
La requête HTTP entrante.
|
||||
|
||||
Returns
|
||||
-------
|
||||
HttpResponse
|
||||
La réponse HTTP contenant la page d'accueil du dashboard.
|
||||
|
||||
"""
|
||||
if request.user.groups.filter(name="Chauffeur").exists():
|
||||
return redirect("gestion_vehicule:index")
|
||||
|
||||
if not request.user.groups.filter(name="Administration").exists():
|
||||
return redirect("gestion_produit:index")
|
||||
|
||||
commandes_en_cours = Commander.objects.filter(livrer=False)
|
||||
demandes_en_cours = Demander.objects.filter(
|
||||
valider_par_chef=True, valider_par_logisticien=None
|
||||
)
|
||||
|
||||
gestion_quantite_produit = dashboard_quantite_produit()
|
||||
|
||||
nombre_rupture = gestion_quantite_produit["nombre_rupture"]
|
||||
nombre_pre_rupture = gestion_quantite_produit["nombre_pre_rupture"]
|
||||
nombre_normal = gestion_quantite_produit["nombre_normal"]
|
||||
|
||||
return render(
|
||||
request,
|
||||
"index.html",
|
||||
{
|
||||
"nb_commande": len(commandes_en_cours),
|
||||
"nb_demande": len(demandes_en_cours),
|
||||
"nombre_rupture": nombre_rupture,
|
||||
"nombre_pre_rupture": nombre_pre_rupture,
|
||||
"nombre_normal": nombre_normal,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@login_required(login_url="login")
|
||||
def produit_a_rendre(request): #noqa: ARG001
|
||||
"""Vue pour obtenir la liste des équipements à rendre.
|
||||
|
||||
Cette vue est appelée via une requête AJAX et renvoie une liste
|
||||
d'équipements qui doivent être rendus.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
request : HttpRequest
|
||||
La requête HTTP entrante.
|
||||
|
||||
Returns
|
||||
-------
|
||||
JsonResponse
|
||||
Une réponse JSON contenant la liste des équipements à rendre.
|
||||
|
||||
"""
|
||||
equipement_a_rendre = Demander.objects.filter(a_rendre=True, rendu=False)
|
||||
liste_equipement = [
|
||||
{
|
||||
"id_demande": equipement.id,
|
||||
"produit": equipement.produit.libelle,
|
||||
"quantite": equipement.quantite,
|
||||
"detenteur": (
|
||||
f"{equipement.user.user.first_name} "
|
||||
f"{equipement.user.user.last_name}"
|
||||
),
|
||||
"action": equipement.rendu,
|
||||
}
|
||||
for equipement in equipement_a_rendre
|
||||
]
|
||||
|
||||
return JsonResponse(liste_equipement, safe=False)
|
||||
|
||||
@login_required(login_url="login")
|
||||
@csrf_exempt
|
||||
def produit_a_rendre_update(request):
|
||||
"""Vue pour mettre à jour le statut des équipements à rendre.
|
||||
|
||||
Lorsqu'une requête POST est reçue, cette vue met à jour le statut
|
||||
des équipements à rendre en fonction des données fournies dans la
|
||||
requête.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
request : HttpRequest
|
||||
request.id_demande : int
|
||||
L'identifiant de la demande d'équipement à mettre à jour.
|
||||
request.action : bool
|
||||
Le nouveau statut de rendu de l'équipement.
|
||||
|
||||
Returns
|
||||
-------
|
||||
JsonResponse
|
||||
Une réponse JSON indiquant le succès de l'opération.
|
||||
|
||||
"""
|
||||
if request.method == "POST":
|
||||
data = json.loads(request.body)
|
||||
for d in data:
|
||||
demande = Demander.objects.get(id=d["id_demande"])
|
||||
demande.rendu = d["action"]
|
||||
demande.save()
|
||||
|
||||
return JsonResponse(
|
||||
{"status": "success", "message": "Produits mis à jour"}
|
||||
)
|
||||
|
||||
@login_required(login_url="login")
|
||||
def liste_produit_rupture(request):
|
||||
"""Vue pour obtenir la liste des produits en fonction de leur type.
|
||||
|
||||
Cette vue est appelée via une requête AJAX à chaque fois que l'on clique
|
||||
sur un cadran (rupture, pré-rupture, en stock normal) et renvoie une liste
|
||||
de produits en fonction du type spécifié dans les paramètres de la
|
||||
requête.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
request : HttpRequest
|
||||
request.type : str
|
||||
Le statut de produits à récupérer qui sont en "rupture",
|
||||
"pre_rupture" ou "normal".
|
||||
|
||||
Returns
|
||||
-------
|
||||
JsonResponse
|
||||
Une réponse JSON contenant la liste des produits correspondant
|
||||
au type spécifié.
|
||||
|
||||
"""
|
||||
type_encadrer = request.GET["type"]
|
||||
dashboard_gestion = dashboard_quantite_produit()
|
||||
|
||||
donnees_charger = []
|
||||
|
||||
if type_encadrer == "rupture":
|
||||
donnees_charger = dashboard_gestion["produit_rupture"]
|
||||
elif type_encadrer == "pre_rupture":
|
||||
donnees_charger = dashboard_gestion["produit_pre_rupture"]
|
||||
elif type_encadrer == "normal":
|
||||
donnees_charger = dashboard_gestion["produit_normale"]
|
||||
|
||||
return JsonResponse(donnees_charger, safe=False)
|
||||
|
||||
@login_required(login_url="login")
|
||||
def liste_produit_commander(request):
|
||||
"""Listez des produits commandés non encore livrés.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
request : HttpRequest
|
||||
La requête HTTP entrante.
|
||||
|
||||
Returns
|
||||
-------
|
||||
JsonResponse
|
||||
Une réponse JSON contenant la liste des produits commandés
|
||||
non encore livrés.
|
||||
|
||||
"""
|
||||
commandes_en_cours = Commander.objects.filter(livrer=False)
|
||||
ma_liste_commandes = [
|
||||
{
|
||||
"id_commande": commande.id,
|
||||
"produit": commande.produit.libelle,
|
||||
"quantite": commande.quantite_commander,
|
||||
"date_commande": commande.date_commande,
|
||||
"date_livraison": commande.date_livraison,
|
||||
"fournisseur": commande.fournisseur.nom_entreprise,
|
||||
"is_logisticien": (
|
||||
request.user.profile.departement.
|
||||
nom_departement == "Logistique"
|
||||
),
|
||||
}
|
||||
for commande in commandes_en_cours
|
||||
]
|
||||
|
||||
return JsonResponse(ma_liste_commandes, safe=False)
|
||||
|
||||
|
||||
@login_required(login_url="login")
|
||||
@csrf_exempt
|
||||
def enregistrer_livraison_produit(request):
|
||||
"""Enregistrez la livraison d'un produit commandé.
|
||||
|
||||
Lorsqu'une requête POST est reçue, cette vue met à jour le statut
|
||||
de livraison du produit commandé en fonction de l'identifiant de la
|
||||
commande fourni dans la requête.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
request : HttpRequest
|
||||
request.id_commande : int
|
||||
L'identifiant de la commande dont la livraison doit
|
||||
être enregistrée.
|
||||
|
||||
Returns
|
||||
-------
|
||||
JsonResponse
|
||||
Une réponse JSON indiquant le succès ou l'échec de l'opération.
|
||||
|
||||
"""
|
||||
if request.method == "POST":
|
||||
id_commande = request.POST.get("id_commande")
|
||||
try:
|
||||
commande = Commander.objects.get(id=id_commande)
|
||||
commande.livrer = True
|
||||
commande.save()
|
||||
return JsonResponse(
|
||||
{
|
||||
"status": "success",
|
||||
"message": "Livraison enregistrée avec succès."
|
||||
}
|
||||
)
|
||||
except Commander.DoesNotExist:
|
||||
return JsonResponse(
|
||||
{"status": "error", "message": "Commande non trouvée."}
|
||||
)
|
||||
return JsonResponse(
|
||||
{"status": "error", "message": "Méthode non autorisée."}
|
||||
)
|
||||
|
||||
|
||||
@login_required(login_url="login")
|
||||
def liste_demandes(request):
|
||||
"""Listez des demandes en cours de validation.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
request : HttpRequest
|
||||
La requête HTTP entrante.
|
||||
|
||||
Returns
|
||||
-------
|
||||
JsonResponse
|
||||
Une réponse JSON contenant la liste des demandes en cours
|
||||
de validation.
|
||||
|
||||
"""
|
||||
demandes_en_cours = Demander.objects.filter(
|
||||
valider_par_chef=True, valider_par_logisticien=None
|
||||
)
|
||||
is_logisticien = (
|
||||
request.user.profile.departement.nom_departement == "Logistique"
|
||||
)
|
||||
ma_liste_demandes = [
|
||||
{
|
||||
"id_demande": demande.id,
|
||||
"demandeur": (
|
||||
f"{demande.user.user.first_name} "
|
||||
f"{demande.user.user.last_name}"
|
||||
),
|
||||
"produit": demande.produit.libelle,
|
||||
"quantite": demande.quantite,
|
||||
"motifs": demande.motifs,
|
||||
"date_de_mise_a_dispo_souhaite": demande.date_de_mise_a_dispo_souhaite.strftime("%Y-%m-%d"),
|
||||
"a_rendre": demande.a_rendre,
|
||||
"valider_par_chef": demande.valider_par_chef,
|
||||
"valider_par_logisticien": demande.valider_par_logisticien,
|
||||
"is_logisticien": is_logisticien,
|
||||
}
|
||||
for demande in demandes_en_cours
|
||||
]
|
||||
|
||||
return JsonResponse(ma_liste_demandes, safe=False)
|
||||
Reference in New Issue
Block a user