Commit 5e5c8899 by Tom Christie

Fix repeated breadcrumbs when optional trailing slash is used

parent 02b7196a
...@@ -6,7 +6,7 @@ def get_breadcrumbs(url): ...@@ -6,7 +6,7 @@ def get_breadcrumbs(url):
from rest_framework.views import APIView from rest_framework.views import APIView
def breadcrumbs_recursive(url, breadcrumbs_list, prefix): def breadcrumbs_recursive(url, breadcrumbs_list, prefix, seen):
"""Add tuples of (name, url) to the breadcrumbs list, progressively chomping off parts of the url.""" """Add tuples of (name, url) to the breadcrumbs list, progressively chomping off parts of the url."""
try: try:
...@@ -16,7 +16,11 @@ def get_breadcrumbs(url): ...@@ -16,7 +16,11 @@ def get_breadcrumbs(url):
else: else:
# Check if this is a REST framework view, and if so add it to the breadcrumbs # Check if this is a REST framework view, and if so add it to the breadcrumbs
if isinstance(getattr(view, 'cls_instance', None), APIView): if isinstance(getattr(view, 'cls_instance', None), APIView):
breadcrumbs_list.insert(0, (view.cls_instance.get_name(), prefix + url)) # Don't list the same view twice in a row.
# Probably an optional trailing slash.
if not seen or seen[-1] != view:
breadcrumbs_list.insert(0, (view.cls_instance.get_name(), prefix + url))
seen.append(view)
if url == '': if url == '':
# All done # All done
...@@ -24,11 +28,11 @@ def get_breadcrumbs(url): ...@@ -24,11 +28,11 @@ def get_breadcrumbs(url):
elif url.endswith('/'): elif url.endswith('/'):
# Drop trailing slash off the end and continue to try to resolve more breadcrumbs # Drop trailing slash off the end and continue to try to resolve more breadcrumbs
return breadcrumbs_recursive(url.rstrip('/'), breadcrumbs_list, prefix) return breadcrumbs_recursive(url.rstrip('/'), breadcrumbs_list, prefix, seen)
# Drop trailing non-slash off the end and continue to try to resolve more breadcrumbs # Drop trailing non-slash off the end and continue to try to resolve more breadcrumbs
return breadcrumbs_recursive(url[:url.rfind('/') + 1], breadcrumbs_list, prefix) return breadcrumbs_recursive(url[:url.rfind('/') + 1], breadcrumbs_list, prefix, seen)
prefix = get_script_prefix().rstrip('/') prefix = get_script_prefix().rstrip('/')
url = url[len(prefix):] url = url[len(prefix):]
return breadcrumbs_recursive(url, [], prefix) return breadcrumbs_recursive(url, [], prefix, [])
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment