Author: carljm
Date: 2011-10-07 08:45:52 -0700 (Fri, 07 Oct 2011)
New Revision: 16937

Added:
   django/trunk/django/contrib/flatpages/forms.py
Modified:
   django/trunk/django/contrib/flatpages/admin.py
   django/trunk/django/contrib/flatpages/tests/forms.py
   django/trunk/docs/ref/contrib/flatpages.txt
Log:
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.

Modified: django/trunk/django/contrib/flatpages/admin.py
===================================================================
--- django/trunk/django/contrib/flatpages/admin.py      2011-10-07 15:33:55 UTC 
(rev 16936)
+++ django/trunk/django/contrib/flatpages/admin.py      2011-10-07 15:45:52 UTC 
(rev 16937)
@@ -1,20 +1,8 @@
-from django import forms
 from django.contrib import admin
 from django.contrib.flatpages.models import FlatPage
 from django.utils.translation import ugettext_lazy as _
+from django.contrib.flatpages.forms import FlatpageForm
 
-
-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
-
-
 class FlatPageAdmin(admin.ModelAdmin):
     form = FlatpageForm
     fieldsets = (

Copied: django/trunk/django/contrib/flatpages/forms.py (from rev 16935, 
django/trunk/django/contrib/flatpages/admin.py)
===================================================================
--- django/trunk/django/contrib/flatpages/forms.py                              
(rev 0)
+++ django/trunk/django/contrib/flatpages/forms.py      2011-10-07 15:45:52 UTC 
(rev 16937)
@@ -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()

Modified: django/trunk/django/contrib/flatpages/tests/forms.py
===================================================================
--- django/trunk/django/contrib/flatpages/tests/forms.py        2011-10-07 
15:33:55 UTC (rev 16936)
+++ django/trunk/django/contrib/flatpages/tests/forms.py        2011-10-07 
15:45:52 UTC (rev 16937)
@@ -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 @@
         }
 
     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 @@
         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']})

Modified: django/trunk/docs/ref/contrib/flatpages.txt
===================================================================
--- django/trunk/docs/ref/contrib/flatpages.txt 2011-10-07 15:33:55 UTC (rev 
16936)
+++ django/trunk/docs/ref/contrib/flatpages.txt 2011-10-07 15:45:52 UTC (rev 
16937)
@@ -148,6 +148,14 @@
 
 .. 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
 ==================
 

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-updates@googlegroups.com.
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to