text: from django import template
  from wagtail.core.models import Page
  register = template.Library()
  
  
  @register.simple_tag(takes_context=True)
  def get_site_root(context):
      return context['request'].site.root_page
  
  
  def has_menu_children(page):
      if page.get_children().filter(live=True, show_in_menus=True):
          return True
      else:
          return False
  
  
  @register.inclusion_tag(
      'utils/tags/navigation/top_menu.html', takes_context=True)
  def top_menu(context, parent, calling_page=None):
      menuitems = parent.get_children().filter(
          live=True,
          show_in_menus=True
      )
      for menuitem in menuitems:
          menuitem.show_dropdown = has_menu_children(menuitem)
      return {
          'calling_page': calling_page,
          'menuitems': menuitems,
          'request': context['request'],
      }
  
  
  # Retrieves the children of the top menu items for the drop downs
  @register.inclusion_tag(
      'utils/tags/navigation/top_menu_children.html', takes_context=True)
  def top_menu_children(context, parent):
      menuitems_children = parent.get_children()
      menuitems_children = menuitems_children.filter(
          live=True,
          show_in_menus=True
      )
      for menuitem in menuitems_children:
          menuitem.show_dropdown = has_menu_children(menuitem)
      return {
          'parent': parent,
          'menuitems_children': menuitems_children,
          # required by the pageurl tag that we want to use within this template
          'request': context['request'],
      }
  
  
  @register.inclusion_tag(
      'utils/tags/navigation/site_menu.html', takes_context=True)
  def site_menu(context, parent, calling_page=None):
      menuitems = parent.get_children().filter(
          live=True,
          show_in_menus=True
      )
      for menuitem in menuitems:
          menuitem.show_dropdown = has_menu_children(menuitem)
      return {
          'calling_page': calling_page,
          'menuitems': menuitems,
          'request': context['request'],
      }
  
  
  @register.inclusion_tag(
      'utils/tags/navigation/site_menu_children.html', takes_context=True)
  def site_menu_children(context, parent):
      menuitems_children = parent.get_children()
      menuitems_children = menuitems_children.filter(
          live=True,
          show_in_menus=True
      )
      for menuitem in menuitems_children:
          menuitem.show_dropdown = has_menu_children(menuitem)
      return {
          'parent': parent,
          'menuitems_children': menuitems_children,
          # required by the pageurl tag that we want to use within this template
          'request': context['request'],
      }
  
  
  @register.inclusion_tag(
      'utils/tags/navigation/secondary_menu.html', takes_context=True)
  def secondary_menu(context, calling_page=None):
      pages = []
      if calling_page:
          pages = calling_page.get_children().filter(
              live=True,
              show_in_menus=True
          )
  
          # If no children, get siblings instead
          if len(pages) == 0:
              pages = calling_page.get_siblings().filter(
                  live=True,
                  show_in_menus=True
              )
      return {
          'pages': pages,
          # required by the pageurl tag that we want to use within this template
          'request': context['request'],
      }
  
  
  @register.inclusion_tag(
      'utils/tags/navigation/secondary_menu_grid.html', takes_context=True)
  def secondary_menu_grid(context, calling_page=None):
      pages = []
      if calling_page:
          pages = calling_page.get_children().filter(
              live=True,
              show_in_menus=False
          )
  
          # If no children, get siblings instead
          if len(pages) == 0:
              pages = calling_page.get_siblings().filter(
                  live=True,
                  show_in_menus=True
              )
      return {
          'pages': pages,
          # required by the pageurl tag that we want to use within this template
          'request': context['request'],
      }
  
  
  @register.inclusion_tag(
      'utils/tags/navigation/breadcrumbs.html', takes_context=True)
  def breadcrumbs(context):
      self = context.get('self')
      if self is None or self.depth <= 2:
          # When on the home page, displaying breadcrumbs is irrelevant.
          ancestors = ()
      else:
          ancestors = Page.objects.ancestor_of(
              self, inclusive=True).filter(depth__gt=2)
      return {
          'ancestors': ancestors,
          'request': context['request'],
      }
  
  
  @register.inclusion_tag(
      'utils/tags/navigation/offcanvas_top_menu.html', takes_context=True)
  def offcanvas_top_menu(context, parent, calling_page=None):
      menuitems = parent.get_children().filter(
          live=True,
          show_in_menus=True
      )
      for menuitem in menuitems:
          menuitem.show_dropdown = has_menu_children(menuitem)
      return {
          'calling_page': calling_page,
          'menuitems': menuitems,
          'request': context['request'],
      }
  
  
  # Retrieves the children of the top menu items for the drop downs
  @register.inclusion_tag(
      'utils/tags/navigation/offcanvas_top_menu_children.html',
      takes_context=True
  )
  def offcanvas_top_menu_children(context, parent):
      menuitems_children = parent.get_children()
      menuitems_children = menuitems_children.filter(
          live=True,
          show_in_menus=True
      )
      for menuitem in menuitems_children:
          menuitem.show_dropdown = has_menu_children(menuitem)
      return {
          'parent': parent,
          'menuitems_children': menuitems_children,
          # required by the pageurl tag that we want to use within this template
          'request': context['request'],
      }
  