Skip to content

Commit b66fce3

Browse files
Use 'unkown' as fallback name if the verbose_name exclusively contains unslugifiable chars.
1 parent bb1253d commit b66fce3

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

readthedocs/builds/version_slug.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,10 @@ class VersionSlugField(models.CharField):
4141
Implementation inspired by ``django_extensions.db.fields.AutoSlugField``.
4242
"""
4343

44-
allowed_chars = string.lowercase + string.digits + '-._'
44+
allowed_punctuation = '-._'
45+
allowed_chars = string.lowercase + string.digits + allowed_punctuation
4546
placeholder = '-'
47+
fallback_slug = 'unkown'
4648

4749
def __init__(self, *args, **kwargs):
4850
kwargs.setdefault('db_index', True)
@@ -70,6 +72,18 @@ def slugify(self, content):
7072
slugified += self.placeholder
7173
else:
7274
slugified += char
75+
76+
# Do not start and end in punctuation.
77+
slug_length = len(slugified)
78+
diff = 1
79+
while diff > 0:
80+
for char in self.allowed_punctuation:
81+
slugified = slugified.strip(char)
82+
diff = slug_length - len(slugified)
83+
slug_length = len(slugified)
84+
85+
if not slugified:
86+
return self.fallback_slug
7387
return slugified
7488

7589
def uniquifying_suffix(self, iteration):

readthedocs/rtd_tests/tests/test_version_slug.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,23 @@ def test_uppercase(self):
3535
project=self.pip)
3636
self.assertEqual(version.slug, 'somestring-charclass')
3737

38+
def test_placeholder_as_name(self):
39+
version = Version.objects.create(
40+
verbose_name='-',
41+
project=self.pip)
42+
self.assertEqual(version.slug, 'unkown')
43+
44+
def test_multiple_empty_names(self):
45+
version = Version.objects.create(
46+
verbose_name='-',
47+
project=self.pip)
48+
self.assertEqual(version.slug, 'unkown')
49+
50+
version = Version.objects.create(
51+
verbose_name='-./.-',
52+
project=self.pip)
53+
self.assertEqual(version.slug, 'unkown_a')
54+
3855
def test_uniqueness(self):
3956
version = Version.objects.create(
4057
verbose_name='1!0',

0 commit comments

Comments
 (0)