Source code for oscarapi.serializers.login
# pylint: disable=W0223
from django.core.exceptions import ValidationError
from django.contrib.auth import get_user_model, authenticate, password_validation
from rest_framework import serializers
from oscarapi import settings
User = get_user_model()
def field_length(fieldname):
field = next(field for field in User._meta.fields if field.name == fieldname)
return field.max_length
[docs]class UserSerializer(serializers.ModelSerializer):
date_joined = serializers.DateTimeField(read_only=True)
class Meta:
model = User
fields = settings.USER_FIELDS
class LoginSerializer(serializers.Serializer):
username = serializers.CharField(
max_length=field_length(User.USERNAME_FIELD), required=True
)
password = serializers.CharField(
max_length=field_length("password"),
required=True,
style={"input_type": "password"},
)
def validate(self, attrs):
user = authenticate(username=attrs["username"], password=attrs["password"])
if user is None:
raise serializers.ValidationError("invalid login")
elif not user.is_active:
raise serializers.ValidationError("Can not log in as inactive user")
# set instance to the user so we can use this in the view
self.instance = user
return attrs
class RegisterUserSerializer(serializers.Serializer):
email = serializers.EmailField(max_length=field_length("email"), required=True)
password1 = serializers.CharField(
max_length=field_length("password"),
required=True,
style={"input_type": "password"},
)
password2 = serializers.CharField(
max_length=field_length("password"),
required=True,
style={"input_type": "password"},
)
def validate(self, attrs):
if User.objects.filter(email=attrs["email"]).exists():
raise serializers.ValidationError("A user with this email already exists")
if attrs["password1"] != attrs["password2"]:
raise serializers.ValidationError("Passwords do not match")
try:
password_validation.validate_password(attrs["password1"])
except ValidationError as e:
raise serializers.ValidationError(str(e))
return attrs
def create_user(self, email, password):
# this is a separate method so it's easy to override
return User.objects.create_user(username=email, email=email, password=password)
def save(self, *args, **kwargs):
email = self.validated_data["email"]
password = self.validated_data["password1"]
return self.create_user(email, password)