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

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

""" 

Utility functions to return a formatted name and description for a given view. 

""" 

from __future__ import unicode_literals 

 

from django.utils.html import escape 

from django.utils.safestring import mark_safe 

from rest_framework.compat import apply_markdown 

import re 

 

 

def _remove_trailing_string(content, trailing): 

    """ 

    Strip trailing component `trailing` from `content` if it exists. 

    Used when generating names from view classes. 

    """ 

    if content.endswith(trailing) and content != trailing: 

        return content[:-len(trailing)] 

    return content 

 

 

def _remove_leading_indent(content): 

    """ 

    Remove leading indent from a block of text. 

    Used when generating descriptions from docstrings. 

    """ 

    whitespace_counts = [len(line) - len(line.lstrip(' ')) 

                         for line in content.splitlines()[1:] if line.lstrip()] 

 

    # unindent the content if needed 

    if whitespace_counts: 

        whitespace_pattern = '^' + (' ' * min(whitespace_counts)) 

        content = re.sub(re.compile(whitespace_pattern, re.MULTILINE), '', content) 

    content = content.strip('\n') 

    return content 

 

 

def _camelcase_to_spaces(content): 

    """ 

    Translate 'CamelCaseNames' to 'Camel Case Names'. 

    Used when generating names from view classes. 

    """ 

    camelcase_boundry = '(((?<=[a-z])[A-Z])|([A-Z](?![A-Z]|$)))' 

    content = re.sub(camelcase_boundry, ' \\1', content).strip() 

    return ' '.join(content.split('_')).title() 

 

 

def get_view_name(cls, suffix=None): 

    """ 

    Return a formatted name for an `APIView` class or `@api_view` function. 

    """ 

    name = cls.__name__ 

    name = _remove_trailing_string(name, 'View') 

    name = _remove_trailing_string(name, 'ViewSet') 

    name = _camelcase_to_spaces(name) 

    if suffix: 

        name += ' ' + suffix 

    return name 

 

 

def get_view_description(cls, html=False): 

    """ 

    Return a description for an `APIView` class or `@api_view` function. 

    """ 

    description = cls.__doc__ or '' 

    description = _remove_leading_indent(description) 

    if html: 

        return markup_description(description) 

    return description 

 

 

def markup_description(description): 

    """ 

    Apply HTML markup to the given description. 

    """ 

    if apply_markdown: 

        description = apply_markdown(description) 

    else: 

        description = escape(description).replace('\n', '<br />') 

    return mark_safe(description)