diff --git a/backend/order/views.py b/backend/order/views.py index fb67eb3..468138b 100644 --- a/backend/order/views.py +++ b/backend/order/views.py @@ -11,6 +11,8 @@ from .models import OrderItemModel, OrderModel, DiscountCode, PaymentModel from .permissons import CanDeleteCartItemPermissions from azbankgateways import bankfactories, models as bank_models from azbankgateways.exceptions import AZBankGatewaysException +from drf_spectacular.utils import extend_schema, OpenApiParameter, OpenApiTypes +from utils.pagination import StructurePagination try: pass except DiscountNotAvailableError: @@ -107,11 +109,56 @@ class CartView(APIView): class OrderlistView(APIView): permission_classes = [IsAuthenticated] 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): user = request.user orders = OrderModel.objects.filter(user=user).exclude(status="CART") - orders_ser = self.serializer_class(instance=orders, many=True, context={'request': request}) - return Response(orders_ser.data, status=status.HTTP_200_OK) + status_filter = request.query_params.get("status", None) + 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) diff --git a/backend/product/serializers.py b/backend/product/serializers.py index 68ac5a6..cd65826 100644 --- a/backend/product/serializers.py +++ b/backend/product/serializers.py @@ -2,7 +2,7 @@ from .models import * from rest_framework import serializers from django.utils import timezone 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) images = ProductImageSerailizer(many=True) details = ProductDetailSerializer(many=True, read_only=True) + cart_quantity = serializers.SerializerMethodField() class Meta: model = ProductVariant exclude = ('min_price', 'sell', 'currency', 'product', 'input_price') @@ -60,6 +61,11 @@ class ProductVariantSerialzier(serializers.ModelSerializer): if view_type == 'list': 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, context={ 'view_type': 'list', - 'dollor_price': self.context.get('dollor_price') + 'request': self.context.get('request') } ) return serializer.data diff --git a/backend/product/views.py b/backend/product/views.py index ea29436..79b1c60 100644 --- a/backend/product/views.py +++ b/backend/product/views.py @@ -51,7 +51,7 @@ class AllCategories(APIView): class ProductView(APIView): serializer_class = DynamicProductSerializer permission_classes = [AllowAny] - authentication_classes = [] + # authentication_classes = [] def get(self, request, pk): product = get_object_or_404(ProductModel, id=pk) product_ser = self.serializer_class(instance=product, many=False, context={'request': request, 'view_type': 'instance'})