diff --git a/CHANGELOG.txt b/CHANGELOG.txt index a140f726f0..5132549588 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -18,6 +18,7 @@ Changelog * Added contextual links to admin notification messages * When copying pages, it is now possible to specify a place to copy to (Timo Rieber) * FieldPanel now accepts an optional 'widget' parameter to override the field's default form widget (Alejandro Giacometti) + * Page URL paths can now be longer than 255 characters * Dropped Django 1.6 support * Dropped Python 2.6 and 3.2 support * Dropped Elasticsearch 0.90.x support diff --git a/docs/releases/1.0.rst b/docs/releases/1.0.rst index 7f8b360fc7..f606ff5715 100644 --- a/docs/releases/1.0.rst +++ b/docs/releases/1.0.rst @@ -59,6 +59,7 @@ Core * The Page model now records the date/time that a page was first published, as the field ``first_published_at`` * Increased the maximum length of a page slug from 50 to 255 characters * Added hooks ``register_rich_text_embed_handler`` and ``register_rich_text_link_handler`` for customising link / embed handling within rich text fields + * Page URL paths can now be longer than 255 characters Admin diff --git a/wagtail/wagtailcore/migrations/0016_change_page_url_path_to_text_field.py b/wagtail/wagtailcore/migrations/0016_change_page_url_path_to_text_field.py new file mode 100644 index 0000000000..d583afd61a --- /dev/null +++ b/wagtail/wagtailcore/migrations/0016_change_page_url_path_to_text_field.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('wagtailcore', '0015_add_more_verbose_names'), + ] + + operations = [ + migrations.AlterField( + model_name='page', + name='url_path', + field=models.TextField(verbose_name='URL path', editable=False, blank=True), + preserve_default=True, + ), + ] diff --git a/wagtail/wagtailcore/models.py b/wagtail/wagtailcore/models.py index fe8bb728a9..479fdef344 100644 --- a/wagtail/wagtailcore/models.py +++ b/wagtail/wagtailcore/models.py @@ -274,7 +274,7 @@ class Page(six.with_metaclass(PageBase, MP_Node, ClusterableModel, index.Indexed content_type = models.ForeignKey('contenttypes.ContentType', verbose_name=_('Content type'), related_name='pages') live = models.BooleanField(verbose_name=_('Live'), default=True, editable=False) has_unpublished_changes = models.BooleanField(verbose_name=_('Has unpublished changes'), default=False, editable=False) - url_path = models.CharField(verbose_name=_('URL path'), max_length=255, blank=True, editable=False) + url_path = models.TextField(verbose_name=_('URL path'), blank=True, editable=False) owner = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('Owner'), null=True, blank=True, editable=False, on_delete=models.SET_NULL, related_name='owned_pages') seo_title = models.CharField(verbose_name=_("Page title"), max_length=255, blank=True, help_text=_("Optional. 'Search Engine Friendly' title. This will appear at the top of the browser window.")) diff --git a/wagtail/wagtailcore/tests/test_page_model.py b/wagtail/wagtailcore/tests/test_page_model.py index 814d460b0e..b1773ab0c4 100644 --- a/wagtail/wagtailcore/tests/test_page_model.py +++ b/wagtail/wagtailcore/tests/test_page_model.py @@ -677,3 +677,30 @@ class TestIssue756(TestCase): # Check that latest_revision_created_at is still set self.assertIsNotNone(Page.objects.get(id=1).latest_revision_created_at) + + +class TestIssue1216(TestCase): + """ + Test that url paths greater than 255 characters are supported + """ + fixtures = ['test.json'] + + def test_url_path_can_exceed_255_characters(self): + event_index = Page.objects.get(url_path='/home/events/') + christmas_event = EventPage.objects.get(url_path='/home/events/christmas/') + + # Change the christmas_event slug first - this way, we test that the process for + # updating child url paths also handles >255 character paths correctly + new_christmas_slug = "christmas-%s-christmas" % ("0123456789" * 20) + christmas_event.slug = new_christmas_slug + christmas_event.save_revision().publish() + + # Change the event index slug and publish it + new_event_index_slug = "events-%s-events" % ("0123456789" * 20) + event_index.slug = new_event_index_slug + event_index.save_revision().publish() + + # Check that the url path updated correctly + new_christmas_event = EventPage.objects.get(id=christmas_event.id) + expected_url_path = "/home/%s/%s/" % (new_event_index_slug, new_christmas_slug) + self.assertEqual(new_christmas_event.url_path, expected_url_path)