diff --git a/django/contrib/flatpages/forms.py b/django/contrib/flatpages/forms.py index 24a6e7b58e..8ffae833e5 100644 --- a/django/contrib/flatpages/forms.py +++ b/django/contrib/flatpages/forms.py @@ -1,6 +1,7 @@ from django import forms -from django.utils.translation import ugettext_lazy as _ +from django.conf import settings from django.contrib.flatpages.models import FlatPage +from django.utils.translation import ugettext, ugettext_lazy as _ class FlatpageForm(forms.ModelForm): url = forms.RegexField(label=_("URL"), max_length=100, regex=r'^[-\w/\.~]+$', @@ -12,6 +13,16 @@ class FlatpageForm(forms.ModelForm): class Meta: model = FlatPage + def clean_url(self): + url = self.cleaned_data['url'] + if not url.startswith('/'): + raise forms.ValidationError(ugettext("URL is missing a leading slash.")) + if (settings.APPEND_SLASH and + 'django.middleware.common.CommonMiddleware' in settings.MIDDLEWARE_CLASSES and + not url.endswith('/')): + raise forms.ValidationError(ugettext("URL is missing a trailing slash.")) + return url + def clean(self): url = self.cleaned_data.get('url', None) sites = self.cleaned_data.get('sites', None) diff --git a/django/contrib/flatpages/tests/forms.py b/django/contrib/flatpages/tests/forms.py index 7f617d52a5..884c40acc8 100644 --- a/django/contrib/flatpages/tests/forms.py +++ b/django/contrib/flatpages/tests/forms.py @@ -2,6 +2,8 @@ from django.conf import settings from django.contrib.flatpages.forms import FlatpageForm from django.contrib.flatpages.models import FlatPage from django.test import TestCase +from django.test.utils import override_settings +from django.utils import translation class FlatpageAdminFormTests(TestCase): def setUp(self): @@ -23,9 +25,29 @@ class FlatpageAdminFormTests(TestCase): self.assertFalse(FlatpageForm(data=dict(url='/a & char/', **self.form_data)).is_valid()) self.assertFalse(FlatpageForm(data=dict(url='/a ? char/', **self.form_data)).is_valid()) + def test_flatpage_requires_leading_slash(self): + form = FlatpageForm(data=dict(url='no_leading_slash/', **self.form_data)) + with translation.override('en'): + self.assertFalse(form.is_valid()) + self.assertEqual(form.errors['url'], ["URL is missing a leading slash."]) + + @override_settings(APPEND_SLASH=True, + MIDDLEWARE_CLASSES=('django.middleware.common.CommonMiddleware',)) + def test_flatpage_requires_trailing_slash_with_append_slash(self): + form = FlatpageForm(data=dict(url='/no_trailing_slash', **self.form_data)) + with translation.override('en'): + self.assertFalse(form.is_valid()) + self.assertEqual(form.errors['url'], ["URL is missing a trailing slash."]) + + @override_settings(APPEND_SLASH=False, + MIDDLEWARE_CLASSES=('django.middleware.common.CommonMiddleware',)) + def test_flatpage_doesnt_requires_trailing_slash_without_append_slash(self): + form = FlatpageForm(data=dict(url='/no_trailing_slash', **self.form_data)) + self.assertTrue(form.is_valid()) + def test_flatpage_admin_form_url_uniqueness_validation(self): "The flatpage admin form correctly enforces url uniqueness among flatpages of the same site" - data = dict(url='/myflatpage1', **self.form_data) + data = dict(url='/myflatpage1/', **self.form_data) FlatpageForm(data=data).save() @@ -35,7 +57,7 @@ class FlatpageAdminFormTests(TestCase): self.assertEqual( f.errors, - {'__all__': [u'Flatpage with url /myflatpage1 already exists for site example.com']}) + {'__all__': [u'Flatpage with url /myflatpage1/ already exists for site example.com']}) def test_flatpage_admin_form_edit(self): """ @@ -44,10 +66,10 @@ class FlatpageAdminFormTests(TestCase): """ existing = FlatPage.objects.create( - url="/myflatpage1", title="Some page", content="The content") + url="/myflatpage1/", title="Some page", content="The content") existing.sites.add(settings.SITE_ID) - data = dict(url='/myflatpage1', **self.form_data) + data = dict(url='/myflatpage1/', **self.form_data) f = FlatpageForm(data=data, instance=existing)