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

151 lines
4.4 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 django.contrib.auth import get_user_model
from django.shortcuts import get_object_or_404
from rest_framework import generics, viewsets, permissions, status
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework_simplejwt.views import TokenObtainPairView
from drf_spectacular.utils import extend_schema, OpenApiParameter
from .models import Link, LinkGroup
from .serializers import (
RegisterSerializer,
UserSerializer,
LinkSerializer,
LinkGroupSerializer,
)
User = get_user_model()
@extend_schema(
parameters=[
OpenApiParameter(
name='id',
type=int,
location=OpenApiParameter.PATH,
description='ID создаваемого или изменяемого объекта',
)
]
)
class RegisterView(generics.CreateAPIView):
"""
POST /api/auth/register/
Регистрация нового пользователя.
"""
queryset = User.objects.all()
permission_classes = (permissions.AllowAny,)
serializer_class = RegisterSerializer
class LoginView(TokenObtainPairView):
"""
POST /api/auth/login/
Получение JWT-токенов для входа.
"""
permission_classes = (permissions.AllowAny,)
class LinkGroupViewSet(viewsets.ModelViewSet):
"""
CRUD для групп ссылок текущего пользователя.
/api/groups/
"""
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):
"""
CRUD для ссылок текущего пользователя.
/api/links/
"""
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):
"""
GET /api/users/{username}/links/
Список всех ссылок публичного пользователя.
"""
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')
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/
Публичные группы ссылок пользователя вместе с их ссылками.
"""
permission_classes = (permissions.AllowAny,)
def get(self, request, username):
# Находим пользователя по имени
user = get_object_or_404(User, username=username)
# Берём его группы с предзагрузкой ссылок
groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links')
result = {
"username": user.username,
"groups": []
}
for grp in groups_qs:
# иконка группы (ImageField)
grp_icon_url = grp.icon.url if grp.icon else None
grp_data = {
"id": grp.id,
"name": grp.name,
"image": grp_icon_url,
"links": []
}
for ln in grp.links.all():
# иконка ссылки (URLField)
link_icon_url = ln.icon if ln.icon else None
grp_data["links"].append({
"id": ln.id,
"title": ln.title,
"url": ln.url,
"image": link_icon_url,
})
result["groups"].append(grp_data)
return Response(result, status=status.HTTP_200_OK)