You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
3.4 KiB
119 lines
3.4 KiB
from django.contrib.auth import authenticate
|
|
|
|
from rest_framework import serializers
|
|
|
|
from .models import CustomUser, Profile, RefreshToken
|
|
from .repositories import UserRepository, ProfileRepository, RefreshTokenRepository
|
|
from .token_generators import generate_rt
|
|
|
|
|
|
class RegistrationSerializer(serializers.ModelSerializer):
|
|
password = serializers.CharField(
|
|
max_length=128,
|
|
min_length=8,
|
|
write_only=True
|
|
)
|
|
|
|
access_token = serializers.CharField(max_length=255, read_only=True)
|
|
refresh_token = serializers.CharField(max_length=255, read_only=True)
|
|
|
|
class Meta:
|
|
model = CustomUser
|
|
fields = ['email', 'password', 'access_token', 'refresh_token']
|
|
|
|
def create(self, validated_data):
|
|
user = UserRepository.create(**validated_data)
|
|
token = RefreshTokenRepository.create(
|
|
token=generate_rt(),
|
|
user=user
|
|
)
|
|
return {
|
|
'username': user.username,
|
|
'access_token': user.access_token,
|
|
'refresh_token': token.token
|
|
}
|
|
|
|
|
|
class LoginSerializer(serializers.Serializer):
|
|
email = serializers.CharField(max_length=255)
|
|
password = serializers.CharField(max_length=128, write_only=True)
|
|
access_token = serializers.CharField(max_length=255, read_only=True)
|
|
refresh_token = serializers.StringRelatedField(read_only=True)
|
|
|
|
def validate(self, attrs):
|
|
|
|
email = attrs.get('email', None)
|
|
password = attrs.get('password', None)
|
|
|
|
if email is None:
|
|
raise serializers.ValidationError(
|
|
str(attrs)
|
|
)
|
|
|
|
if password is None:
|
|
raise serializers.ValidationError(
|
|
'A password is required to log in'
|
|
)
|
|
|
|
user = authenticate(username=email, password=password)
|
|
|
|
if user is None:
|
|
raise serializers.ValidationError(
|
|
'A user with this username and password was not found'
|
|
)
|
|
|
|
token = RefreshTokenRepository.create(
|
|
token=generate_rt(),
|
|
user=user
|
|
)
|
|
|
|
return {
|
|
"email": email,
|
|
'access_token': user.access_token,
|
|
'refresh_token': token.token
|
|
}
|
|
|
|
|
|
class CustomUserSerializer(serializers.ModelSerializer):
|
|
|
|
password = serializers.CharField(
|
|
max_length=128,
|
|
min_length=8,
|
|
write_only=True
|
|
)
|
|
|
|
class Meta:
|
|
model = CustomUser
|
|
fields = ('email', 'is_staff', 'password')
|
|
read_only_fields = ('is_staff',)
|
|
|
|
def update(self, instance, validated_data):
|
|
|
|
password = validated_data.pop('password', None)
|
|
|
|
for key, value in validated_data.items():
|
|
setattr(instance, key, value)
|
|
|
|
if password is not None:
|
|
instance.set_password(password)
|
|
|
|
instance.save()
|
|
|
|
return instance
|
|
|
|
|
|
class ProfileSerializer(serializers.ModelSerializer):
|
|
user = serializers.StringRelatedField()
|
|
count_friends = serializers.SerializerMethodField(read_only=True)
|
|
count_subscribers = serializers.SerializerMethodField(read_only=True)
|
|
|
|
def get_friends(self, obj):
|
|
return obj.friends.filter(approved=True).count()
|
|
|
|
def get_subscribers(self, obj):
|
|
return obj.friends.filter(approved=False).count()
|
|
|
|
class Meta:
|
|
model = Profile
|
|
fields = ('user', 'first_name', 'last_name', 'title', 'avatar', 'count_friends', 'count_subscribers')
|