first commit
This commit is contained in:
74
accounts/serializers.py
Normal file
74
accounts/serializers.py
Normal file
@@ -0,0 +1,74 @@
|
||||
from rest_framework import serializers
|
||||
from djoser.serializers import UserCreateSerializer as BaseUserCreateSerializer
|
||||
from djoser.serializers import UserSerializer as BaseUserSerializer
|
||||
from .models import CustomUser
|
||||
|
||||
|
||||
class CustomUserCreateSerializer(BaseUserCreateSerializer):
|
||||
"""
|
||||
Custom serializer for user registration.
|
||||
Sets is_active=False by default so users must activate via email.
|
||||
"""
|
||||
|
||||
class Meta(BaseUserCreateSerializer.Meta):
|
||||
model = CustomUser
|
||||
fields = ('id', 'email', 'password', 're_password', 'first_name', 'last_name')
|
||||
|
||||
def create(self, validated_data):
|
||||
"""
|
||||
Override create to ensure is_active=False for email/password registrations.
|
||||
Social auth users will have is_active=True set via pipeline.
|
||||
"""
|
||||
# Remove re_password as it's only for validation
|
||||
validated_data.pop('re_password', None)
|
||||
|
||||
# Create user with is_active=False
|
||||
user = CustomUser.objects.create_user(
|
||||
email=validated_data['email'],
|
||||
password=validated_data['password'],
|
||||
first_name=validated_data.get('first_name', ''),
|
||||
last_name=validated_data.get('last_name', ''),
|
||||
is_active=False # Requires email activation
|
||||
)
|
||||
return user
|
||||
|
||||
|
||||
class CustomUserSerializer(BaseUserSerializer):
|
||||
"""
|
||||
Serializer for user details.
|
||||
Used for current user endpoint and user profile.
|
||||
"""
|
||||
|
||||
class Meta(BaseUserSerializer.Meta):
|
||||
model = CustomUser
|
||||
fields = ('id', 'email', 'first_name', 'last_name', 'is_active', 'date_joined')
|
||||
read_only_fields = ('id', 'email', 'is_active', 'date_joined')
|
||||
|
||||
|
||||
class SocialLoginSerializer(serializers.Serializer):
|
||||
"""
|
||||
Serializer for social authentication.
|
||||
Accepts provider name and access_token from frontend.
|
||||
"""
|
||||
provider = serializers.ChoiceField(
|
||||
choices=['google-oauth2', 'github', 'facebook'],
|
||||
help_text="Social auth provider name"
|
||||
)
|
||||
access_token = serializers.CharField(
|
||||
help_text="Access token from the social provider"
|
||||
)
|
||||
id_token = serializers.CharField(
|
||||
required=False,
|
||||
allow_blank=True,
|
||||
help_text="ID token (optional, used by some providers like Google)"
|
||||
)
|
||||
|
||||
def validate_provider(self, value):
|
||||
"""Validate that the provider is supported."""
|
||||
valid_providers = ['google-oauth2', 'github', 'facebook']
|
||||
if value not in valid_providers:
|
||||
raise serializers.ValidationError(
|
||||
f"Invalid provider. Must be one of: {', '.join(valid_providers)}"
|
||||
)
|
||||
return value
|
||||
|
||||
Reference in New Issue
Block a user