72 lines
2.3 KiB
Python
72 lines
2.3 KiB
Python
|
|
"""User serializers"""
|
||
|
|
|
||
|
|
from rest_framework import serializers
|
||
|
|
from user.models import Account
|
||
|
|
|
||
|
|
|
||
|
|
class AccountSerializer(serializers.ModelSerializer):
|
||
|
|
"""Account serializer"""
|
||
|
|
avatar_url = serializers.SerializerMethodField()
|
||
|
|
|
||
|
|
class Meta:
|
||
|
|
model = Account
|
||
|
|
fields = [
|
||
|
|
'id', 'username', 'email', 'date_joined', 'last_login',
|
||
|
|
'two_factor_enabled', 'avatar', 'avatar_url',
|
||
|
|
'is_admin', 'is_superuser', 'is_staff',
|
||
|
|
'storage_quota_gb', 'storage_used_gb',
|
||
|
|
'max_channels', 'max_playlists'
|
||
|
|
]
|
||
|
|
read_only_fields = [
|
||
|
|
'id', 'date_joined', 'last_login', 'two_factor_enabled', 'avatar_url',
|
||
|
|
'is_admin', 'is_superuser', 'is_staff',
|
||
|
|
'storage_used_gb'
|
||
|
|
]
|
||
|
|
|
||
|
|
def get_avatar_url(self, obj):
|
||
|
|
"""Get avatar URL"""
|
||
|
|
if not obj.avatar:
|
||
|
|
return None
|
||
|
|
|
||
|
|
# Preset avatars (served from frontend public folder)
|
||
|
|
if obj.avatar.startswith('preset_'):
|
||
|
|
return f"/avatars/{obj.avatar}.svg"
|
||
|
|
|
||
|
|
# Custom avatars (served from backend)
|
||
|
|
return f"/api/user/avatar/file/{obj.avatar.split('/')[-1]}/"
|
||
|
|
|
||
|
|
|
||
|
|
class LoginSerializer(serializers.Serializer):
|
||
|
|
"""Login serializer"""
|
||
|
|
username = serializers.CharField()
|
||
|
|
password = serializers.CharField(write_only=True)
|
||
|
|
two_factor_code = serializers.CharField(required=False, allow_blank=True)
|
||
|
|
|
||
|
|
|
||
|
|
class UserConfigSerializer(serializers.Serializer):
|
||
|
|
"""User configuration serializer"""
|
||
|
|
theme = serializers.CharField(default='dark')
|
||
|
|
items_per_page = serializers.IntegerField(default=50)
|
||
|
|
audio_quality = serializers.ChoiceField(
|
||
|
|
choices=['low', 'medium', 'high', 'best'],
|
||
|
|
default='best'
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
class TwoFactorSetupSerializer(serializers.Serializer):
|
||
|
|
"""2FA setup response"""
|
||
|
|
secret = serializers.CharField()
|
||
|
|
qr_code = serializers.CharField()
|
||
|
|
backup_codes = serializers.ListField(child=serializers.CharField())
|
||
|
|
|
||
|
|
|
||
|
|
class TwoFactorVerifySerializer(serializers.Serializer):
|
||
|
|
"""2FA verification"""
|
||
|
|
code = serializers.CharField(min_length=6, max_length=6)
|
||
|
|
|
||
|
|
|
||
|
|
class TwoFactorStatusSerializer(serializers.Serializer):
|
||
|
|
"""2FA status"""
|
||
|
|
enabled = serializers.BooleanField()
|
||
|
|
backup_codes_count = serializers.IntegerField()
|