diff --git a/wagtail/wagtailcore/models.py b/wagtail/wagtailcore/models.py index 43f09d5b3b..801a35534a 100644 --- a/wagtail/wagtailcore/models.py +++ b/wagtail/wagtailcore/models.py @@ -337,14 +337,17 @@ class Page(six.with_metaclass(PageBase, MP_Node, ClusterableModel, index.Indexed # has been set and so we can safely call get_parent self.set_url_path(self.get_parent()) else: - # see if the slug has changed from the record in the db, in which case we need to - # update url_path of self and all descendants - old_record = Page.objects.get(id=self.id) - if old_record.slug != self.slug: - self.set_url_path(self.get_parent()) - update_descendant_url_paths = True - old_url_path = old_record.url_path - new_url_path = self.url_path + # Check that we are committing the slug to the database + # Basically: If update_fields has been specified, and slug is not included, skip this step + if not ('update_fields' in kwargs and 'slug' not in kwargs['update_fields']): + # see if the slug has changed from the record in the db, in which case we need to + # update url_path of self and all descendants + old_record = Page.objects.get(id=self.id) + if old_record.slug != self.slug: + self.set_url_path(self.get_parent()) + update_descendant_url_paths = True + old_url_path = old_record.url_path + new_url_path = self.url_path result = super(Page, self).save(*args, **kwargs) diff --git a/wagtail/wagtailcore/tests/test_page_model.py b/wagtail/wagtailcore/tests/test_page_model.py index 0b44e2ba04..8e767c730d 100644 --- a/wagtail/wagtailcore/tests/test_page_model.py +++ b/wagtail/wagtailcore/tests/test_page_model.py @@ -600,3 +600,23 @@ class TestSubpageTypeBusinessRules(TestCase): # BusinessSubIndex only allows BusinessIndex as a parent self.assertNotIn(ContentType.objects.get_for_model(SimplePage), BusinessSubIndex.allowed_parent_page_types()) self.assertIn(ContentType.objects.get_for_model(BusinessIndex), BusinessSubIndex.allowed_parent_page_types()) + + +class TestIssue735(TestCase): + """ + Issue 735 reports that URL paths of child pages are not + updated correctly when slugs of parent pages are updated + """ + fixtures = ['test.json'] + + def test_child_urls_updated_on_parent_publish(self): + event_index = Page.objects.get(url_path='/home/events/') + christmas_event = EventPage.objects.get(url_path='/home/events/christmas/') + + # Change the event index slug and publish it + event_index.slug = 'old-events' + event_index.save_revision().publish() + + # Check that the christmas events url path updated correctly + new_christmas_event = EventPage.objects.get(id=christmas_event.id) + self.assertEqual(new_christmas_event.url_path, '/home/old-events/christmas/')