67 lines
2.4 KiB
Python
67 lines
2.4 KiB
Python
import re
|
|
|
|
from django.utils.translation import ugettext_lazy as _
|
|
from django.core.validators import MaxLengthValidator, RegexValidator
|
|
from django.db.models.signals import class_prepared
|
|
from django.db.models import FieldDoesNotExist
|
|
from django.contrib.auth import forms
|
|
from django.contrib.auth import get_user_model
|
|
|
|
from . import validators, app_settings, admin_forms
|
|
|
|
MAX_USERNAME_LENGTH = 255
|
|
|
|
def longer_username_signal(sender, *args, **kwargs):
|
|
if (sender.__name__ == "User" and
|
|
sender.__module__ == "django.contrib.auth.models"):
|
|
patch_user_model(sender)
|
|
class_prepared.connect(longer_username_signal)
|
|
|
|
def patch_user_model(model):
|
|
patch_username(model)
|
|
patch_email(model)
|
|
|
|
def patch_username(model):
|
|
'''Patch username max_length, validation regexp and help text'''
|
|
try:
|
|
field = model._meta.get_field("username")
|
|
except FieldDoesNotExist:
|
|
return
|
|
|
|
field.max_length = MAX_USERNAME_LENGTH
|
|
field.help_text = _("Required, %s characters or fewer. Only letters, "
|
|
"numbers, and @, ., +, -, or _ "
|
|
"characters." % MAX_USERNAME_LENGTH)
|
|
if app_settings.A2_USERNAME_HELP_TEXT:
|
|
field.help_text = app_settings.A2_USERNAME_HELP_TEXT
|
|
|
|
# patch model field validator because validator doesn't change if we change
|
|
# max_length
|
|
for v in field.validators:
|
|
if isinstance(v, MaxLengthValidator):
|
|
v.limit_value = MAX_USERNAME_LENGTH
|
|
if isinstance(v, RegexValidator):
|
|
if app_settings.A2_USERNAME_REGEX:
|
|
v.regex = re.compile(app_settings.A2_USERNAME_REGEX)
|
|
if app_settings.A2_USERNAME_REGEX:
|
|
r = re.compile(app_settings.A2_USERNAME_REGEX, re.UNICODE)
|
|
for form in (forms.UserChangeForm, forms.UserCreationForm,
|
|
admin_forms.UserChangeForm, admin_forms.UserCreationForm):
|
|
field = form.declared_fields['username']
|
|
field.regex = r
|
|
field.max_length = MAX_USERNAME_LENGTH
|
|
field.widget.attrs[u'maxlength'] = MAX_USERNAME_LENGTH
|
|
if app_settings.A2_USERNAME_HELP_TEXT:
|
|
field.help_text = app_settings.A2_USERNAME_HELP_TEXT
|
|
|
|
def patch_email(model):
|
|
try:
|
|
field = model._meta.get_field("email")
|
|
except FieldDoesNotExist:
|
|
return
|
|
|
|
field.validators.append(validators.EmailValidator())
|
|
|
|
patch_user_model(get_user_model())
|
|
|