Made username creation/login case insensitive.
This commit is contained in:
parent
53581637d8
commit
e752c2dd64
5 changed files with 57 additions and 7 deletions
|
|
@ -25,6 +25,13 @@ class CustomUserChangeForm(UserChangeForm):
|
||||||
widget=forms.TextInput(attrs={'size':'30'}),
|
widget=forms.TextInput(attrs={'size':'30'}),
|
||||||
error_messages = {'invalid': "This value may contain only letters, spaces, numbers and @/./+/-/_ characters."},
|
error_messages = {'invalid': "This value may contain only letters, spaces, numbers and @/./+/-/_ characters."},
|
||||||
help_text = "30 characters or fewer. Letters, spaces, digits and @/./+/-/_ only.")
|
help_text = "30 characters or fewer. Letters, spaces, digits and @/./+/-/_ only.")
|
||||||
|
def clean_username(self):
|
||||||
|
username = self.cleaned_data['username']
|
||||||
|
if username.upper() == self.instance.username.upper():
|
||||||
|
return username
|
||||||
|
elif User.objects.filter(username__iexact=username):
|
||||||
|
raise forms.ValidationError('A player with that name already exists.')
|
||||||
|
return self.cleaned_data['username']
|
||||||
|
|
||||||
class CustomUserCreationForm(UserCreationForm):
|
class CustomUserCreationForm(UserCreationForm):
|
||||||
username = forms.RegexField(label="Username",
|
username = forms.RegexField(label="Username",
|
||||||
|
|
@ -34,6 +41,13 @@ class CustomUserCreationForm(UserCreationForm):
|
||||||
error_messages = {'invalid': "This value may contain only letters, spaces, numbers and @/./+/-/_ characters."},
|
error_messages = {'invalid': "This value may contain only letters, spaces, numbers and @/./+/-/_ characters."},
|
||||||
help_text = "30 characters or fewer. Letters, spaces, digits and @/./+/-/_ only.")
|
help_text = "30 characters or fewer. Letters, spaces, digits and @/./+/-/_ only.")
|
||||||
|
|
||||||
|
def clean_username(self):
|
||||||
|
username = self.cleaned_data['username']
|
||||||
|
if User.objects.filter(username__iexact=username):
|
||||||
|
raise forms.ValidationError('A player with that name already exists.')
|
||||||
|
return username
|
||||||
|
|
||||||
|
|
||||||
# # The Player editor
|
# # The Player editor
|
||||||
# class PlayerAttributeForm(forms.ModelForm):
|
# class PlayerAttributeForm(forms.ModelForm):
|
||||||
# "Defines how to display the atttributes"
|
# "Defines how to display the atttributes"
|
||||||
|
|
@ -127,20 +141,30 @@ class UserAdmin(BaseUserAdmin):
|
||||||
{'fields': ('username', 'password1', 'password2', 'email'),
|
{'fields': ('username', 'password1', 'password2', 'email'),
|
||||||
'description':"<i>These account details are shared by the admin system and the game.</i>"},),)
|
'description':"<i>These account details are shared by the admin system and the game.</i>"},),)
|
||||||
|
|
||||||
|
def is_valid(self):
|
||||||
|
raise Exception
|
||||||
|
if not super(UserAdmin, self).is_valid():
|
||||||
|
return False
|
||||||
|
username = self.cleaned_data['username']
|
||||||
|
if self.instance and self.instance.username.upper() == username.upper():
|
||||||
|
return True
|
||||||
|
elif User.objects.filter(username__iexact=username):
|
||||||
|
raise ValidationError({'username' : 'A player with that name already exists.'})
|
||||||
|
return True
|
||||||
|
|
||||||
def save_formset(self, request, form, formset, change):
|
def save_formset(self, request, form, formset, change):
|
||||||
"Run all hooks on the player object"
|
"Run all hooks on the player object"
|
||||||
super(UserAdmin, self).save_formset(request, form, formset, change)
|
super(UserAdmin, self).save_formset(request, form, formset, change)
|
||||||
userobj = form.instance
|
userobj = form.instance
|
||||||
playerobj = userobj.get_profile()
|
playerobj = userobj.get_profile()
|
||||||
|
playerobj.name = userobj.username
|
||||||
if not change:
|
if not change:
|
||||||
#uname, passwd, email = str(request.POST.get(u"username")), \
|
#uname, passwd, email = str(request.POST.get(u"username")), \
|
||||||
# str(request.POST.get(u"password1")), str(request.POST.get(u"email"))
|
# str(request.POST.get(u"password1")), str(request.POST.get(u"email"))
|
||||||
typeclass = str(request.POST.get(u"playerdb_set-0-db_typeclass_path"))
|
typeclass = str(request.POST.get(u"playerdb_set-0-db_typeclass_path"))
|
||||||
|
|
||||||
create.create_player("","","",
|
create.create_player("","","",
|
||||||
user=userobj,
|
user=userobj,
|
||||||
typeclass=typeclass,
|
typeclass=typeclass,
|
||||||
player_dbobj=playerobj,
|
player_dbobj=playerobj)
|
||||||
create_character=False)
|
|
||||||
|
|
||||||
admin.site.register(User, UserAdmin)
|
admin.site.register(User, UserAdmin)
|
||||||
|
|
|
||||||
|
|
@ -148,7 +148,7 @@ class PlayerManager(TypedObjectManager):
|
||||||
def get_player_from_name(self, uname):
|
def get_player_from_name(self, uname):
|
||||||
"Get player object based on name"
|
"Get player object based on name"
|
||||||
try:
|
try:
|
||||||
return self.get(user__username=uname)
|
return self.get(user__username__iexact=uname)
|
||||||
except self.model.DoesNotExist:
|
except self.model.DoesNotExist:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -82,6 +82,8 @@ HTTP_LOG_FILE = os.path.join(LOG_DIR, 'http_requests.log')
|
||||||
# Local time zone for this installation. All choices can be found here:
|
# Local time zone for this installation. All choices can be found here:
|
||||||
# http://www.postgresql.org/docs/8.0/interactive/datetime-keywords.html#DATETIME-TIMEZONE-SET-TABLE
|
# http://www.postgresql.org/docs/8.0/interactive/datetime-keywords.html#DATETIME-TIMEZONE-SET-TABLE
|
||||||
TIME_ZONE = 'UTC'
|
TIME_ZONE = 'UTC'
|
||||||
|
# Authentication backends. This is the code used to authenticate a user.
|
||||||
|
AUTHENTICATION_BACKENDS = ('src.web.backends.CaseInsensitiveModelBackend',)
|
||||||
# Language code for this installation. All choices can be found here:
|
# Language code for this installation. All choices can be found here:
|
||||||
# http://www.w3.org/TR/REC-html40/struct/dirlang.html#langcodes
|
# http://www.w3.org/TR/REC-html40/struct/dirlang.html#langcodes
|
||||||
LANGUAGE_CODE = 'en-us'
|
LANGUAGE_CODE = 'en-us'
|
||||||
|
|
|
||||||
|
|
@ -432,9 +432,6 @@ def create_player(name, email, password,
|
||||||
set any in this case.
|
set any in this case.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
# The system should already have checked so the name/email
|
|
||||||
# isn't already registered, and that the password is ok before
|
|
||||||
# getting here.
|
|
||||||
global _PlayerDB, _Player
|
global _PlayerDB, _Player
|
||||||
if not _PlayerDB:
|
if not _PlayerDB:
|
||||||
from src.players.models import PlayerDB as _PlayerDB
|
from src.players.models import PlayerDB as _PlayerDB
|
||||||
|
|
@ -446,7 +443,17 @@ def create_player(name, email, password,
|
||||||
if user:
|
if user:
|
||||||
new_user = user
|
new_user = user
|
||||||
email = user.email
|
email = user.email
|
||||||
|
|
||||||
|
if user:
|
||||||
|
conflict_check = User.objects.filter(username__iexact=user.username)
|
||||||
|
conflict_check = len(conflict_check) > 1
|
||||||
else:
|
else:
|
||||||
|
conflict_check = User.objects.filter(username__iexact=name)
|
||||||
|
|
||||||
|
if conflict_check:
|
||||||
|
raise ValueError("A user with this name already exists.")
|
||||||
|
|
||||||
|
if not user:
|
||||||
if is_superuser:
|
if is_superuser:
|
||||||
new_user = User.objects.create_superuser(name, email, password)
|
new_user = User.objects.create_superuser(name, email, password)
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
17
src/web/backends.py
Normal file
17
src/web/backends.py
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
from django.contrib.auth.backends import ModelBackend
|
||||||
|
from django.contrib.auth.models import User
|
||||||
|
|
||||||
|
class CaseInsensitiveModelBackend(ModelBackend):
|
||||||
|
"""
|
||||||
|
By default ModelBackend does case _sensitive_ username authentication, which isn't what is
|
||||||
|
generally expected. This backend supports case insensitive username authentication.
|
||||||
|
"""
|
||||||
|
def authenticate(self, username=None, password=None):
|
||||||
|
try:
|
||||||
|
user = User.objects.get(username__iexact=username)
|
||||||
|
if user.check_password(password):
|
||||||
|
return user
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
except User.DoesNotExist:
|
||||||
|
return None
|
||||||
Loading…
Add table
Add a link
Reference in a new issue