Skip to content

Commit

Permalink
Fixed an issue where, in some situations, the wrong page title was re…
Browse files Browse the repository at this point in the history
…turned

Force to reload the title cache if the language was not found,
before it returns the appropriate language.
The issue occured, when a page with multi languages had a TitleExtension.

Resolves: #6308
  • Loading branch information
mekanics committed May 18, 2021
1 parent ede0117 commit e84acb6
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 15 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.rst
Expand Up @@ -23,10 +23,12 @@ Unreleased
* Fixed missing builtin arguments on main ``cms`` management command causing it to crash
* Fixed template label nested translation
* Few changes in docs/contributing/code.rst
* Fixed a bug where the fallback page title whould be returned instead of the one from the current language
* Add support for Django 3.2 LTS version
* removed zh and zh_hans translation (keep zh_CN and zh_TW)
* Cleaned-up unmaintained translations


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

Expand Down
22 changes: 7 additions & 15 deletions cms/models/pagemodel.py
Expand Up @@ -1419,27 +1419,19 @@ def _get_title_cache(self, language, fallback, force_reload):

force_reload = (force_reload or language not in self.title_cache)

if fallback and not self.title_cache.get(language):
# language can be in the cache but might be an EmptyTitle instance
fallback_langs = i18n.get_fallback_languages(language)
for lang in fallback_langs:
if self.title_cache.get(lang):
return lang

if force_reload:
from cms.models.titlemodels import Title

titles = Title.objects.filter(page=self)
for title in titles:
self.title_cache[title.language] = title
if self.title_cache.get(language):
return language
else:
if fallback:
fallback_langs = i18n.get_fallback_languages(language)
for lang in fallback_langs:
if self.title_cache.get(lang):
return lang

if fallback and not self.title_cache.get(language):
fallback_langs = i18n.get_fallback_languages(language)
for lang in fallback_langs:
if self.title_cache.get(lang):
return lang

return language

def get_template(self):
Expand Down
21 changes: 21 additions & 0 deletions cms/tests/test_extensions.py
Expand Up @@ -319,6 +319,27 @@ def test_publish_mutlitable_title_extension(self):
title_extension.delete()
self.assertFalse(MultiTableTitleExtension.objects.filter(pk=title_extension.pk).exists())

def test_fallback_title_extension(self):
page = create_page('Test Fallback Title Extension', "nav_playground.html", "en")
title_en = page.get_title_obj('en')
title_extension_en = MyTitleExtension(extended_object=title_en,
extra_title='title extension EN')
title_extension_en.save()
page.publish('en')

self.assertEqual(page.get_title_obj('en', True).mytitleextension.extra_title,
'title extension EN')

title_de = create_title(title="de page", language="de", page=page)
title_extension_de = MyTitleExtension(extended_object=title_de,
extra_title='title extension DE')
title_extension_de.save()
page.publish('de')

self.assertEqual(page.get_title_obj('de', True).mytitleextension.extra_title,
'title extension DE')


class ExtensionAdminTestCase(CMSTestCase):

def setUp(self):
Expand Down

0 comments on commit e84acb6

Please sign in to comment.