62 lines
2.7 KiB
Python
62 lines
2.7 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() |