from rest_framework import generics, permissions, viewsets from rest_framework.exceptions import PermissionDenied from rest_framework.response import Response from rest_framework.views import APIView from .models import Follow, User from .serializers import FollowSerializer, ProfileSerializer, RegisterSerializer, UserSerializer class RegisterView(generics.CreateAPIView): queryset = User.objects.all() serializer_class = RegisterSerializer permission_classes = [permissions.AllowAny] class MeView(APIView): def get(self, request): return Response(ProfileSerializer(request.user, context={"request": request}).data) def patch(self, request): serializer = UserSerializer(request.user, data=request.data, partial=True, context={"request": request}) serializer.is_valid(raise_exception=True) serializer.save() return Response(serializer.data) class UserViewSet(viewsets.ReadOnlyModelViewSet): queryset = User.objects.all() serializer_class = ProfileSerializer lookup_field = "username" class FollowViewSet(viewsets.ModelViewSet): serializer_class = FollowSerializer http_method_names = ["get", "post", "delete", "head", "options"] def get_queryset(self): user = self.request.user qs = Follow.objects.select_related("follower", "following") direction = self.request.query_params.get("direction", "following") if direction == "followers": return qs.filter(following=user) return qs.filter(follower=user) def perform_destroy(self, instance): if instance.follower_id != self.request.user.id: raise PermissionDenied("Cannot delete another user's follow edge.") instance.delete()