diff options
Diffstat (limited to 'home/templatetags/navigation_tags.py')
-rw-r--r-- | home/templatetags/navigation_tags.py | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/home/templatetags/navigation_tags.py b/home/templatetags/navigation_tags.py new file mode 100644 index 0000000..447be3b --- /dev/null +++ b/home/templatetags/navigation_tags.py @@ -0,0 +1,73 @@ +from django import template + +from wagtail.core.models import Page + +register = template.Library() +# https://docs.djangoproject.com/en/1.9/howto/custom-template-tags/ + + +@register.simple_tag(takes_context=True) +def get_site_root(context): + # This returns a core.Page. The main menu needs to have the site.root_page + # defined else will return an object attribute error ('str' object has no + # attribute 'get_children') + return context['request'].site.root_page + + +def has_menu_children(page): + # This is used by the top_menu property + # get_children is a Treebeard API thing + # https://tabo.pe/projects/django-treebeard/docs/4.0.1/api.html + return page.get_children().live().in_menu().exists() + + +def has_children(page): + # Generically allow index pages to list their children + return page.get_children().live().exists() + + +def is_active(page, current_page): + # To give us active state on main navigation + return (current_page.url_path.startswith(page.url_path) if current_page else False) + + +# Retrieves the top menu items - the immediate children of the parent page +# The has_menu_children method is necessary because the Foundation menu requires +# a dropdown class to be applied to a parent +@register.inclusion_tag('home/tags/top_menu.html', takes_context=True) +def top_menu(context, parent, calling_page=None): + menuitems = parent.get_children().live().in_menu() + for menuitem in menuitems: + menuitem.show_dropdown = has_menu_children(menuitem) + # We don't directly check if calling_page is None since the template + # engine can pass an empty string to calling_page + # if the variable passed as calling_page does not exist. + menuitem.active = (calling_page.url_path.startswith(menuitem.url_path) + if calling_page else False) + return { + 'calling_page': calling_page, + 'menuitems': menuitems, + # required by the pageurl tag that we want to use within this template + 'request': context['request'], + } + + +# Retrieves the children of the top menu items for the drop downs +@register.inclusion_tag('home/tags/top_menu_children.html', takes_context=True) +def top_menu_children(context, parent, calling_page=None): + menuitems_children = parent.get_children() + menuitems_children = menuitems_children.live().in_menu() + for menuitem in menuitems_children: + menuitem.has_dropdown = has_menu_children(menuitem) + # We don't directly check if calling_page is None since the template + # engine can pass an empty string to calling_page + # if the variable passed as calling_page does not exist. + menuitem.active = (calling_page.url_path.startswith(menuitem.url_path) + if calling_page else False) + menuitem.children = menuitem.get_children().live().in_menu() + return { + 'parent': parent, + 'menuitems_children': menuitems_children, + # required by the pageurl tag that we want to use within this template + 'request': context['request'], + } |