Просмотр исходного кода

Allow unicode characters in user names #24

Ralfp 12 лет назад
Родитель
Сommit
327d13c64f

+ 1 - 1
misago/markdown/extensions/mentions.py

@@ -6,7 +6,7 @@ from misago.users.models import User
 from misago.utils import slugify
 
 # Global vars
-MENTION_RE = re.compile(r'([^\w\d]?)@(?P<username>(\w|\d)+)')
+MENTION_RE = re.compile(r'([^\w]?)@(?P<username>(\w)+)', re.UNICODE)
 
 class MentionsExtension(markdown.Extension):
     def extendMarkdown(self, md):

+ 2 - 1
misago/register/forms.py

@@ -5,7 +5,7 @@ from misago.forms import Form
 from misago import captcha
 from misago.timezones import tzlist
 from misago.users.models import User
-from misago.users.validators import validate_password, validate_email
+from misago.users.validators import validate_username, validate_password, validate_email
 
 
 class UserRegisterForm(Form):
@@ -52,6 +52,7 @@ class UserRegisterForm(Form):
             del self.layout[3]
         
     def clean_username(self):
+        validate_username(self.cleaned_data['username'])
         new_user = User.objects.get_blank_user()
         new_user.set_username(self.cleaned_data['username'])
         try:

+ 3 - 0
misago/settings_base.py

@@ -15,6 +15,9 @@ OUTPUT_FORMAT = 'html5'
 # Remember to run "genavatars" command when you change this setting!
 AVATAR_SIZES = (125, 100, 80, 60, 40, 24)
 
+# Allow usernames to contain diacritics
+UNICODE_USERNAMES = True 
+
 # If you set this to False, Django will make some optimizations so as not
 # to load the internationalization machinery.
 USE_I18N = True

+ 3 - 1
misago/users/forms.py

@@ -6,7 +6,7 @@ from django import forms
 from misago.ranks.models import Rank
 from misago.roles.models import Role
 from misago.users.models import User
-from misago.users.validators import validate_password, validate_email
+from misago.users.validators import validate_username, validate_password, validate_email
 from misago.forms import Form, YesNoSwitch
 
 class UserForm(Form):
@@ -81,6 +81,7 @@ class UserForm(Form):
             del self.layout[1]
 
     def clean_username(self):
+        validate_username(self.cleaned_data['username'])
         self.user.set_username(self.cleaned_data['username'])
         try:
             self.user.full_clean()
@@ -156,6 +157,7 @@ class NewUserForm(Form):
         super(NewUserForm, self).__init__(*args, **kwargs)
 
     def clean_username(self):
+        validate_username(self.cleaned_data['username'])
         new_user = User.objects.get_blank_user()
         new_user.set_username(self.cleaned_data['username'])
         try:

+ 7 - 2
misago/users/validators.py

@@ -1,4 +1,5 @@
 import re
+from django.conf import settings
 from django.core.exceptions import ValidationError
 from django.utils.translation import ungettext, ugettext_lazy as _
 from misago.banning.models import check_ban
@@ -10,8 +11,12 @@ def validate_username(value):
         raise ValidationError(_("Username cannot be shorter than 3 characters."))
     if len(value) > 12:
         raise ValidationError(_("Username cannot be longer than 12 characters."))
-    if not re.search('^[0-9a-zA-Z]+$', value):
-        raise ValidationError(_("Username can only contain letters and digits."))
+    if settings.UNICODE_USERNAMES:
+        if not re.search('^[^\W_]+$', value, re.UNICODE):
+            raise ValidationError(_("Username can only contain letters and digits."))
+    else:
+        if not re.search('^[^\W_]+$', value):
+            raise ValidationError(_("Username can only contain latin alphabet letters and digits."))
     if check_ban(username=value):
         raise ValidationError(_("This username is forbidden."))