aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework/utils/breadcrumbs.py
diff options
context:
space:
mode:
authorTom Christie2012-11-07 10:03:51 +0000
committerTom Christie2012-11-07 10:03:51 +0000
commit296b737fb6f8bca21272a9c3bcfdfcd5ce6a50fc (patch)
tree4cd9b78e2084394f81a79389e106abb3e0927aa6 /rest_framework/utils/breadcrumbs.py
parent6d3bb67aa654d5f4c555746655a312000422d474 (diff)
downloaddjango-rest-framework-296b737fb6f8bca21272a9c3bcfdfcd5ce6a50fc.tar.bz2
Fix repeated breadcrumbs when optional trailing slash is used
Diffstat (limited to 'rest_framework/utils/breadcrumbs.py')
-rw-r--r--rest_framework/utils/breadcrumbs.py14
1 files changed, 9 insertions, 5 deletions
diff --git a/rest_framework/utils/breadcrumbs.py b/rest_framework/utils/breadcrumbs.py
index 672d32a3..80e39d46 100644
--- a/rest_framework/utils/breadcrumbs.py
+++ b/rest_framework/utils/breadcrumbs.py
@@ -6,7 +6,7 @@ def get_breadcrumbs(url):
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."""
try:
@@ -16,7 +16,11 @@ def get_breadcrumbs(url):
else:
# Check if this is a REST framework view, and if so add it to the breadcrumbs
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 == '':
# All done
@@ -24,11 +28,11 @@ def get_breadcrumbs(url):
elif url.endswith('/'):
# 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
- 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('/')
url = url[len(prefix):]
- return breadcrumbs_recursive(url, [], prefix)
+ return breadcrumbs_recursive(url, [], prefix, [])