Files
links/.history/backend/api/views_20250507072833.py

113 lines
3.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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)