Browse Source

fix: bookmark

master
mortezaei 1 year ago
parent
commit
4593ed024e
  1. 2
      apps/bookmark/serializers/bookmark.py
  2. 31
      apps/bookmark/views/bookmark.py
  3. 27
      apps/bookmark/views/rate.py

2
apps/bookmark/serializers/bookmark.py

@ -10,7 +10,7 @@ class BookmarkSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Bookmark model = Bookmark
fields = ['id', 'user', 'service', 'content_id', 'status', 'created_at', 'updated_at'] fields = ['id', 'user', 'service', 'content_id', 'status', 'created_at', 'updated_at']
read_only_fields = ['id', 'created_at', 'updated_at', 'status']
read_only_fields = ['id', 'created_at', 'updated_at', 'status', 'user']
def validate(self, data): def validate(self, data):
""" """

31
apps/bookmark/views/bookmark.py

@ -4,6 +4,7 @@ from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
from rest_framework.generics import CreateAPIView, DestroyAPIView from rest_framework.generics import CreateAPIView, DestroyAPIView
from rest_framework.exceptions import ValidationError from rest_framework.exceptions import ValidationError
from drf_yasg.utils import swagger_auto_schema
from apps.bookmark.models import Bookmark from apps.bookmark.models import Bookmark
from apps.bookmark.serializers import BookmarkSerializer from apps.bookmark.serializers import BookmarkSerializer
@ -16,7 +17,16 @@ class AddBookmarkView(CreateAPIView):
""" """
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
serializer_class = BookmarkSerializer serializer_class = BookmarkSerializer
@swagger_auto_schema(
operation_description="Add a bookmark for a specific content in a service. If the bookmark already exists but is inactive, it will be reactivated.",
request_body=BookmarkSerializer,
responses={
201: "Bookmark created successfully.",
200: "Bookmark reactivated or already active.",
400: "Invalid input."
}
)
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
service = request.data.get('service') service = request.data.get('service')
content_id = request.data.get('content_id') content_id = request.data.get('content_id')
@ -66,7 +76,16 @@ class RemoveBookmarkView(DestroyAPIView):
""" """
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
serializer_class = BookmarkSerializer serializer_class = BookmarkSerializer
@swagger_auto_schema(
operation_description="Deactivate a bookmark by setting its status to False using content_id and user.",
request_body=BookmarkSerializer,
responses={
204: "Bookmark deactivated successfully.",
400: "Invalid input.",
404: "Bookmark not found or already inactive."
}
)
def get_object(self): def get_object(self):
service = self.request.data.get('service') service = self.request.data.get('service')
content_id = self.request.data.get('content_id') content_id = self.request.data.get('content_id')
@ -98,7 +117,13 @@ class BookmarkStatusView(APIView):
Return the count of bookmarks for each service for the current user. Return the count of bookmarks for each service for the current user.
""" """
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
@swagger_auto_schema(
operation_description="Return the count of bookmarks for each service for the current user.",
responses={
200: "A list of bookmark counts for each service.",
}
)
def get(self, request): def get(self, request):
# Get all active bookmarks for the current user # Get all active bookmarks for the current user
user_bookmarks = Bookmark.objects.filter( user_bookmarks = Bookmark.objects.filter(

27
apps/bookmark/views/rate.py

@ -4,13 +4,23 @@ from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
from apps.bookmark.models import Rate from apps.bookmark.models import Rate
from apps.bookmark.serializers import RateSerializer, RateStatusSerializer, AverageRateSerializer from apps.bookmark.serializers import RateSerializer, RateStatusSerializer, AverageRateSerializer
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
class AddRateView(APIView): class AddRateView(APIView):
""" """
API view for adding or updating a rate. API view for adding or updating a rate.
""" """
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
@swagger_auto_schema(
operation_description="Add or update a rate for a content.",
request_body=RateSerializer,
responses={
201: "Rate created successfully.",
400: "Invalid input."
}
)
def post(self, request): def post(self, request):
""" """
Add or update a rate for a content. Add or update a rate for a content.
@ -26,7 +36,16 @@ class RemoveRateView(APIView):
API view for removing a rate. API view for removing a rate.
""" """
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
@swagger_auto_schema(
operation_description="Remove a rate by setting its status to False.",
request_body=RateStatusSerializer,
responses={
200: "Rate removed successfully.",
404: "Rate not found.",
400: "Invalid input."
}
)
def post(self, request): def post(self, request):
""" """
Remove a rate by setting its status to False. Remove a rate by setting its status to False.
@ -35,7 +54,7 @@ class RemoveRateView(APIView):
if serializer.is_valid(): if serializer.is_valid():
service = serializer.validated_data['service'] service = serializer.validated_data['service']
content_id = serializer.validated_data['content_id'] content_id = serializer.validated_data['content_id']
try: try:
rate = Rate.objects.get( rate = Rate.objects.get(
user=request.user, user=request.user,
@ -47,7 +66,7 @@ class RemoveRateView(APIView):
return Response({'message': 'Rate removed successfully'}, status=status.HTTP_200_OK) return Response({'message': 'Rate removed successfully'}, status=status.HTTP_200_OK)
except Rate.DoesNotExist: except Rate.DoesNotExist:
return Response({'message': 'Rate not found'}, status=status.HTTP_404_NOT_FOUND) return Response({'message': 'Rate not found'}, status=status.HTTP_404_NOT_FOUND)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class RateStatusView(APIView): class RateStatusView(APIView):

Loading…
Cancel
Save