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

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

"""Default example views""" 

from django.http import Http404, HttpResponsePermanentRedirect 

from pages import settings 

from pages.models import Page, PageAlias 

from pages.http import auto_render, get_language_from_request 

from pages.http import get_slug_and_relative_path 

from pages.urlconf_registry import get_urlconf 

from django.core.urlresolvers import resolve 

 

def details(request, path=None, lang=None, delegation=True, **kwargs): 

    """This view get the root pages for navigation 

    and the current page to display if there is any. 

 

    All is rendered with the current page's template. 

 

    This view use the auto_render decorator. It means 

    that you can use the only_context extra parameter to get 

    only the local variables of this view without rendering 

    the template. 

 

    >>> from pages.views import details 

    >>> context = details(request, only_context=True) 

 

    This can be usefull if you want to write your own 

    view. You can reuse the following code without having to 

    copy and paste it.""" 

 

    pages_navigation = Page.objects.navigation().order_by("tree_id") 

    current_page = False 

    template_name = settings.PAGE_DEFAULT_TEMPLATE 

 

    if path is None: 

        slug, path, lang = get_slug_and_relative_path(request.path, lang) 

 

    if lang is None: 

        lang = get_language_from_request(request) 

 

    context = { 

        'path': path, 

        'pages_navigation': pages_navigation, 

        'lang': lang, 

    } 

 

    if lang not in [key for (key, value) in settings.PAGE_LANGUAGES]: 

        raise Http404 

 

    is_user_staff = request.user.is_authenticated() and request.user.is_staff 

    if path: 

        current_page = Page.objects.from_path(path, lang, 

            exclude_drafts=(not is_user_staff)) 

    elif pages_navigation: 

        current_page = Page.objects.root()[0] 

 

    # if no pages has been found, we will try to find it via an Alias 

    if not current_page: 

        alias = PageAlias.objects.from_path(request, path, lang) 

        if alias: 

            url = alias.page.get_url_path(lang) 

            return HttpResponsePermanentRedirect(url) 

        raise Http404 

 

    if ((not is_user_staff) and 

            current_page.calculated_status in (Page.DRAFT, Page.EXPIRED)): 

        raise Http404 

 

    if current_page.redirect_to_url: 

        return HttpResponsePermanentRedirect(current_page.redirect_to_url) 

 

    if current_page.redirect_to: 

        return HttpResponsePermanentRedirect( 

            current_page.redirect_to.get_url_path(lang)) 

 

    template_name = current_page.get_template() 

 

    if request.is_ajax(): 

        template_name = "body_%s" % template_name 

 

    if current_page: 

        context['current_page'] = current_page 

 

    if settings.PAGE_EXTRA_CONTEXT: 

        context.update(settings.PAGE_EXTRA_CONTEXT()) 

 

    if delegation and current_page.delegate_to: 

        urlconf = get_urlconf(current_page.delegate_to) 

        result = resolve('/', urlconf) 

        if len(result): 

            view, args, kwargs = result 

            kwargs['current_page'] = current_page 

            kwargs['path'] = path 

            kwargs['lang'] = lang 

            kwargs['pages_navigation'] = pages_navigation 

            return view( 

                request, 

                *args, 

                **kwargs 

            ) 

 

    return template_name, context 

 

details = auto_render(details)