Files
aerbim-ht-monitor/backend/api/auth/serializers.py
2025-08-29 15:13:15 +03:00

114 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.
from typing import Any, Optional
from rest_framework import serializers
from django.conf import settings
from api.types import User
class UserResponseSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
email = serializers.EmailField(read_only=True)
account_type = serializers.CharField(
source='userprofile.account_type',
read_only=True
)
name = serializers.CharField(source='first_name', read_only=True)
surname = serializers.CharField(source='last_name', read_only=True)
imageURL = serializers.SerializerMethodField()
uuid = serializers.SerializerMethodField()
class Meta:
ref_name = "UserResponse" # для OpenAPI
def get_uuid(self, obj: User) -> Optional[str]:
"""Получает короткий UUID (первые 6 символов) из профиля пользователя"""
return obj.userprofile.short_uuid if hasattr(obj, 'userprofile') else None
def get_imageURL(self, obj: User) -> Optional[str]:
"""Получает полный URL для изображения профиля пользователя"""
try:
if not hasattr(obj, 'userprofile') or not obj.userprofile.imageURL:
return None
relative_url = obj.userprofile.imageURL.lstrip('/')
base_url = settings.BASE_URL.rstrip('/')
return f"{base_url}/{relative_url}"
except Exception:
return None
def to_representation(self, instance: User) -> dict[str, Any]:
"""Переопределяется для добавления проверки типа для вывода"""
data = super().to_representation(instance)
return {
'id': data['id'], # int
'email': data['email'], # str
'account_type': data['account_type'], # AccountTypeLiteral
'name': data['name'], # str
'surname': data['surname'], # str
'imageURL': data['imageURL'], # Optional[str]
'uuid': data['uuid'], # Optional[str]
}
class LoginRequestSerializer(serializers.Serializer):
"""Сериализатор для запроса авторизации"""
login = serializers.CharField(
help_text="Логин пользователя",
required=True
)
password = serializers.CharField(
help_text="Пароль пользователя",
write_only=True,
required=True,
style={'input_type': 'password'}
)
class LoginResponseSerializer(serializers.Serializer):
"""Сериализатор для ответа при успешной авторизации"""
message = serializers.CharField(
help_text="Сообщение о успешной авторизации",
read_only=True
)
access = serializers.CharField(
help_text="JWT access token для авторизации запросов",
read_only=True
)
refresh = serializers.CharField(
help_text="JWT refresh token для обновления access token",
read_only=True
)
user = UserResponseSerializer(
help_text="Данные авторизованного пользователя",
read_only=True
)
class LogoutResponseSerializer(serializers.Serializer):
"""Сериализатор для ответа при выходе из системы"""
message = serializers.CharField(
help_text="Сообщение о успешном выходе",
read_only=True
)
class RefreshTokenRequestSerializer(serializers.Serializer):
"""Сериализатор для запроса обновления токена"""
refresh = serializers.CharField(
help_text="Refresh token для обновления",
required=True
)
class RefreshTokenResponseSerializer(serializers.Serializer):
"""Сериализатор для ответа с обновленными токенами"""
access = serializers.CharField(
help_text="Новый JWT access token",
read_only=True
)
refresh = serializers.CharField(
help_text="Новый JWT refresh token",
read_only=True
)
expires_at = serializers.FloatField(
help_text="Timestamp времени истечения access token",
read_only=True
)