Fixed #14678 -- Added validation to catch flatpages with the same URL on the same site. Thanks seler for the report, and joni, graham_king, and j4nu5 for work on the patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@16937 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Carl Meyer 2011-10-07 15:45:52 +00:00
parent 846fc7260a
commit 3f3010014b
4 changed files with 53 additions and 15 deletions

View File

@ -1,19 +1,7 @@
from django import forms
from django.contrib import admin
from django.contrib.flatpages.models import FlatPage
from django.utils.translation import ugettext_lazy as _
class FlatpageForm(forms.ModelForm):
url = forms.RegexField(label=_("URL"), max_length=100, regex=r'^[-\w/\.~]+$',
help_text = _("Example: '/about/contact/'. Make sure to have leading"
" and trailing slashes."),
error_message = _("This value must contain only letters, numbers,"
" dots, underscores, dashes, slashes or tildes."))
class Meta:
model = FlatPage
from django.contrib.flatpages.forms import FlatpageForm
class FlatPageAdmin(admin.ModelAdmin):
form = FlatpageForm

View File

@ -0,0 +1,28 @@
from django import forms
from django.utils.translation import ugettext_lazy as _
from django.contrib.flatpages.models import FlatPage
class FlatpageForm(forms.ModelForm):
url = forms.RegexField(label=_("URL"), max_length=100, regex=r'^[-\w/\.~]+$',
help_text = _("Example: '/about/contact/'. Make sure to have leading"
" and trailing slashes."),
error_message = _("This value must contain only letters, numbers,"
" dots, underscores, dashes, slashes or tildes."))
class Meta:
model = FlatPage
def clean(self):
url = self.cleaned_data.get('url', None)
sites = self.cleaned_data.get('sites', None)
flatpages_with_same_url = FlatPage.objects.filter(url=url)
if flatpages_with_same_url.filter(sites__in=sites).exists():
for site in sites:
if flatpages_with_same_url.filter(sites=site).exists():
raise forms.ValidationError(
_('Flatpage with url %s already exists for site %s'
% (url, site)))
return super(FlatpageForm, self).clean()

View File

@ -1,5 +1,5 @@
from django.conf import settings
from django.contrib.flatpages.admin import FlatpageForm
from django.contrib.flatpages.forms import FlatpageForm
from django.test import TestCase
class FlatpageAdminFormTests(TestCase):
@ -11,7 +11,7 @@ class FlatpageAdminFormTests(TestCase):
}
def test_flatpage_admin_form_url_validation(self):
"The flatpage admin form validates correctly validates urls"
"The flatpage admin form correctly validates urls"
self.assertTrue(FlatpageForm(data=dict(url='/new_flatpage/', **self.form_data)).is_valid())
self.assertTrue(FlatpageForm(data=dict(url='/some.special~chars/', **self.form_data)).is_valid())
self.assertTrue(FlatpageForm(data=dict(url='/some.very_special~chars-here/', **self.form_data)).is_valid())
@ -21,3 +21,17 @@ 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())
self.assertFalse(FlatpageForm(data=dict(url='/a ? char/', **self.form_data)).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)
FlatpageForm(data=data).save()
f = FlatpageForm(data=data)
self.assertFalse(f.is_valid())
self.assertEqual(
f.errors,
{'__all__': [u'Flatpage with url /myflatpage1 already exists for site example.com']})

View File

@ -148,6 +148,14 @@ Via the Python API
.. currentmodule:: django.contrib.flatpages
.. admonition:: Check for duplicate flatpage URLs.
If you add or modify flatpages via your own code, you will likely want to
check for duplicate flatpage URLs within the same site. The flatpage form
used in the admin performs this validation check, and can be imported from
:class:`django.contrib.flatpages.forms.FlatPageForm` and used in your own
views.
Flatpage templates
==================