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..876cada 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..c4696a5 100644 --- a/gestion_produit/templates/gestion_produit/index.html +++ b/gestion_produit/templates/gestion_produit/index.html @@ -54,46 +54,49 @@
-
- -
-
- -
+
+
+ +
+
+ +
+
+ +
+
-
+
{% 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..a5bc386 100644 --- a/gestion_produit/views.py +++ b/gestion_produit/views.py @@ -2,7 +2,7 @@ from django.shortcuts import render, redirect from django.core.paginator import Paginator -from django.db.models import Sum +from django.db.models import Sum, Q from authentification.models import Profile from django.contrib.auth.decorators import login_required @@ -90,9 +90,25 @@ def index(request): La réponse HTTP contenant la page rendue. """ - liste_produit = Produit.objects.all().order_by("-id") + product_name = request.GET.get("search", "") + categorie_name = request.GET.get("filterCategorie", "") liste_categorie = Categorie.objects.all().order_by("categorie") + if product_name == "" and categorie_name == "": + liste_produit = Produit.objects.all().order_by("-id") + elif product_name != "" and categorie_name == "": + liste_produit = Produit.objects.filter( + Q(libelle__icontains=product_name) + ).order_by("-id") + elif product_name == "" and categorie_name != "": + liste_produit = Produit.objects.filter( + Q(categorie=categorie_name) + ).order_by("-id") + else: + liste_produit = Produit.objects.filter( + Q(categorie=categorie_name) & Q(libelle__icontains=product_name) + ).order_by("-id") + liste_produit_finale = [ calcul_stock_produit(produit) for produit in liste_produit ] @@ -172,7 +188,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 +438,102 @@ 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 == "": + liste_produit = Produit.objects.all().order_by("-id") + else: + liste_produit = Produit.objects.filter(libelle__icontains=nom_produit).order_by("-id") + + # ----------------------------------------------------------- + liste_categorie = Categorie.objects.all().order_by("categorie") + + liste_produit_finale = [ + calcul_stock_produit(produit) for produit in liste_produit + ] + + pagination = Paginator(liste_produit_finale, 1) + + page_number = request.GET.get("page") + page_obj = pagination.get_page(page_number) + + return render( + request, + "gestion_produit/index.html", + { + "formulaireEnregistrementCategorie": EnregistrementCategorie, + "formulaireEnregistrementProduit": EnregistrementProduit, + "formulaireCommanderProduit": CommanderProduit, + "formulaireDemanderProduit": DemanderProduit, + "mes_demandes": gestion_affichage_demande( + request, option_validation_chef=None + ), + "page_obj": page_obj, + "liste_categorie": liste_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) + @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..e9feffa 100644 --- a/static/js/gestion_produit.js +++ b/static/js/gestion_produit.js @@ -82,17 +82,8 @@ 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'; - } - }); + $('searchInput').addEventListener('submit', function() { + $('searchForm').submit(); }) // Enregistrement de commande @@ -138,22 +129,7 @@ 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 = ""; - }); - }else{ - card.forEach(carte => { - categorie = carte.querySelector(".categorie-produit").textContent.toLowerCase(); - if(parseInt(categorie) === parseInt(filtre)){ - carte.style.display = ""; - }else{ - carte.style.display = 'none' - } - }); - } + $('searchForm').submit(); }) // Enregistrement de nouveau produit