diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 6b3443d0418..0aa235c02b1 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -23,9 +23,8 @@ 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 -* Add support for Django 3.2 LTS version -* removed zh and zh_hans translation (keep zh_CN and zh_TW) -* Cleaned-up unmaintained translations +* Fixed a bug where the fallback page title whould be returned instead of the one from the current language + 3.8.0 (2020-10-28) ================== diff --git a/cms/models/pagemodel.py b/cms/models/pagemodel.py index 2c9af915e2b..cb224b99a18 100644 --- a/cms/models/pagemodel.py +++ b/cms/models/pagemodel.py @@ -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): diff --git a/cms/tests/test_extensions.py b/cms/tests/test_extensions.py index faac1d5637c..0f010bc9eec 100644 --- a/cms/tests/test_extensions.py +++ b/cms/tests/test_extensions.py @@ -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):