change list of rancher inventory entries to rancher distributions for one item be as sale in pos device

This commit is contained in:
2025-09-06 12:04:41 +03:30
parent 272e9ed2c8
commit 18a7955e3a
5 changed files with 151 additions and 50 deletions

View File

@@ -1,12 +1,16 @@
from apps.product.pos.api.v1.serializers import quota_distribution_serializers as distribution_serializers
from apps.pos_device.mixins.pos_device_mixin import POSDeviceMixin
from apps.core.mixins.search_mixin import DynamicSearchMixin
from apps.core.pagination import CustomPageNumberPagination
from apps.warehouse.services.services import can_buy_from_inventory
from common.helpers import get_organization_by_user
from rest_framework.exceptions import APIException
from apps.product import models as product_models
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
from rest_framework.decorators import action
from rest_framework import viewsets, filters
from apps.herd.models import Rancher
from rest_framework import status
from django.db import transaction
from django.db.models import Q
@@ -25,12 +29,12 @@ def delete(queryset, pk):
obj.delete()
class QuotaDistributionViewSet(viewsets.ModelViewSet, DynamicSearchMixin):
class QuotaDistributionViewSet(viewsets.ModelViewSet, DynamicSearchMixin, POSDeviceMixin):
""" quota distribution apis """
queryset = product_models.QuotaDistribution.objects.all()
serializer_class = distribution_serializers.QuotaDistributionSerializer
filter_backends = [filters.SearchFilter]
permission_classes = [AllowAny]
CustomPageNumberPagination.page_size = 5
search_fields = [
"assigner_organization__name",
@@ -53,37 +57,61 @@ class QuotaDistributionViewSet(viewsets.ModelViewSet, DynamicSearchMixin):
def my_distributions(self, request):
""" list of my distributions """
queryset = self.filter_query(self.queryset) # return by search param or all objects
organization = get_organization_by_user(request.user)
organization = self.get_device_organization()
device = self.get_pos_device()
query = self.request.query_params
if query.get('param') == 'assigned':
# paginate queryset
page = self.paginate_queryset(
queryset.filter(
Q(assigned_organization=organization)
).order_by('-modify_date')
# get distributions with open quota
distributions = self.queryset.filter(
assigned_organization=organization,
quota__is_closed=False,
warehouse_entry__gt=0
).order_by('-create_date')
queryset = self.filter_query(distributions) # return by search param or all objects
# paginate & response
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True, context={'device': device})
return self.get_paginated_response(serializer.data)
@action(
methods=['get'],
detail=False,
url_name='rancher_distributions',
url_path='rancher_distributions',
name='rancher_distributions'
)
def rancher_distributions(self, request):
""" list of quota distributions for rancher """
organization = self.get_device_organization()
device = self.get_pos_device()
rancher = Rancher.objects.filter(national_code=request.GET['national_code'])
# get distributions with open quota
distributions = self.queryset.filter(
assigned_organization=organization,
quota__is_closed=False,
warehouse_entry__gt=0
).order_by('-create_date')
# check quota distributions for rancher
available_distributions = [
distribution for distribution in distributions if (
can_buy_from_inventory(rancher.first(), distribution=distribution) & rancher.exists()
)
]
elif query.get('param') == 'assigner':
# paginate queryset
page = self.paginate_queryset(
queryset.filter(
Q(assigner_organization=organization)
).order_by('-modify_date')
)
elif query.get('param') == 'all':
# paginate queryset
page = self.paginate_queryset(
queryset.filter(
Q(assigner_organization=organization) |
Q(assigned_organization=organization)
).order_by('-modify_date')
)
if page is not None: # noqa
serializer = self.get_serializer(page, many=True) # noqa
# paginate & response
page = self.paginate_queryset(available_distributions) # noqa
if page is not None:
serializer = self.get_serializer(page, many=True, context={'rancher': rancher.first(), 'device': device})
# set custom message for paginator
if not rancher:
self.paginator.set_message("دامدار با کد ملی مد نظر یافت نشد") # noqa
elif not available_distributions:
self.paginator.set_message("دامدار با کد ملی مد نظر سهمیه ایی ندارد") # noqa
return self.get_paginated_response(serializer.data)
@action(