Files
aerbim-ht-monitor/backend/api/auth/serializers.py
Timofey 90461b61cc docs
2025-08-29 14:48:55 +03:00

67 lines
2.9 KiB
Python

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="Логин пользователя")
password = serializers.CharField(help_text="Пароль пользователя", write_only=True)
class LoginResponseSerializer(serializers.Serializer):
"""Сериализатор для ответа при успешной авторизации"""
message = serializers.CharField()
access = serializers.CharField()
refresh = serializers.CharField()
user = UserResponseSerializer()
class LogoutResponseSerializer(serializers.Serializer):
"""Сериализатор для ответа при выходе из системы"""
message = serializers.CharField()