Skip to content

Commit

Permalink
Refactor get_title_cache to be straightforward and populate when only…
Browse files Browse the repository at this point in the history
… partially populated (#6829)
  • Loading branch information
jonathan-s committed Sep 7, 2020
1 parent 026ff1c commit 8091129
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 17 deletions.
36 changes: 19 additions & 17 deletions cms/models/pagemodel.py
Expand Up @@ -902,32 +902,34 @@ def get_redirect(self, language=None, fallback=True, force_reload=False):
return self.get_page_content_obj_attribute("redirect", language, fallback, force_reload)

def _get_title_cache(self, language, fallback, force_reload):
if not language:
language = get_language()

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 EmptyPageContent instance
def get_fallback_language(page, language):
fallback_langs = i18n.get_fallback_languages(language)
for lang in fallback_langs:
if self.title_cache.get(lang):
if page.title_cache.get(lang):
return lang

if not language:
language = get_language()

force_reload = (force_reload or language not in self.title_cache)
if force_reload:
from cms.models import PageContent

titles = PageContent.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 self.title_cache.get(language):
return language


use_fallback = all([
fallback,
not self.title_cache.get(language),
get_fallback_language(self, language)
])
if use_fallback:
# language can be in the cache but might be an EmptyPageContent instance
return get_fallback_language(self, language)
return language

@property
Expand Down
16 changes: 16 additions & 0 deletions cms/tests/test_page.py
Expand Up @@ -922,3 +922,19 @@ def test_move_node(self):
child.move_page(parent.node)
child = child.reload()
self.assertEqual(child.get_absolute_url(language='en'), '/en/parent/child/')


class PageContentTests(CMSTestCase):

def setUp(self):
self.page = create_page("english-page", "nav_playground.html", "en")
self.german_content = create_title("de", "german content", self.page)
self.english_content = self.page.get_title_obj('en')

def test_get_title_obj(self):
"""
Cache partially populated, if no hit it should try to populate it
"""
del self.page.title_cache['de']
german_content = self.page.get_title_obj('de')
self.assertEqual(german_content.pk, self.german_content.pk)

0 comments on commit 8091129

Please sign in to comment.