Skip to content

Commit a3719ef

Browse files
committed
Check slug field for uniqueness when creating a new story
Sentry issue number: PYDOTORG-PROD-22
1 parent d666e12 commit a3719ef

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

successstories/forms.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
from django import forms
2+
from django.db.models import Q
3+
from django.utils.text import slugify
24

35
from .models import Story
46
from cms.forms import ContentManageableModelForm
@@ -25,7 +27,8 @@ class Meta:
2527

2628
def clean_name(self):
2729
name = self.cleaned_data.get('name')
28-
story = Story.objects.filter(name=name).exclude(pk=self.instance.pk)
30+
slug = slugify(name)
31+
story = Story.objects.filter(Q(name=name) | Q(slug=slug)).exclude(pk=self.instance.pk)
2932
if name is not None and story.exists():
3033
raise forms.ValidationError('Please use a unique name.')
3134
return name

successstories/tests/test_views.py

+25
Original file line numberDiff line numberDiff line change
@@ -150,3 +150,28 @@ def test_story_multiline_email_subject(self):
150150
self.assertNotIn('Second line', mail.outbox[0].subject)
151151

152152
del mail.outbox[:]
153+
154+
def test_story_duplicate_slug(self):
155+
url = reverse('success_story_create')
156+
157+
post_data = {
158+
'name': 'r87comwwwpythonorg',
159+
'company_name': 'Company Three',
160+
'company_url': 'http://djangopony.com/',
161+
'category': self.category.pk,
162+
'author': 'Kevin Arnold',
163+
'author_email': '[email protected]',
164+
'pull_quote': 'Liver!',
165+
'content': 'Growing up is never easy.\n\nFoo bar baz.\n',
166+
settings.HONEYPOT_FIELD_NAME: settings.HONEYPOT_VALUE,
167+
}
168+
169+
response = self.client.post(url, post_data)
170+
self.assertEqual(response.status_code, 302)
171+
self.assertRedirects(response, url)
172+
173+
post_data = post_data.copy()
174+
post_data['name'] = '///r87.com/?www.python.org/'
175+
response = self.client.post(url, post_data)
176+
self.assertEqual(response.status_code, 200)
177+
self.assertContains(response, 'Please use a unique name.')

0 commit comments

Comments
 (0)