def breadcrumbs_with_siblings(page: Page, separator='', include_self=False): def get_siblings(page): def is_node(page): return hasattr(page.model, 'children') if not is_node(page): return [] siblings = page.get_siblings().select_related(page.related_model_name) return [ sibling for sibling in siblings if is_node(sibling) ] def get_ancestors_crumbs() -> list: ancestors_query = ( page .get_ancestors(include_self) .select_related(page.related_model_name) .active() ) if not ancestors_query.exists(): return [] catalog, *ancestors = ancestors_query siblings = [ get_siblings(ancestor) for ancestor in ancestors ] return [ (catalog.display_menu_title, catalog.url, []), *[ (crumb.display_menu_title, crumb.url, crumb_links) for crumb, crumb_links in zip(ancestors, siblings) ], ] index = page.get_index() crumbs_list = [ (index.display_menu_title, index.url, []) if index else ('Main', '/', []), *get_ancestors_crumbs(), (page.display_menu_title, '', get_siblings(page)) ] return { 'index_slug': index.url if index else '/', 'crumbs_list': crumbs_list, 'separator': separator, }
def breadcrumbs(page: Page, separator=''): index = page.get_index() crumbs_list = ( (index.display_menu_title, index.url) if index else ('Main', '/'), *page.get_ancestors_fields('display_menu_title', 'url', include_self=False), (page.display_menu_title, '') ) return { 'crumbs_list': crumbs_list, 'separator': separator, }