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 )