User: make username case insensitive (and save original styling).

We want 'User' and 'UsEr' to mean the same user. Apparently that's not the default in
django. This normalizes the user to ensure we enforce this.
pull/56/head
Tom Hacohen 4 years ago
parent 9a518b3907
commit 7ec45434ba

@ -382,7 +382,12 @@ class AuthenticationSignupSerializer(serializers.Serializer):
user_data = validated_data.pop('user') user_data = validated_data.pop('user')
with transaction.atomic(): with transaction.atomic():
instance, _ = User.objects.get_or_create(**user_data) try:
instance = User.objects.get_by_natural_key(user_data['username'])
except User.DoesNotExist:
# Create the user and save the casing the user chose as the first name
instance = User.objects.create_user(**user_data, first_name=user_data['username'])
if hasattr(instance, 'userinfo'): if hasattr(instance, 'userinfo'):
raise serializers.ValidationError('User already exists') raise serializers.ValidationError('User already exists')

@ -1,4 +1,4 @@
from django.contrib.auth.models import AbstractUser from django.contrib.auth.models import AbstractUser, UserManager as DjangoUserManager
from django.core import validators from django.core import validators
from django.db import models from django.db import models
from django.utils.deconstruct import deconstructible from django.utils.deconstruct import deconstructible
@ -15,9 +15,16 @@ class UnicodeUsernameValidator(validators.RegexValidator):
flags = 0 flags = 0
class UserManager(DjangoUserManager):
def get_by_natural_key(self, username):
return self.get(**{self.model.USERNAME_FIELD + '__iexact': username})
class User(AbstractUser): class User(AbstractUser):
username_validator = UnicodeUsernameValidator() username_validator = UnicodeUsernameValidator()
objects = UserManager()
username = models.CharField( username = models.CharField(
_('username'), _('username'),
max_length=150, max_length=150,
@ -28,3 +35,7 @@ class User(AbstractUser):
'unique': _("A user with that username already exists."), 'unique': _("A user with that username already exists."),
}, },
) )
@classmethod
def normalize_username(cls, username):
return super().normalize_username(username).lower()

Loading…
Cancel
Save