change: add filters to inventory list api

This commit is contained in:
behruz-dev
2025-08-26 16:47:54 +05:00
parent 2ae04c76e9
commit 7a8efa74ff
5 changed files with 69 additions and 13 deletions

View File

@@ -4,11 +4,13 @@ from core.apps.wherehouse.models.inventory import Inventory
@shared_task @shared_task
def create_inventory(wherehouse, quantity, product, unity, price): def create_inventory(wherehouse, quantity, product, unity, price, project_folder, project):
Inventory.objects.create( Inventory.objects.create(
wherehouse_id=wherehouse, wherehouse_id=wherehouse,
quantity=quantity, quantity=quantity,
product_id=product, product_id=product,
unity_id=unity, unity_id=unity,
price=price price=price,
project_folder_id=project_folder,
project_id=project,
) )

View File

@@ -155,7 +155,9 @@ class PartyChangeStatusToIsMadeApiView(generics.GenericAPIView):
order.quantity, order.quantity,
order.product.id, order.product.id,
order.unity.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( return Response(
{'success': True, 'message': 'party updated'}, {'success': True, 'message': 'party updated'},

View File

@@ -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'),
),
]

View File

@@ -8,6 +8,8 @@ from core.apps.wherehouse.models.wherehouse import WhereHouse
# products # products
from core.apps.products.models.product import Product from core.apps.products.models.product import Product
from core.apps.products.models.unity import Unity from core.apps.products.models.unity import Unity
# projects
from core.apps.projects.models import Project, ProjectFolder
class Inventory(BaseModel): class Inventory(BaseModel):
@@ -16,6 +18,14 @@ class Inventory(BaseModel):
product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='inventories') 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) unity = models.ForeignKey(Unity, on_delete=models.SET_NULL, related_name='inventories', null=True)
price = models.PositiveBigIntegerField(default=0) 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): def __str__(self):
return f'{self.product} in {self.wherehouse}' return f'{self.product} in {self.wherehouse}'

View File

@@ -1,8 +1,10 @@
from django.shortcuts import get_object_or_404 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 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.serializers import inventory as serializers
from core.apps.wherehouse.models import WhereHouse, Inventory from core.apps.wherehouse.models import WhereHouse, Inventory
from core.apps.accounts.permissions.permissions import HasRolePermission from core.apps.accounts.permissions.permissions import HasRolePermission
@@ -10,16 +12,31 @@ from core.apps.accounts.permissions.permissions import HasRolePermission
class InventoryListApiView(generics.GenericAPIView): class InventoryListApiView(generics.GenericAPIView):
serializer_class = serializers.InventoryListSerializer serializer_class = serializers.InventoryListSerializer
queryset = Inventory.objects.all() queryset = Inventory.objects.select_related('product', 'unity')
permissions_class = [HasRolePermission] permissions_classes = [HasRolePermission]
required_permissions = ['wherehouse'] required_permissions = ['wherehouse']
filter_backends = [DjangoFilterBackend, filters.SearchFilter]
search_fields = [
'product__name', 'unity__value'
]
def get(self, request): def get(self, request):
wherehouse_ids = request.query_params.getlist('wherehouse_id') 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: if wherehouse_ids:
inventories = Inventory.objects.filter(wherehouse__in=wherehouse_ids).select_related('product', 'unity') inventories = inventories.filter(wherehouse__in=wherehouse_ids)
else: if project_folder_ids:
inventories = Inventory.objects.all() 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) page = self.paginate_queryset(inventories)
if page is not None: if page is not None:
serializer = self.serializer_class(page, many=True) serializer = self.serializer_class(page, many=True)