diff options
| author | Tom Christie | 2012-11-07 10:03:51 +0000 |
|---|---|---|
| committer | Tom Christie | 2012-11-07 10:03:51 +0000 |
| commit | 296b737fb6f8bca21272a9c3bcfdfcd5ce6a50fc (patch) | |
| tree | 4cd9b78e2084394f81a79389e106abb3e0927aa6 /rest_framework/utils/breadcrumbs.py | |
| parent | 6d3bb67aa654d5f4c555746655a312000422d474 (diff) | |
| download | django-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.py | 14 |
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, []) |
