inputlogic / django-api-starter

Boilerplate for starting Django DRF / API projects
2 stars 0 forks source link

Specific serializer for user create/register #27

Closed staydecent closed 4 years ago

staydecent commented 5 years ago

I think we generally have a standard on the front-end to expect an access token and a userId to be returned after signup (so the user doesn't have to login right after sign up).

This is what I use:

class UserCreateSerializer(serializers.Serializer):
    user_id = serializers.IntegerField(read_only=True)
    token = serializers.CharField(read_only=True)
    email = serializers.EmailField(write_only=True)
    password = serializers.CharField(write_only=True)

    def create(self, validated_data):
        password = validated_data.pop('password')
        validated_data['email'] = validated_data['email'].lower()

        try:
            user = get_user_model().objects.get(email=validated_data['email'])
            if user.password or user.has_usable_password():
                raise ValidationError({
                    'non_field_errors': 'An account with email {} already exists.'.format(validated_data['email'])
                })
            else:
                user.set_password(password)
                user.save()
        except get_user_model().DoesNotExist:
            user = get_user_model()(**validated_data)
            user.set_password(password)
            user.save()

        Mail.send(settings.MAIL_NEW_ACCOUNT, user, {'email': 'john@example.com'})
        (token, _) = Token.objects.get_or_create(user=user)

        return {'token': token.key, 'user_id': user.id}