From 39d423e437a38c924bff93233780f0eaaad4380d Mon Sep 17 00:00:00 2001 From: "Casper V. Kristensen" Date: Wed, 20 Nov 2019 23:24:19 +0100 Subject: [PATCH] Make usernames case-insensitive. --- drakul/users/models.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/drakul/users/models.py b/drakul/users/models.py index 1166d99..f6e17aa 100644 --- a/drakul/users/models.py +++ b/drakul/users/models.py @@ -1,4 +1,5 @@ from django.contrib.auth.models import AbstractUser +from django.contrib.auth.models import UserManager as DjangoUserManager from django.core.exceptions import ValidationError from django.core.validators import RegexValidator, MinLengthValidator from django.db import models, transaction @@ -20,6 +21,11 @@ class Rank(models.Model): return self.name +class UserManager(DjangoUserManager): + def get_by_natural_key(self, username): + return super().get_by_natural_key(self.model.normalize_username(username)) + + class User(AbstractUser): first_name = None last_name = None @@ -37,15 +43,25 @@ class User(AbstractUser): blank=True ) + objects = UserManager() + class Meta: ordering = ["rank", "username"] def clean(self): + self.username = self.normalize_username(self.username) if not hasattr(self, "rank"): self.rank = Rank.objects.last() if hasattr(self, "main") and self.main.user != self: raise ValidationError({"main": "Main character must be owned by user."}) + @classmethod + def normalize_username(cls, username): + """ + Make username case-insensitive. + """ + return super().normalize_username(username).lower() + @transaction.atomic def save(self, *args, **kwargs): if not hasattr(self, "main"):