from rest_framework import serializers from drf_spectacular.utils import extend_schema_field from apps.accounts.models import UserProfile, TopList, TopListItem from apps.accounts.serializers import UserSerializer # existing shared user serializer class UserProfileCreateInputSerializer(serializers.ModelSerializer): class Meta: model = UserProfile fields = "__all__" class UserProfileUpdateInputSerializer(serializers.ModelSerializer): class Meta: model = UserProfile fields = "__all__" extra_kwargs = {"user": {"read_only": True}} class UserProfileOutputSerializer(serializers.ModelSerializer): user = UserSerializer(read_only=True) avatar_url = serializers.SerializerMethodField() class Meta: model = UserProfile fields = "__all__" @extend_schema_field(serializers.URLField(allow_null=True)) def get_avatar_url(self, obj) -> str | None: """Get user avatar URL""" # Safely try to return an avatar url if present avatar = getattr(obj, "avatar", None) if avatar: return getattr(avatar, "url", None) user_profile = getattr(obj, "user", None) if user_profile and getattr(user_profile, "profile", None): avatar = getattr(user_profile.profile, "avatar", None) if avatar: return getattr(avatar, "url", None) return None class TopListItemCreateInputSerializer(serializers.ModelSerializer): class Meta: model = TopListItem fields = "__all__" class TopListItemUpdateInputSerializer(serializers.ModelSerializer): class Meta: model = TopListItem fields = "__all__" # allow updates, adjust as needed extra_kwargs = {"top_list": {"read_only": False}} class TopListItemOutputSerializer(serializers.ModelSerializer): # Remove the ride field since it doesn't exist on the model # The model likely uses a generic foreign key or different field name class Meta: model = TopListItem fields = "__all__" class TopListCreateInputSerializer(serializers.ModelSerializer): class Meta: model = TopList fields = "__all__" class TopListUpdateInputSerializer(serializers.ModelSerializer): class Meta: model = TopList fields = "__all__" # user is set by view's perform_create extra_kwargs = {"user": {"read_only": True}} class TopListOutputSerializer(serializers.ModelSerializer): user = UserSerializer(read_only=True) items = TopListItemOutputSerializer(many=True, read_only=True) class Meta: model = TopList fields = "__all__"