Skip to content

Commit

Permalink
Merge bf38ccf into c585fa8
Browse files Browse the repository at this point in the history
  • Loading branch information
fp4code committed Jan 22, 2021
2 parents c585fa8 + bf38ccf commit 7226b25
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 4 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.rst
Expand Up @@ -2,12 +2,18 @@
Changelog
=========

fp-6622 (2021-01-19)
====================

* Fixed 66622 bad Title.path in multilingual sites when parent slug is created or modified


Unreleased
==================

* Fixed builds on RTD


3.8.0 (2020-10-28)
==================

Expand Down
5 changes: 3 additions & 2 deletions cms/admin/forms.py
Expand Up @@ -472,8 +472,9 @@ def save(self, commit=True):

if update_count == 0:
api.create_title(language=self._language, page=cms_page, **translation_data)
else:
cms_page._update_title_path_recursive(self._language)
# _update_title_path_recursive should be called if the new page is the parent
# of already created children in multilingual sites.
cms_page._update_title_path_recursive(self._language, slug=self.data['slug'])
cms_page.clear_cache(menu=True)
return cms_page

Expand Down
7 changes: 5 additions & 2 deletions cms/models/pagemodel.py
Expand Up @@ -340,15 +340,18 @@ def _update_title_path(self, language):
title_obj.path = title_obj.get_path_for_base(base)
title_obj.save()

def _update_title_path_recursive(self, language):
def _update_title_path_recursive(self, language, slug=None):
assert self.publisher_is_draft
from cms.models import Title

if self.node.is_leaf() or language not in self.get_languages():
return

pages = self.get_child_pages()
base = self.get_path(language, fallback=True)
if slug:
base = self.get_path_for_slug(slug, language)
else:
base = self.get_path(language, fallback=True)

if base:
new_path = Concat(models.Value(base), models.Value('/'), models.F('slug'))
Expand Down
62 changes: 62 additions & 0 deletions cms/tests/test_titlepath.py
@@ -0,0 +1,62 @@
# -*- coding: utf-8 -*-
from cms.api import create_page, create_title, publish_pages
from cms.test_utils.testcases import (CMSTestCase)


class TitlePathTestCase(CMSTestCase):

def test0001_translated_subpage_title_path(self):
"""
Test the path when parent page is created after child translation
"""

p_1 = create_page('en-1', "nav_playground.html", 'en',
slug = 'en-1', published=True)
p_1_1 = create_page('en-1-1', "nav_playground.html", 'en',
slug = 'en-1-1', parent=p_1, published=True)

create_title('de', 'de-1-1', p_1_1, slug='de-1-1')

# Parent 'de' title created after de-1-1 translation
create_title('de', 'de-1', p_1, slug='de-1')

p_1.publish('de')
p_1_1.publish('de')

response = self.client.get('/de/de-1/')
self.assertEqual(response.status_code, 200)

response = self.client.get('/de/en-1/de-1-1/')
if response.status_code == 200:
print('\n********** Unexpected response 200 for /de/en-1/de-1-1/')
response = self.client.get('/de/de-1/de-1-1/')
self.assertEqual(response.status_code, 200)


def test0002_changed_parent_slug(self):
"""
Test the child path when parent page slug is changed
"""

p_1 = create_page('BadFoo', "nav_playground.html", 'en',
slug = 'badfoo', published=True)
p_1_1 = create_page('Bar', "nav_playground.html", 'en',
slug = 'bar', parent=p_1, published=True)
t_1 = p_1.get_title_obj(language='en', fallback=False)
t_1.title='Foo'
t_1.path='foo'
t_1.save()

p_1.publish('en')
p_1_1.publish('en')

response = self.client.get('/en/foo/')
self.assertEqual(response.status_code, 200)

response = self.client.get('/en/badfoo/bar/')
if response.status_code == 200:
print('\n********** Unexpected response 200 for /en/badfoo/bar/')
response = self.client.get('/en/foo/bar/')
self.assertEqual(response.status_code, 200)


0 comments on commit 7226b25

Please sign in to comment.