Modification produit
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -69,6 +69,7 @@
|
|||||||
|
|
||||||
<div class="row p-2 justify-content-around">
|
<div class="row p-2 justify-content-around">
|
||||||
{% for produit in page_obj %}
|
{% for produit in page_obj %}
|
||||||
|
<div class="col-3">
|
||||||
<div class="card p-2 mt-2" style="width: 13rem;">
|
<div class="card p-2 mt-2" style="width: 13rem;">
|
||||||
{% if produit.image %}
|
{% if produit.image %}
|
||||||
<img class="card-img-top m-auto d-block" src="{{ produit.image.url }}" style="width: 160px; height: 120px;" alt="{{ produit.libelle }}">
|
<img class="card-img-top m-auto d-block" src="{{ produit.image.url }}" style="width: 160px; height: 120px;" alt="{{ produit.libelle }}">
|
||||||
@@ -76,11 +77,10 @@
|
|||||||
<img class="card-img-top m-auto d-block" src="https://placehold.co/600x400" style="width: 160px; height: 120px;" alt="Image par défaut">
|
<img class="card-img-top m-auto d-block" src="https://placehold.co/600x400" style="width: 160px; height: 120px;" alt="Image par défaut">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<h5 class="card-title text-center">{{ produit.libelle }}</h5>
|
<h5 class="card-title text-center produitModifTitre" style="cursor: pointer;" data-idproduit={{ produit.id }}>{{ produit.libelle }}</h5>
|
||||||
<p class="categorie-produit" style="display: none;">{{ produit.categorie_id }} </p>
|
<p class="categorie-produit" style="display: none;">{{ produit.categorie_id }} </p>
|
||||||
{% if user|has_group:"Logisticien" %}
|
{% if user|has_group:"Logisticien" %}
|
||||||
<p class="card-text text-center">
|
<p class="card-text text-center">
|
||||||
<!-- <small>Soriba SYLLA</small> <br> -->
|
|
||||||
<small>Quantite en stock: {{ produit.stockActuel }}</small>
|
<small>Quantite en stock: {{ produit.stockActuel }}</small>
|
||||||
</p>
|
</p>
|
||||||
<button class="btn btn-warning d-block listeCommanderButton w-100" data-id="{{ produit.id }}">
|
<button class="btn btn-warning d-block listeCommanderButton w-100" data-id="{{ produit.id }}">
|
||||||
@@ -94,6 +94,7 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
{% empty %}
|
{% empty %}
|
||||||
<p class="text-center">Aucun produit disponible.</p>
|
<p class="text-center">Aucun produit disponible.</p>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
@@ -150,6 +151,54 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Modal pour la modification des informations des produits -->
|
||||||
|
<div class="modal fade" id="modifierProduitModal" tabindex="-1">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h1 class="modal-title fs-5" id="modifierProduitTitre">Modifier un produit</h1>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
<div id="messageZone"></div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<form id="modification-produit" data-url="{% url 'gestion_produit:enregistrement_modification_produit' %}" method="post" enctype="multipart/form-data">
|
||||||
|
{% csrf_token %}
|
||||||
|
<input type="hidden" id="modifIdProduit" name="id_produit">
|
||||||
|
<div class="form-group mb-2">
|
||||||
|
<label for="" class="form-label">Libellé :</label>
|
||||||
|
<input type="text" class="form-control" id="modifLibelle" name="libelle">
|
||||||
|
</div>
|
||||||
|
<div class="form-group mb-2">
|
||||||
|
<label for="" class="form-label">Quantité stock :</label>
|
||||||
|
<input type="number" class="form-control" id="modifQuantiteStock" name="quantite_stock">
|
||||||
|
</div>
|
||||||
|
<div class="form-group mb-2">
|
||||||
|
<label for="" class="form-label">Conditionnement :</label>
|
||||||
|
<select id="modifCondi" class="form-select" name="conditionnement">
|
||||||
|
<option value="boite">Boite</option>
|
||||||
|
<option value="paquet">Paquet</option>
|
||||||
|
<option value="piece">Pièce</option>
|
||||||
|
<option value="rouleau">Rouleau</option>
|
||||||
|
<option value="carton">Carton</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="form-group mb-2">
|
||||||
|
<label for="" class="form-label">Seuil de pré-rupture :</label>
|
||||||
|
<input type="number" class="form-control" id="modifSeuilPreRupture" name="seuil_pre_rupture">
|
||||||
|
</div>
|
||||||
|
<div class="form-group mb-2">
|
||||||
|
<label for="" class="form-label">Catégorie :</label>
|
||||||
|
<select id="modifCategorie" class="form-select" name="categorie"></select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Fermer</button>
|
||||||
|
<button type="submit" class="btn btn-outline-primary">Enregistrer</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Modal pour la création des catégories -->
|
<!-- Modal pour la création des catégories -->
|
||||||
|
|
||||||
<div class="modal fade" id="enregistrerCategorie" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
|
<div class="modal fade" id="enregistrerCategorie" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
|
||||||
|
|||||||
@@ -21,6 +21,16 @@ urlpatterns = [
|
|||||||
views.enregistrer_produit,
|
views.enregistrer_produit,
|
||||||
name="enregistrement_produit"
|
name="enregistrement_produit"
|
||||||
),
|
),
|
||||||
|
path(
|
||||||
|
"detailProduit/<int:id_produit>/",
|
||||||
|
views.detail_produit,
|
||||||
|
name="detail_produit"
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"enregistrer-modification-produit",
|
||||||
|
views.enregistrer_modification_produit,
|
||||||
|
name="enregistrement_modification_produit"
|
||||||
|
),
|
||||||
path(
|
path(
|
||||||
"enregistrerCommande",
|
"enregistrerCommande",
|
||||||
views.enregistrer_commande,
|
views.enregistrer_commande,
|
||||||
|
|||||||
@@ -168,7 +168,78 @@ def enregistrer_produit(request):
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
return redirect(index)
|
return redirect("gestion_produit:index")
|
||||||
|
|
||||||
|
@login_required(login_url="login")
|
||||||
|
def detail_produit(request, id_produit):
|
||||||
|
"""Renvoyez les détails d'un produit spécifique au format JSON.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
request : HttpRequest
|
||||||
|
La requête HTTP entrante.
|
||||||
|
id_produit : int
|
||||||
|
L'ID du produit dont on veut récupérer les détails.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
JsonResponse
|
||||||
|
Réponse JSON contenant les détails du produit.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
detail_produit = calcul_stock_produit(Produit.objects.get(id=id_produit))
|
||||||
|
|
||||||
|
categories = Categorie.objects.all()
|
||||||
|
|
||||||
|
produit = {
|
||||||
|
"detailId": detail_produit["id"],
|
||||||
|
"detailLibelle": detail_produit["libelle"],
|
||||||
|
"detailCategorie": detail_produit["categorie_id"],
|
||||||
|
"detailConditionnement": detail_produit["conditionnement"],
|
||||||
|
"detailSeuilPreRupture": detail_produit["seuil_pre_rupture"],
|
||||||
|
"detailQuantiteStock": detail_produit["stockActuel"],
|
||||||
|
"detailImage": detail_produit["image"].url if detail_produit["image"] else "",
|
||||||
|
"listeCategorie": [
|
||||||
|
{"id": categorie.id, "categorie": categorie.categorie}
|
||||||
|
for categorie in categories
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
return JsonResponse(produit)
|
||||||
|
|
||||||
|
@login_required(login_url="login")
|
||||||
|
def enregistrer_modification_produit(request):
|
||||||
|
"""Enregistrez les modifications apportées au produit à partir des données POST.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
request : HttpRequest
|
||||||
|
La requête HTTP entrante.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
JsonResponse
|
||||||
|
Réponse JSON indiquant le succès ou l'échec de l'enregistrement.
|
||||||
|
|
||||||
|
"""
|
||||||
|
if request.method == "POST":
|
||||||
|
id_produit = request.POST.get("id_produit")
|
||||||
|
produit_instance = Produit.objects.get(id=id_produit)
|
||||||
|
produit_instance.libelle = request.POST.get("libelle")
|
||||||
|
produit_instance.conditionnement = request.POST.get("conditionnement")
|
||||||
|
produit_instance.seuil_pre_rupture = request.POST.get("seuil_pre_rupture")
|
||||||
|
|
||||||
|
categorie_id = request.POST.get("categorie")
|
||||||
|
produit_instance.categorie = Categorie.objects.get(id=categorie_id)
|
||||||
|
produit_instance.quantite_stock = request.POST.get("quantite_stock")
|
||||||
|
produit_instance.save()
|
||||||
|
|
||||||
|
return JsonResponse(
|
||||||
|
{"success": True, "message": "Produit modifié avec succès"}
|
||||||
|
)
|
||||||
|
|
||||||
|
return redirect("gestion_produit:index")
|
||||||
|
|
||||||
@login_required(login_url="login")
|
@login_required(login_url="login")
|
||||||
def enregistrer_commande(request):
|
def enregistrer_commande(request):
|
||||||
|
|||||||
@@ -197,6 +197,67 @@ document.addEventListener('DOMContentLoaded', function () {
|
|||||||
location.reload()
|
location.reload()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// --------------------------- Modification produit --------------------------
|
||||||
|
const produitModifTitles = document.querySelectorAll(".produitModifTitre");
|
||||||
|
const modalModifProduit = new bootstrap.Modal($("modifierProduitModal"));
|
||||||
|
produitModifTitles.forEach(title => {
|
||||||
|
title.addEventListener("click", function () {
|
||||||
|
const idProduit = this.dataset.idproduit;
|
||||||
|
fetch(`/gestion-produit/detailProduit/${idProduit}/`)
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
$("modifIdProduit").value = data.detailId;
|
||||||
|
$("modifLibelle").value = data.detailLibelle;
|
||||||
|
$("modifQuantiteStock").value = data.detailQuantiteStock;
|
||||||
|
$("modifSeuilPreRupture").value = data.detailSeuilPreRupture;
|
||||||
|
|
||||||
|
$("modifCondi").value = data.detailConditionnement;
|
||||||
|
|
||||||
|
$("modifCategorie").innerHTML = "";
|
||||||
|
data.listeCategorie.forEach(categorie => {
|
||||||
|
const option = document.createElement("option");
|
||||||
|
option.value = categorie.id;
|
||||||
|
option.text = categorie.categorie;
|
||||||
|
if(categorie.id === data.detailCategorie){
|
||||||
|
option.selected = true;
|
||||||
|
}
|
||||||
|
$("modifCategorie").appendChild(option);
|
||||||
|
});
|
||||||
|
|
||||||
|
modalModifProduit.show();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$("modification-produit").addEventListener("submit", function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
const form = this;
|
||||||
|
const url = this.dataset.url;
|
||||||
|
const csrf = document.querySelector('[name=csrfmiddlewaretoken]').value;
|
||||||
|
fetch(url, {
|
||||||
|
method: "POST",
|
||||||
|
headers:{
|
||||||
|
"X-Requested-With": "XMLHttpResponse",
|
||||||
|
"X-CSRFToken": csrf
|
||||||
|
},
|
||||||
|
body: new FormData(form)
|
||||||
|
})
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
if(data.success){
|
||||||
|
const messageBox = $("messageZone");
|
||||||
|
messageBox.innerHTML = `
|
||||||
|
<div class="alert alert-success">
|
||||||
|
Produit modifié avec succès
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
modalModifProduit.hide();
|
||||||
|
|
||||||
|
location.reload();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
// --------------------------- Gestion des categories -------------------------
|
// --------------------------- Gestion des categories -------------------------
|
||||||
const url_liste_categorie = $("listecategorie").dataset.url;
|
const url_liste_categorie = $("listecategorie").dataset.url;
|
||||||
const tableau_categorie = new Tabulator("#listecategorie", {
|
const tableau_categorie = new Tabulator("#listecategorie", {
|
||||||
|
|||||||
Reference in New Issue
Block a user