base cart_quantity filed and filter pagination and sort for order

This commit is contained in:
Parsa Nazer
2025-03-13 23:58:42 +03:30
parent 6009c43345
commit d218a8bed4
3 changed files with 58 additions and 5 deletions
+49 -2
View File
@@ -11,6 +11,8 @@ from .models import OrderItemModel, OrderModel, DiscountCode, PaymentModel
from .permissons import CanDeleteCartItemPermissions from .permissons import CanDeleteCartItemPermissions
from azbankgateways import bankfactories, models as bank_models from azbankgateways import bankfactories, models as bank_models
from azbankgateways.exceptions import AZBankGatewaysException from azbankgateways.exceptions import AZBankGatewaysException
from drf_spectacular.utils import extend_schema, OpenApiParameter, OpenApiTypes
from utils.pagination import StructurePagination
try: try:
pass pass
except DiscountNotAvailableError: except DiscountNotAvailableError:
@@ -107,11 +109,56 @@ class CartView(APIView):
class OrderlistView(APIView): class OrderlistView(APIView):
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
serializer_class = OrderSerializer serializer_class = OrderSerializer
pagination_class = StructurePagination
@extend_schema(
parameters=[
OpenApiParameter(
name="limit",
description="لیمیتش",
required=False,
type=OpenApiTypes.INT,
),
OpenApiParameter(
name="offset",
description="افستش",
required=False,
type=OpenApiTypes.INT,
),
OpenApiParameter(
name="status",
description=(
"['CART', 'ADMIN_PENDING', 'PENDING', 'POSTED', 'RECEIVED', 'CANCELED', 'BACK']"
),
required=False,
type=OpenApiTypes.STR,
),
OpenApiParameter(
name="sort",
description=(
"Sort results by one of the following fields:\n"
"['created_at', '-created_at', 'final_price', '-final_price']"
"\nPrefix with `-` for descending order."
),
required=False,
type=OpenApiTypes.STR,
),
]
)
def get(self, request): def get(self, request):
user = request.user user = request.user
orders = OrderModel.objects.filter(user=user).exclude(status="CART") orders = OrderModel.objects.filter(user=user).exclude(status="CART")
orders_ser = self.serializer_class(instance=orders, many=True, context={'request': request}) status_filter = request.query_params.get("status", None)
return Response(orders_ser.data, status=status.HTTP_200_OK) sort = request.query_params.get('sort', None)
if status_filter in ['CART', 'ADMIN_PENDING', 'PENDING', 'POSTED', 'RECEIVED', 'CANCELED', 'BACK']:
orders.filter(status=status_filter)
if sort:
if sort not in ['created_at', '-created_at', 'final_price', '-final_price']:
return Response({'detail': 'پارامتر sort اشتباه است'}, status=status.HTTP_400_BAD_REQUEST)
orders = orders.order_by(sort)
paginator = self.pagination_class()
paginated_orders = paginator.paginate_queryset(orders, request)
orders_ser = self.serializer_class(instance=paginated_orders, many=True, context={'request': request})
return paginator.get_paginated_response(orders_ser.data)
+8 -2
View File
@@ -2,7 +2,7 @@ from .models import *
from rest_framework import serializers from rest_framework import serializers
from django.utils import timezone from django.utils import timezone
from datetime import timedelta from datetime import timedelta
from django.contrib.auth.models import AnonymousUser
@@ -49,6 +49,7 @@ class ProductVariantSerialzier(serializers.ModelSerializer):
in_pack_items = InPackItemsSerialzier(many=True) in_pack_items = InPackItemsSerialzier(many=True)
images = ProductImageSerailizer(many=True) images = ProductImageSerailizer(many=True)
details = ProductDetailSerializer(many=True, read_only=True) details = ProductDetailSerializer(many=True, read_only=True)
cart_quantity = serializers.SerializerMethodField()
class Meta: class Meta:
model = ProductVariant model = ProductVariant
exclude = ('min_price', 'sell', 'currency', 'product', 'input_price') exclude = ('min_price', 'sell', 'currency', 'product', 'input_price')
@@ -60,6 +61,11 @@ class ProductVariantSerialzier(serializers.ModelSerializer):
if view_type == 'list': if view_type == 'list':
self.fields.pop('in_pack_items', None) self.fields.pop('in_pack_items', None)
def get_cart_quantity(self, obj):
request = self.context.get('request')
if not request or not request.user.is_authenticated:
return 0
return 1
@@ -135,7 +141,7 @@ class DynamicProductSerializer(serializers.ModelSerializer):
many=True, many=True,
context={ context={
'view_type': 'list', 'view_type': 'list',
'dollor_price': self.context.get('dollor_price') 'request': self.context.get('request')
} }
) )
return serializer.data return serializer.data
+1 -1
View File
@@ -51,7 +51,7 @@ class AllCategories(APIView):
class ProductView(APIView): class ProductView(APIView):
serializer_class = DynamicProductSerializer serializer_class = DynamicProductSerializer
permission_classes = [AllowAny] permission_classes = [AllowAny]
authentication_classes = [] # authentication_classes = []
def get(self, request, pk): def get(self, request, pk):
product = get_object_or_404(ProductModel, id=pk) product = get_object_or_404(ProductModel, id=pk)
product_ser = self.serializer_class(instance=product, many=False, context={'request': request, 'view_type': 'instance'}) product_ser = self.serializer_class(instance=product, many=False, context={'request': request, 'view_type': 'instance'})