UserFavorites system
This commit is contained in:
@@ -355,3 +355,77 @@ class NotificationListAPIView(APIView):
|
||||
|
||||
def str_to_bool(self, val):
|
||||
return True if val and val == 'read' else False
|
||||
from product.models import ProductModel
|
||||
class AddToFavoritesSerializer(serializers.Serializer):
|
||||
product_slug = serializers.SlugField(allow_unicode=True)
|
||||
|
||||
def validate_product_id(self, value):
|
||||
if not ProductModel.objects.filter(slug=value).exists():
|
||||
raise serializers.ValidationError("Product does not exist.")
|
||||
return value
|
||||
|
||||
|
||||
from product.serializers import DynamicProductSerializer
|
||||
from django.shortcuts import get_object_or_404
|
||||
|
||||
class ToggleFavoriteView(APIView):
|
||||
permission_classes = [IsAuthenticated]
|
||||
|
||||
@extend_schema(
|
||||
request=AddToFavoritesSerializer,
|
||||
responses={200: DynamicProductSerializer},
|
||||
tags=["favorites"]
|
||||
)
|
||||
def post(self, request):
|
||||
serializer = AddToFavoritesSerializer(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
|
||||
product_slug = serializer.validated_data["product_slug"]
|
||||
product = get_object_or_404(ProductModel, slug=product_slug)
|
||||
|
||||
user_fav, _ = UserFavorites.objects.get_or_create(user=request.user)
|
||||
|
||||
if product in user_fav.products.all():
|
||||
user_fav.products.remove(product)
|
||||
action = "removed"
|
||||
else:
|
||||
user_fav.products.add(product)
|
||||
action = "added"
|
||||
|
||||
return Response(
|
||||
{
|
||||
"action": action,
|
||||
"product": DynamicProductSerializer(product, context={'request': request, 'view_type': 'list'}).data
|
||||
},
|
||||
status=status.HTTP_200_OK
|
||||
)
|
||||
from drf_spectacular.utils import extend_schema, OpenApiParameter, OpenApiTypes
|
||||
from utils.pagination import StructurePagination
|
||||
class FavoritesView(APIView):
|
||||
permission_classes = [IsAuthenticated]
|
||||
serializer_class = DynamicProductSerializer
|
||||
pagination_class = StructurePagination
|
||||
@extend_schema(
|
||||
tags=["favorites"],
|
||||
parameters=[
|
||||
OpenApiParameter(
|
||||
name="limit",
|
||||
description="Number of results to return per page (pagination).",
|
||||
required=False,
|
||||
type=OpenApiTypes.INT,
|
||||
),
|
||||
OpenApiParameter(
|
||||
name="offset",
|
||||
description="The starting position of the results (pagination).",
|
||||
required=False,
|
||||
type=OpenApiTypes.INT,
|
||||
),
|
||||
]
|
||||
)
|
||||
def get(self, request):
|
||||
user_fav, _ = UserFavorites.objects.get_or_create(user=request.user)
|
||||
products = user_fav.products.all()
|
||||
paginator = self.pagination_class()
|
||||
paginated_products = paginator.paginate_queryset(products, request)
|
||||
serializer = self.serializer_class(instance=paginated_products, many=True, context={'request': request, 'view_type': 'list'})
|
||||
return paginator.get_paginated_response(serializer.data)
|
||||
Reference in New Issue
Block a user