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()