def get_page_path(self, lang): page = getattr(self.request, 'current_page', None) if not page: return '/%s/' % lang if settings.USE_I18N else '/' page_languages = page.get_published_languages() if lang in page_languages: return page.get_absolute_url(lang, fallback=False) site = get_current_site() if is_valid_site_language(lang, site_id=site.pk): _valid_language = True _hide_untranslated = hide_untranslated(lang, site.pk) else: _valid_language = False _hide_untranslated = False if _hide_untranslated and settings.USE_I18N: return '/%s/' % lang default_language = get_default_language_for_site(site.pk) if not _valid_language and default_language in page_languages: # The request language is not configured for the current site. # Fallback to the default language configured for the current site. return page.get_absolute_url(default_language, fallback=False) if _valid_language: fallbacks = get_fallback_languages(lang, site_id=site.pk) or [] fallbacks = [ _lang for _lang in fallbacks if _lang in page_languages ] else: fallbacks = [] if fallbacks: return page.get_absolute_url(fallbacks[0], fallback=False) return '/%s/' % lang if settings.USE_I18N else '/'
def get_nodes(self, request): from cms.models import Title site = self.renderer.site lang = self.renderer.request_language pages = get_page_queryset( site, draft=self.renderer.draft_mode_active, published=not self.renderer.draft_mode_active, ) if is_valid_site_language(lang, site_id=site.pk): _valid_language = True _hide_untranslated = hide_untranslated(lang, site.pk) else: _valid_language = False _hide_untranslated = False if _valid_language: # The request language has been explicitly configured # for the current site. if _hide_untranslated: fallbacks = [] else: fallbacks = get_fallback_languages(lang, site_id=site.pk) languages = [lang ] + [_lang for _lang in fallbacks if _lang != lang] else: # The request language is not configured for the current site. # Fallback to all configured public languages for the current site. languages = get_public_languages(site.pk) fallbacks = languages pages = (pages.filter(title_set__language__in=languages). select_related('node').order_by('node__path').distinct()) if not self.renderer.draft_mode_active: # we're dealing with public pages. # prefetch the draft versions. pages = pages.select_related('publisher_public__node') pages = get_visible_nodes(request, pages, site) if not pages: return [] try: homepage = [page for page in pages if page.is_home][0] except IndexError: homepage = None titles = Title.objects.filter( language__in=languages, publisher_is_draft=self.renderer.draft_mode_active, ) lookup = Prefetch( 'title_set', to_attr='filtered_translations', queryset=titles, ) prefetch_related_objects(pages, lookup) # Build the blank title instances only once blank_title_cache = { language: EmptyTitle(language=language) for language in languages } if lang not in blank_title_cache: blank_title_cache[lang] = EmptyTitle(language=lang) # Maps a node id to its page id node_id_to_page = {} def _page_to_node(page): # EmptyTitle is used to prevent the cms from trying # to find a translation in the database page.title_cache = blank_title_cache.copy() for trans in page.filtered_translations: page.title_cache[trans.language] = trans menu_node = get_menu_node_for_page( self.renderer, page, language=lang, fallbacks=fallbacks, ) return menu_node menu_nodes = [] for page in pages: node = page.node parent_id = node_id_to_page.get(node.parent_id) if node.parent_id and not parent_id: # If the parent page is not available (unpublished, etc..) # don't bother creating menu nodes for its descendants. continue menu_node = _page_to_node(page) cut_homepage = homepage and not homepage.in_navigation if cut_homepage and parent_id == homepage.pk: # When the homepage is hidden from navigation, # we need to cut all its direct children from it. menu_node.parent_id = None else: menu_node.parent_id = parent_id node_id_to_page[node.pk] = page.pk menu_nodes.append(menu_node) return menu_nodes