53 lines
1.8 KiB
Python
53 lines
1.8 KiB
Python
from django.contrib.auth import get_user_model
|
|
from rest_framework import serializers
|
|
|
|
# Intentional cross-app import: users depends on photos for DB-backed avatar.
|
|
from apps.photos.models import Photo
|
|
|
|
User = get_user_model()
|
|
|
|
|
|
class UserProfileSerializer(serializers.ModelSerializer):
|
|
# Write: accept a Photo PK; Read: return the serve URL
|
|
avatar = serializers.PrimaryKeyRelatedField(
|
|
required=False,
|
|
allow_null=True,
|
|
queryset=Photo.objects.all(),
|
|
)
|
|
avatar_url = serializers.SerializerMethodField()
|
|
is_staff = serializers.BooleanField(read_only=True)
|
|
|
|
class Meta:
|
|
model = User
|
|
fields = ['id', 'email', 'username', 'first_name', 'last_name',
|
|
'avatar', 'avatar_url', 'is_staff', 'language']
|
|
read_only_fields = ['id', 'email', 'username', 'is_staff']
|
|
|
|
def get_avatar_url(self, obj) -> str | None:
|
|
if not obj.avatar_id:
|
|
return None
|
|
return f'/api/photos/{obj.avatar_id}/data/'
|
|
|
|
|
|
class AdminUserSerializer(serializers.ModelSerializer):
|
|
"""Flat serializer for the admin user-management panel."""
|
|
|
|
class Meta:
|
|
model = User
|
|
fields = ['id', 'email', 'username', 'first_name', 'last_name',
|
|
'is_active', 'is_staff', 'date_joined']
|
|
read_only_fields = ['id', 'email', 'username', 'date_joined']
|
|
|
|
|
|
class AdminCreateUserSerializer(serializers.ModelSerializer):
|
|
"""Serializer used by admins to create a new user account."""
|
|
password = serializers.CharField(write_only=True, min_length=8)
|
|
|
|
class Meta:
|
|
model = User
|
|
fields = ['username', 'email', 'password', 'first_name', 'last_name', 'is_staff']
|
|
|
|
def create(self, validated_data):
|
|
password = validated_data.pop('password')
|
|
return User.objects.create_user(password=password, **validated_data)
|