From c68fc85e168680a44a104190fea845baa03c7ae2 Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Sat, 16 Aug 2025 14:58:42 +0500 Subject: [PATCH] add folder product list apis --- core/apps/products/serializers/folder.py | 4 +-- core/apps/products/urls.py | 2 ++ core/apps/products/views/folder.py | 36 +++++++++++++++++++++++- core/apps/products/views/product.py | 2 +- 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/core/apps/products/serializers/folder.py b/core/apps/products/serializers/folder.py index 1011021..6f05d33 100644 --- a/core/apps/products/serializers/folder.py +++ b/core/apps/products/serializers/folder.py @@ -11,12 +11,12 @@ class FolderSerializer(serializers.ModelSerializer): def create(self, validated_data): return Folder.objects.create(**validated_data) - + def update(self, instance, validated_data): instance.name = validated_data.get('name', instance.name) instance.save() return instance - + class SubFolderSerializer(serializers.ModelSerializer): class Meta: diff --git a/core/apps/products/urls.py b/core/apps/products/urls.py index a702d68..826e374 100644 --- a/core/apps/products/urls.py +++ b/core/apps/products/urls.py @@ -25,12 +25,14 @@ urlpatterns = [ path('list/', folder_views.FolderListApiView.as_view()), path('/update/', folder_views.FolderUdateApiView.as_view()), path('/delete/', folder_views.FolderDeleteApiView.as_view()), + path('/products/', folder_views.FolderProductListApiView.as_view()), path('sub_folder/', include( [ path('create/', folder_views.SubFolderCreateApiView.as_view()), path('/list/', folder_views.SubFolderListByFolderIdApiView.as_view()), path('/delete/', folder_views.SubFolderDeleteApiView.as_view()), path('/update/', folder_views.SubFolderUpdateApiView.as_view()), + path("/products/", folder_views.SubFolderProductListApiView.as_view()), ] )), ] diff --git a/core/apps/products/views/folder.py b/core/apps/products/views/folder.py index fda128c..ff161cb 100644 --- a/core/apps/products/views/folder.py +++ b/core/apps/products/views/folder.py @@ -4,8 +4,10 @@ from rest_framework.response import Response from rest_framework import generics, views from core.apps.products.serializers.folder import FolderSerializer, SubFolderSerializer -from core.apps.products.models.folder import Folder, SubFolder +from core.apps.products.models import Folder, SubFolder, Product +from core.apps.products.serializers.product import ProductListSerializer from core.apps.accounts.permissions.permissions import HasRolePermission +from core.apps.shared.paginations.custom import CustomPageNumberPagination class FolderCreateApiView(generics.CreateAPIView): @@ -40,6 +42,23 @@ class FolderDeleteApiView(generics.DestroyAPIView): lookup_field = 'id' + + +class FolderProductListApiView(generics.GenericAPIView): + pagination_class = CustomPageNumberPagination + permission_classes = [HasRolePermission] + required_permissions = ['product', 'product_folder'] + queryset = Product.objects.all() + serializer_class = ProductListSerializer + + def get(self, request, folder_id): + folder = get_object_or_404(Folder, id=folder_id) + products = Product.objects.filter(folder=folder) + data = self.paginate_queryset(products) + serializer = self.serializer_class(data, many=True) + return self.get_paginated_response(serializer.data) + + class SubFolderCreateApiView(generics.CreateAPIView): serializer_class = SubFolderSerializer queryset = SubFolder.objects.all() @@ -74,3 +93,18 @@ class SubFolderDeleteApiView(generics.DestroyAPIView): permission_classes = [HasRolePermission] required_permissions = ['product_folder'] + +class SubFolderProductListApiView(generics.GenericAPIView): + pagination_class = CustomPageNumberPagination + permission_classes = [HasRolePermission] + required_permissions = ['product', 'product_folder'] + queryset = Product.objects.all() + serializer_class = ProductListSerializer + + def get(self, request, sub_folder_id): + sub_folder = get_object_or_404(SubFolder, id=sub_folder_id) + products = Product.objects.filter(sub_folder=sub_folder) + data = self.paginate_queryset(products) + serializer = self.serializer_class(data, many=True) + return self.get_paginated_response(serializer.data) + \ No newline at end of file diff --git a/core/apps/products/views/product.py b/core/apps/products/views/product.py index 0646c26..8e884d2 100644 --- a/core/apps/products/views/product.py +++ b/core/apps/products/views/product.py @@ -3,7 +3,7 @@ from django.shortcuts import get_object_or_404 from rest_framework import generics, views from rest_framework.response import Response -from core.apps.products.models.product import Product +from core.apps.products.models import Product from core.apps.products.serializers import product as serializers from core.apps.accounts.permissions.permissions import HasRolePermission from core.apps.shared.paginations.custom import CustomPageNumberPagination