From 7a8efa74ff2403714402973c8474997a7789b2fc Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Tue, 26 Aug 2025 16:47:54 +0500 Subject: [PATCH] change: add filters to inventory list api --- core/apps/orders/tasks/order.py | 14 +++++---- core/apps/orders/views/party.py | 4 ++- ...entory_project_inventory_project_folder.py | 25 ++++++++++++++++ core/apps/wherehouse/models/inventory.py | 10 +++++++ core/apps/wherehouse/views/inventory.py | 29 +++++++++++++++---- 5 files changed, 69 insertions(+), 13 deletions(-) create mode 100644 core/apps/wherehouse/migrations/0004_inventory_project_inventory_project_folder.py diff --git a/core/apps/orders/tasks/order.py b/core/apps/orders/tasks/order.py index 5ea581f..311d84b 100644 --- a/core/apps/orders/tasks/order.py +++ b/core/apps/orders/tasks/order.py @@ -4,11 +4,13 @@ from core.apps.wherehouse.models.inventory import Inventory @shared_task -def create_inventory(wherehouse, quantity, product, unity, price): +def create_inventory(wherehouse, quantity, product, unity, price, project_folder, project): Inventory.objects.create( - wherehouse_id=wherehouse, - quantity=quantity, - product_id=product, - unity_id=unity, - price=price + wherehouse_id=wherehouse, + quantity=quantity, + product_id=product, + unity_id=unity, + price=price, + project_folder_id=project_folder, + project_id=project, ) diff --git a/core/apps/orders/views/party.py b/core/apps/orders/views/party.py index 6c2f102..4260711 100644 --- a/core/apps/orders/views/party.py +++ b/core/apps/orders/views/party.py @@ -155,7 +155,9 @@ class PartyChangeStatusToIsMadeApiView(generics.GenericAPIView): order.quantity, order.product.id, order.unity.id, - order.total_price + order.total_price, + order.project_folder.id if order.project_folder else None, + order.project.id if order.project else None, ) return Response( {'success': True, 'message': 'party updated'}, diff --git a/core/apps/wherehouse/migrations/0004_inventory_project_inventory_project_folder.py b/core/apps/wherehouse/migrations/0004_inventory_project_inventory_project_folder.py new file mode 100644 index 0000000..55c35bb --- /dev/null +++ b/core/apps/wherehouse/migrations/0004_inventory_project_inventory_project_folder.py @@ -0,0 +1,25 @@ +# Generated by Django 5.2.4 on 2025-08-26 16:35 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0016_estimatework_employee_estimatework_end_date_and_more'), + ('wherehouse', '0003_inventory_price_inventory_unity'), + ] + + operations = [ + migrations.AddField( + model_name='inventory', + name='project', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='inventories', to='projects.project'), + ), + migrations.AddField( + model_name='inventory', + name='project_folder', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='inventories', to='projects.projectfolder'), + ), + ] diff --git a/core/apps/wherehouse/models/inventory.py b/core/apps/wherehouse/models/inventory.py index 0bf7f71..8233d5f 100644 --- a/core/apps/wherehouse/models/inventory.py +++ b/core/apps/wherehouse/models/inventory.py @@ -8,6 +8,8 @@ from core.apps.wherehouse.models.wherehouse import WhereHouse # products from core.apps.products.models.product import Product from core.apps.products.models.unity import Unity +# projects +from core.apps.projects.models import Project, ProjectFolder class Inventory(BaseModel): @@ -16,6 +18,14 @@ class Inventory(BaseModel): product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='inventories') unity = models.ForeignKey(Unity, on_delete=models.SET_NULL, related_name='inventories', null=True) price = models.PositiveBigIntegerField(default=0) + project_folder = models.ForeignKey( + ProjectFolder, on_delete=models.SET_NULL, null=True, blank=True, + related_name='inventories' + ) + project = models.ForeignKey( + Project, on_delete=models.SET_NULL, null=True, blank=True, + related_name='inventories' + ) def __str__(self): return f'{self.product} in {self.wherehouse}' diff --git a/core/apps/wherehouse/views/inventory.py b/core/apps/wherehouse/views/inventory.py index 7d374bb..38ace48 100644 --- a/core/apps/wherehouse/views/inventory.py +++ b/core/apps/wherehouse/views/inventory.py @@ -1,8 +1,10 @@ from django.shortcuts import get_object_or_404 -from rest_framework import generics, views +from rest_framework import generics, views, filters from rest_framework.response import Response +from django_filters.rest_framework.backends import DjangoFilterBackend + from core.apps.wherehouse.serializers import inventory as serializers from core.apps.wherehouse.models import WhereHouse, Inventory from core.apps.accounts.permissions.permissions import HasRolePermission @@ -10,16 +12,31 @@ from core.apps.accounts.permissions.permissions import HasRolePermission class InventoryListApiView(generics.GenericAPIView): serializer_class = serializers.InventoryListSerializer - queryset = Inventory.objects.all() - permissions_class = [HasRolePermission] + queryset = Inventory.objects.select_related('product', 'unity') + permissions_classes = [HasRolePermission] required_permissions = ['wherehouse'] + filter_backends = [DjangoFilterBackend, filters.SearchFilter] + search_fields = [ + 'product__name', 'unity__value' + ] def get(self, request): wherehouse_ids = request.query_params.getlist('wherehouse_id') + project_folder_ids = request.query_params.getlist('project_folder_id') + project_ids = request.query_params.getlist('project_ids') + product_exists = request.query_params.get('product_exist') + inventories = self.filter_queryset(self.queryset) + if wherehouse_ids: - inventories = Inventory.objects.filter(wherehouse__in=wherehouse_ids).select_related('product', 'unity') - else: - inventories = Inventory.objects.all() + inventories = inventories.filter(wherehouse__in=wherehouse_ids) + if project_folder_ids: + inventories = inventories.filter(project_folder__in=project_folder_ids) + if project_ids: + inventories = inventories.filter(project__in=project_ids) + if product_exists == 'true': + inventories = inventories.exclude(quantity=0) + elif product_exists == 'false': + inventories = inventories.filter(quantity=0) page = self.paginate_queryset(inventories) if page is not None: serializer = self.serializer_class(page, many=True)