# api/views.py from rest_framework import generics, viewsets, permissions from django.contrib.auth import get_user_model from rest_framework_simplejwt.views import TokenObtainPairView from .serializers import RegisterSerializer, LinkSerializer, LinkGroupSerializer from .models import Link, LinkGroup User = get_user_model() class RegisterView(generics.CreateAPIView): queryset = User.objects.all() permission_classes = (permissions.AllowAny,) serializer_class = RegisterSerializer class LoginView(TokenObtainPairView): permission_classes = (permissions.AllowAny,) class LinkGroupViewSet(viewsets.ModelViewSet): queryset = LinkGroup.objects.all() serializer_class = LinkGroupSerializer permission_classes = [permissions.IsAuthenticated] def get_queryset(self): # возвращаем только группы текущего пользователя return self.queryset.filter(owner=self.request.user).order_by('order') class LinkViewSet(viewsets.ModelViewSet): serializer_class = LinkSerializer permission_classes = (permissions.IsAuthenticated,) def get_queryset(self): return Link.objects.filter(owner=self.request.user).order_by('order') def perform_create(self, serializer): serializer.save(owner=self.request.user) class UserLinksListView(generics.ListAPIView): serializer_class = LinkSerializer permission_classes = (permissions.AllowAny,) def get_queryset(self): username = self.kwargs['username'] return Link.objects.filter(owner__username=username).order_by('order') from .serializers import UserSerializer # нужно завести сериализатор для пользователя User = get_user_model() class UserProfileView(generics.RetrieveAPIView): """ Возвращает данные авторизованного пользователя. GET /api/auth/user/ """ serializer_class = UserSerializer permission_classes = [permissions.IsAuthenticated] def get_object(self): return self.request.user class PublicUserGroupsView(APIView): """ GET /api/users/{username}/public/ Возвращает публичную страницу пользователя: { "username": "...", "groups": [ { "id": 1, "name": "...", "icon": "/storage/images/link_groups/1.png", "links": [ { "id": 5, "title": "...", "url": "...", "icon": "/storage/images/links/5.png" }, … ] }, … ] } """ permission_classes = [permissions.AllowAny] def get(self, request, username): User = get_user_model() user = get_object_or_404(User, username=username) # достаём все группы пользователя вместе с их ссылками groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links') data = { "username": user.username, "groups": [] } for grp in groups_qs: grp_data = { "id": grp.id, "name": grp.name, "icon": grp.icon.url if grp.icon else None, "links": [] } for ln in grp.links.all(): grp_data["links"].append({ "id": ln.id, "title": ln.title, "url": ln.url, "icon": ln.icon.url if ln.icon else None }) data["groups"].append(grp_data) return Response(data, status=status.HTTP_200_OK)