diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index ee9f705..0000000 --- a/Jenkinsfile +++ /dev/null @@ -1,51 +0,0 @@ -pipeline -{ - agent any - options { - skipDefaultCheckout(true) - } - - environment - { - SUDO_PASSWORD = credentials('sudo-password') - } - - stages - { - stage ( 'checkout' ) - { - steps - { - sh 'echo "Debut du pipeline"' - cleanWs() - checkout scm - } - } - stage ( 'Deploiement' ) - { - when { branch 'main' } - steps { - sh ''' - cd /var/www/sgl - echo $SUDO_PASSWORD | sudo -S chown -R jenkins:jenkins /var/www/sgl - - git fetch origin main - git reset --hard origin/main - - python3 -m venv venv - . venv/bin/activate - pip install -r requirements.txt - - python manage.py makemigrations - python manage.py migrate - echo $SUDO_PASSWORD | sudo -S rm -r staticfiles - python manage.py collectstatic --noinput - - echo $SUDO_PASSWORD | sudo -S chown -R www-data:www-data /var/www/sgl - echo "Deploiement reussi" - echo $SUDO_PASSWORD | sudo -S supervisorctl restart sgl - ''' - } - } - } -} \ No newline at end of file diff --git a/SGL/templates/parts/menu_application.html b/SGL/templates/parts/menu_application.html index 1868637..bd72bcb 100644 --- a/SGL/templates/parts/menu_application.html +++ b/SGL/templates/parts/menu_application.html @@ -15,6 +15,9 @@ + diff --git a/gestion_produit/__pycache__/models.cpython-310.pyc b/gestion_produit/__pycache__/models.cpython-310.pyc index 0b38abe..8b85b99 100644 Binary files a/gestion_produit/__pycache__/models.cpython-310.pyc and b/gestion_produit/__pycache__/models.cpython-310.pyc differ diff --git a/gestion_produit/__pycache__/urls.cpython-310.pyc b/gestion_produit/__pycache__/urls.cpython-310.pyc index 012669b..03f22ba 100644 Binary files a/gestion_produit/__pycache__/urls.cpython-310.pyc and b/gestion_produit/__pycache__/urls.cpython-310.pyc differ diff --git a/gestion_produit/__pycache__/views.cpython-310.pyc b/gestion_produit/__pycache__/views.cpython-310.pyc index f24e54b..cc630a2 100644 Binary files a/gestion_produit/__pycache__/views.cpython-310.pyc and b/gestion_produit/__pycache__/views.cpython-310.pyc differ diff --git a/gestion_produit/templates/gestion_produit/index.html b/gestion_produit/templates/gestion_produit/index.html index b07a5e8..d6ab1d2 100644 --- a/gestion_produit/templates/gestion_produit/index.html +++ b/gestion_produit/templates/gestion_produit/index.html @@ -67,33 +67,31 @@ -
+
{% for produit in page_obj %}
-
- {% if produit.image %} - {{ produit.libelle }} - {% else %} - Image par défaut - {% endif %} -
-
{{ produit.libelle }}
- - {% if user|has_group:"logistique" %} -

- Quantite en stock: {{ produit.stockActuel }} -

- +
+ {% if produit.image %} + {{ produit.libelle }} + {% else %} + Image par défaut {% endif %} - -
-
+
+
{{ produit.libelle }}
+ + {% if user|has_group:"logistique" %} +

+ Quantite en stock: {{ produit.stockActuel }} +

+ + {% endif %} + +
+
{% empty %}

Aucun produit disponible.

diff --git a/gestion_produit/urls.py b/gestion_produit/urls.py index ac8d6c6..1f34f6b 100644 --- a/gestion_produit/urls.py +++ b/gestion_produit/urls.py @@ -81,4 +81,14 @@ urlpatterns = [ views.detail_demande, name="detail_demande" ), + path( + "filtrer-produit-par-categorie//", + views.filtrer_produit_par_categorie, + name="filtrer_produit_par_categorie" + ), + path( + "filtrer-par-nom-produit/", + views.filtre_par_nom_produit, + name="filtrer_par_nom_produit" + ), ] diff --git a/gestion_produit/views.py b/gestion_produit/views.py index b491173..f1a9663 100644 --- a/gestion_produit/views.py +++ b/gestion_produit/views.py @@ -172,7 +172,7 @@ def enregistrer_produit(request): return redirect("gestion_produit:index") @login_required -def detail_produit(request, id_produit): +def detail_produit(_request, id_produit): """Renvoyez les détails d'un produit spécifique au format JSON. Parameters @@ -422,6 +422,73 @@ def enregistrer_categorie(request): return JsonResponse({"success": False}) return None +def filtrer_produit_par_categorie(request, id_categorie): + """Filtrez les produits par catégorie et renvoyez-les au format JSON. + + Parameters + ---------- + request : HttpRequest + La requête HTTP entrante. + id_categorie : int + L'ID de la catégorie pour laquelle filtrer les produits. + + Returns + ------- + JsonResponse + Réponse JSON contenant la liste des produits filtrés par catégorie. + + """ + produits = Produit.objects.filter(categorie_id=id_categorie) + produits_filtres = [ + { + "id": produit.id, + "libelle": produit.libelle, + "conditionnement": produit.conditionnement, + "quantite_stock": produit.quantite_stock, + "seuil_pre_rupture": produit.seuil_pre_rupture, + "image": produit.image.url if produit.image else "", + "appartient_logistique": request.user.groups.filter(name="Logistique").exists(), + + } + for produit in produits + ] + return JsonResponse(produits_filtres, safe=False) + +def filtre_par_nom_produit(request): + """Filtrez les produits par nom et renvoyez-les au format JSON. + + Parameters + ---------- + request : HttpRequest + La requête HTTP entrante. + nom_produit : str + Le nom du produit pour lequel filtrer les produits. + + Returns + ------- + JsonResponse + Réponse JSON contenant la liste des produits filtrés par nom. + + """ + nom_produit = request.GET.get("nom", "") + if nom_produit == "": + produits = Produit.objects.all() + else: + produits = Produit.objects.filter(libelle__icontains=nom_produit) + produits_filtres = [ + { + "id": produit.id, + "libelle": produit.libelle, + "conditionnement": produit.conditionnement, + "quantite_stock": produit.quantite_stock, + "seuil_pre_rupture": produit.seuil_pre_rupture, + "image": produit.image.url if produit.image else "", + "appartient_logistique": request.user.groups.filter(name="Logistique").exists(), + } + for produit in produits + ] + return JsonResponse(produits_filtres, safe=False) + @login_required def recuperer_fournisseur_par_categorie(_request, id_produit): """Récupèrez les fournisseurs associés à la catégorie d'un produit donné. diff --git a/static/js/gestion_produit.js b/static/js/gestion_produit.js index 7eecfe7..c8f1c97 100644 --- a/static/js/gestion_produit.js +++ b/static/js/gestion_produit.js @@ -84,15 +84,34 @@ document.addEventListener('DOMContentLoaded', function () { // --------------------------- FILTRE PAR NOM DU PRODUIT ------------------------- $('searchInput').addEventListener('keyup', function() { const filter = this.value.toLowerCase(); - const cards = document.querySelectorAll('.card'); - cards.forEach(card => { - const title = card.querySelector('.card-title').textContent.toLowerCase(); - if (title.includes(filter)) { - card.style.display = ''; - } else { - card.style.display = 'none'; - } + + fetch(`/gestion-produit/filtrer-par-nom-produit/?nom=${filter}`) + .then(response => response.json()) + .then(data => { + const cardContainer = document.querySelector("#cardContainer"); + cardContainer.innerHTML = ""; + data.forEach(produit => { + cardContainer.innerHTML += ` +
+
+ ${produit.libelle} +
+
${produit.libelle}
+ + ${produit.appartient_logistique ? `

+ Quantite en stock: ${produit.stockActuel} +

` : ""} + ${produit.appartient_logistique ? `` : ""} + +
+
+
`; }); + }) }) // Enregistrement de commande @@ -138,21 +157,41 @@ document.addEventListener('DOMContentLoaded', function () { // Filtre des produits par categorie $("filterCategorie").addEventListener("change", function(){ - const card = document.querySelectorAll(".card"); const filtre = this.value; if(filtre === ""){ - card.forEach(carte => { - carte.style.display = ""; - }); + location.reload(); }else{ - card.forEach(carte => { - categorie = carte.querySelector(".categorie-produit").textContent.toLowerCase(); - if(parseInt(categorie) === parseInt(filtre)){ - carte.style.display = ""; - }else{ - carte.style.display = 'none' - } - }); + fetch(`/gestion-produit/filtrer-produit-par-categorie/${filtre}/`) + .then(response => response.json()) + .then(data => { + console.log(data); + const cardContainer = document.querySelector("#cardContainer"); + cardContainer.innerHTML = ""; + data.forEach(produit => { + cardContainer.innerHTML += ` +
+
+ ${produit.libelle} +
+
${produit.libelle}
+ +

+ Quantite en stock: ${produit.stockActuel} +

+ ${produit.appartient_logistique ? `` : ""} + ${produit.appartient_logistique ? `` : ""} + +
+
+
`; + }); + }) } })