Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

from __future__ import unicode_literals 

from django.core.urlresolvers import resolve, get_script_prefix 

from rest_framework.utils.formatting import get_view_name 

 

 

def get_breadcrumbs(url): 

    """ 

    Given a url returns a list of breadcrumbs, which are each a 

    tuple of (name, url). 

    """ 

 

    from rest_framework.views import APIView 

 

    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: 

            (view, unused_args, unused_kwargs) = resolve(url) 

        except Exception: 

            pass 

        else: 

            # Check if this is a REST framework view, 

            # and if so add it to the breadcrumbs 

            cls = getattr(view, 'cls', None) 

            if cls is not None and issubclass(cls, APIView): 

                # Don't list the same view twice in a row. 

                # Probably an optional trailing slash. 

                if not seen or seen[-1] != view: 

                    suffix = getattr(view, 'suffix', None) 

                    name = get_view_name(view.cls, suffix) 

                    breadcrumbs_list.insert(0, (name, prefix + url)) 

                    seen.append(view) 

 

        if url == '': 

            # All done 

            return breadcrumbs_list 

 

        elif url.endswith('/'): 

            # Drop trailing slash off the end and continue to try to 

            # resolve more breadcrumbs 

            url = url.rstrip('/') 

            return breadcrumbs_recursive(url, breadcrumbs_list, prefix, seen) 

 

        # Drop trailing non-slash off the end and continue to try to 

        # resolve more breadcrumbs 

        url = url[:url.rfind('/') + 1] 

        return breadcrumbs_recursive(url, breadcrumbs_list, prefix, seen) 

 

    prefix = get_script_prefix().rstrip('/') 

    url = url[len(prefix):] 

    return breadcrumbs_recursive(url, [], prefix, [])