]> git.parisson.com Git - django-social-auth.git/commitdiff
Force username field limit when generating username. Closes gh-93
authorMatías Aguirre <matiasaguirre@gmail.com>
Tue, 21 Jun 2011 02:58:25 +0000 (23:58 -0300)
committerMatías Aguirre <matiasaguirre@gmail.com>
Tue, 21 Jun 2011 02:58:25 +0000 (23:58 -0300)
social_auth/backends/__init__.py

index ce3046d4f575bcecd948cceed2a94c65b3f8480c..4aa8de0f5c10911b6b1f52f55866469b176537fd 100644 (file)
@@ -77,6 +77,7 @@ FORCE_RANDOM_USERNAME = _setting('SOCIAL_AUTH_FORCE_RANDOM_USERNAME', False)
 USERNAME_FIXER = _setting('SOCIAL_AUTH_USERNAME_FIXER', lambda u: u)
 DEFAULT_USERNAME = _setting('SOCIAL_AUTH_DEFAULT_USERNAME')
 CHANGE_SIGNAL_ONLY = _setting('SOCIAL_AUTH_CHANGE_SIGNAL_ONLY', False)
+UUID_LENGHT = _setting('SOCIAL_AUTH_UUID_LENGTH', 16)
 
 
 class SocialAuthBackend(ModelBackend):
@@ -156,12 +157,12 @@ class SocialAuthBackend(ModelBackend):
         setting is True, then username will be a random USERNAME_MAX_LENGTH
         chars uuid generated hash
         """
-        def get_random_username():
-            """Return hash from unique string cut at username max length"""
-            return uuid4().get_hex()[:USERNAME_MAX_LENGTH]
+        def mk_uuid():
+            """Return hash from unique string"""
+            return uuid4().get_hex()
 
         if FORCE_RANDOM_USERNAME:
-            username = get_random_username()
+            username = mk_uuid()
         elif USERNAME in details:
             username = details[USERNAME]
         elif DEFAULT_USERNAME:
@@ -169,31 +170,24 @@ class SocialAuthBackend(ModelBackend):
             if callable(username):
                 username = username()
         else:
-            username = None
-        username = username or get_random_username()
+            username = mk_uuid()
 
-        name = username
+        short_username = username[:USERNAME_MAX_LENGTH - UUID_LENGHT]
         final_username = None
 
-        while not final_username:
+        while True:
+            final_username = USERNAME_FIXER(username)[:USERNAME_MAX_LENGTH]
+
             try:
-                fixed_name = USERNAME_FIXER(name)
-                User.objects.get(username=fixed_name)
+                User.objects.get(username=final_username)
             except User.DoesNotExist:
-                final_username = fixed_name
+                break
             else:
                 # User with same username already exists, generate a unique
                 # username for current user using username as base but adding
-                # a unique hash at the end.
-                #
-                # Generate an uuid number but keep only the needed to avoid
-                # breaking the field max_length value, this reduces the
-                # uniqueness, but it's less likely to happen repetitions than
-                # increasing an index.
-                uuid_length = getattr(settings, 'SOCIAL_AUTH_UUID_LENGTH', 16)
-                if len(username) + uuid_length > USERNAME_MAX_LENGTH:
-                    username = username[:USERNAME_MAX_LENGTH - uuid_length]
-                name = username + uuid4().get_hex()[:uuid_length]
+                # a unique hash at the end. Original username is cut to avoid
+                # the field max_length.
+                username = short_username + mk_uuid()[:UUID_LENGHT]
 
         return final_username