UserFavorites system

This commit is contained in:
Parsa Nazer
2025-10-23 12:40:40 +03:30
parent fed32e78c5
commit 8d38346267
5 changed files with 134 additions and 3 deletions
+74
View File
@@ -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)