Skip to content

Commit 5b99075

Browse files
authored
Merge pull request #235 from sjdines/hotfix/slug_length
Ensure the length of the validated slug does not exceed the maximum field length
2 parents d959f9f + 88032d2 commit 5b99075

File tree

2 files changed

+13
-1
lines changed

2 files changed

+13
-1
lines changed

forms_builder/forms/tests.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,14 @@ def test_field_validate_slug_names(self):
126126
except IntegrityError:
127127
self.fail("Slugs were not auto-unique")
128128

129+
def test_field_validate_slug_length(self):
130+
max_slug_length = 2000
131+
form = Form.objects.create(title="Test")
132+
field = Field(form=form,
133+
label='x' * (max_slug_length + 1), field_type=NAMES[0][0])
134+
field.save()
135+
self.assertLessEqual(len(field.slug), max_slug_length)
136+
129137
def test_field_default_ordering(self):
130138
form = Form.objects.create(title="Test")
131139
form.fields.create(label="second field",

forms_builder/forms/utils.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,16 @@ def unique_slug(manager, slug_field, slug):
2727
Ensure slug is unique for the given manager, appending a digit
2828
if it isn't.
2929
"""
30+
max_length = manager.model._meta.get_field(slug_field).max_length
31+
slug = slug[:max_length]
3032
i = 0
3133
while True:
3234
if i > 0:
3335
if i > 1:
3436
slug = slug.rsplit("-", 1)[0]
35-
slug = "%s-%s" % (slug, i)
37+
# We need to keep the slug length under the slug fields max length. We need to
38+
# account for the length that is added by adding a random integer and `-`.
39+
slug = "%s-%s" % (slug[:max_length - len(str(i)) - 1], i)
3640
if not manager.filter(**{slug_field: slug}):
3741
break
3842
i += 1

0 commit comments

Comments
 (0)