Browse Source

Switch to random organization slug dupliate suffix, avoids seeking
sequential numbers

David Burke 2 years ago
parent
commit
d9ed82852d
3 changed files with 26 additions and 2 deletions
  1. 1 0
      glitchtip/test_utils/generators.py
  2. 22 0
      organizations_ext/fields.py
  3. 3 2
      organizations_ext/models.py

+ 1 - 0
glitchtip/test_utils/generators.py

@@ -7,6 +7,7 @@ def currency_code():
 
 
 baker.generators.add("organizations.fields.SlugField", gen_slug)
+baker.generators.add("organizations_ext.fields.OrganizationSlugField", gen_slug)
 baker.generators.add("djstripe.fields.StripeCurrencyCodeField", currency_code)
 baker.generators.add("djstripe.fields.StripeIdField", gen_slug)
 baker.generators.add("djstripe.fields.StripeDateTimeField", gen_datetime)

+ 22 - 0
organizations_ext/fields.py

@@ -0,0 +1,22 @@
+import random
+import string
+
+from django_extensions.db.fields import AutoSlugField
+
+
+class OrganizationSlugField(AutoSlugField):
+    """
+    Generate a random alphanumeric slug starting at length 2.
+    Increase length by 1 if collision is found.
+    """
+
+    def slug_generator(self, original_slug, start):
+        yield original_slug
+        for i in range(start, self.max_unique_query_attempts):
+            yield original_slug + "-" + "".join(
+                random.choices(string.ascii_lowercase + string.digits, k=i)
+            )
+        raise RuntimeError(
+            "max slug attempts for %s exceeded (%s)"
+            % (original_slug, self.max_unique_query_attempts)
+        )

+ 3 - 2
organizations_ext/models.py

@@ -11,11 +11,12 @@ from organizations.base import (
     OrganizationOwnerBase,
     OrganizationUserBase,
 )
-from organizations.fields import SlugField
 from organizations.managers import OrgManager
 from organizations.signals import owner_changed, user_added
 from sql_util.utils import SubqueryCount, SubquerySum
 
+from .fields import OrganizationSlugField
+
 # Defines which scopes belong to which role
 # Credit to sentry/conf/server.py
 ROLES = (
@@ -197,7 +198,7 @@ class OrganizationManager(OrgManager):
 
 
 class Organization(SharedBaseModel, OrganizationBase):
-    slug = SlugField(
+    slug = OrganizationSlugField(
         max_length=200,
         blank=False,
         editable=True,