Completed
Push — master ( ca28b2...64d3bb )
by Batiste
9s
created

modify_placeholder()   D

Complexity

Conditions 8

Size

Total Lines 39

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 39
rs 4
cc 8
1
# -*- coding: utf-8 -*-
2
"""Pages admin views"""
3
from pages import settings
4
from pages.models import Page, Content
5
from pages.utils import get_placeholders
6
from pages.phttp import get_language_from_request
7
8
from django.shortcuts import get_object_or_404, render
9
from django.http import HttpResponse, Http404, HttpResponseRedirect
10
from django.contrib.admin.views.decorators import staff_member_required
11
from django.views.decorators.csrf import csrf_exempt
12
from django.core.urlresolvers import reverse
13
from django import forms
14
from pages.managers import fake_page
15
16
17
@staff_member_required
18
@csrf_exempt
19
def change_status(request, page_id):
20
    """
21
    Switch the status of a page.
22
    """
23
    perm = request.user.has_perm('pages.change_page')
24
    if perm and request.method == 'POST':
25
        page = Page.objects.get(pk=page_id)
26
        page.status = int(request.POST['status'])
27
        page.invalidate()
28
        page.save()
29
        return HttpResponse(str(page.status))
30
    raise Http404
31
32
33
@staff_member_required
34
def list_pages_ajax(request, invalid_move=False):
35
    """Render pages table for ajax function."""
36
    language = get_language_from_request(request)
37
    pages = Page.objects.root()
38
    context = {
39
        'can_publish': request.user.has_perm('pages.can_publish'),
40
        'invalid_move': invalid_move,
41
        'language': language,
42
        'pages': pages,
43
    }
44
    return render(
45
        request, "admin/pages/page/change_list_table.html",
46
        context)
47
48
49
@staff_member_required
50
@csrf_exempt
51
def modify_content(request, page_id, content_type, language_id):
52
    """Modify the content of a page."""
53
    page = get_object_or_404(Page, pk=page_id)
54
    perm = request.user.has_perm('pages.change_page')
55
    if perm and request.method == 'POST':
56
        content = request.POST.get('content', False)
57
        if not content:
58
            raise Http404
59
        if settings.PAGE_CONTENT_REVISION:
60
            Content.objects.create_content_if_changed(page, language_id,
61
                                                      content_type, content)
62
        else:
63
            Content.objects.set_or_create_content(page, language_id,
64
                                                  content_type, content)
65
        if page:
66
            page.invalidate()
67
            # to update last modification date
68
            page.save()
69
        else:
70
            fake_page.invalidate(content_type)
71
72
        return HttpResponse('ok')
73
    raise Http404
74
75
76
@staff_member_required
77
@csrf_exempt
78
def modify_placeholder(request, page_id):
79
    """Modify the content of a page."""
80
    content_type = request.GET.get('content_type')
81
    language_id = request.GET.get('language_id')
82
    page = get_object_or_404(Page, pk=page_id)
83
    perm = request.user.has_perm('pages.change_page')
84
    if perm and request.method == 'POST':
85
        placeholders = get_placeholders(page.get_template())
86
        for placeholder in placeholders:
87
            if placeholder.name == content_type:
88
                initial = placeholder.get_content(
89
                    page, language_id, lang_fallback=False)
90
                form = forms.Form(request.POST)
91
                form.fields[content_type] = placeholder.get_field(
92
                    page, language_id, initial=initial)
93
                if not form.is_valid():
94
                    return HttpResponse(form.as_p())
95
96
                if placeholder.shared:
97
                    save_page = None
98
                else:
99
                    save_page = page
100
101
                placeholder.save(
102
                    save_page, language_id,
103
                    form.cleaned_data[content_type], True)
104
                if save_page:
105
                    page.invalidate()
106
                    # to update last modification date
107
                    page.save()
108
                else:
109
                    fake_page.invalidate(content_type)
110
111
                return HttpResponse('ok')
112
        raise Http404("Content type not found in placeholders")
113
114
    raise Http404
115
116
117
@staff_member_required
118
def get_last_content(request, page_id):
119
    """Get the latest content for a particular type"""
120
    content_type = request.GET.get('content_type')
121
    language_id = request.GET.get('language_id')
122
    page = get_object_or_404(Page, pk=page_id)
123
    placeholders = get_placeholders(page.get_template())
124
    for placeholder in placeholders:
125
        if placeholder.name == content_type:
126
            if placeholder.shared:
127
                source_page = None
128
            else:
129
                source_page = page
130
            content = Content.objects.get_content(
131
                source_page, language_id, content_type)
132
            return HttpResponse(content)
133
    raise Http404
134
135
136
@staff_member_required
137
@csrf_exempt
138
def delete_content(request, page_id, language_id):
139
    page = get_object_or_404(Page, pk=page_id)
140
    perm = request.user.has_perm('pages.delete_page')
141
    if not perm:
142
        raise Http404
143
144
    for c in Content.objects.filter(page=page, language=language_id):
145
        c.delete()
146
147
    destination = request.POST.get(
148
        'next',
149
        request.META.get(
150
            'HTTP_REFERER',
151
            reverse("admin:pages_page_change", args=[page_id])
152
        )
153
    )
154
    return HttpResponseRedirect(destination)
155
156
157
@staff_member_required
158
def traduction(request, page_id, language_id):
159
    """Traduction helper."""
160
    page = Page.objects.get(pk=page_id)
161
    lang = language_id
162
    placeholders = get_placeholders(page.get_template())
163
    language_error = (
164
        Content.objects.get_content(page, language_id, "title")
165
        is None
166
    )
167
    return render(request, 'pages/traduction_helper.html', {
168
        'page': page,
169
        'lang': lang,
170
        'language_error': language_error,
171
        'placeholders': placeholders,
172
    })
173
174
175
@staff_member_required
176
def get_content(request, page_id, content_id):
177
    """Get the content for a particular page"""
178
    content = Content.objects.get(pk=content_id)
179
    return HttpResponse(content.body)
180
181
182
@staff_member_required
183
@csrf_exempt
184
def move_page(request, page_id, extra_context=None):
185
    """Move the page to the requested target, at the given
186
    position."""
187
    page = Page.objects.get(pk=page_id)
188
189
    target = request.POST.get('target', None)
190
    position = request.POST.get('position', None)
191
    if target is not None and position is not None:
192
        try:
193
            target = Page.objects.get(pk=target)
194
        except Page.DoesNotExist:
195
            pass
196
            # TODO: should use the django message system
197
            # to display this message
198
            # _('Page could not been moved.')
199
        else:
200
            # move_to invalidates cache on a model level
201
            from mptt.exceptions import InvalidMove
202
            invalid_move = False
203
            try:
204
                page.move_to(target, position)
205
            except InvalidMove:
206
                invalid_move = True
207
            return list_pages_ajax(request, invalid_move)
208
    return HttpResponseRedirect('../../')
209
210
211
@staff_member_required
212
def sub_menu(request, page_id):
213
    """Render the children of the requested page with the sub_menu
214
    template."""
215
    page = Page.objects.get(id=page_id)
216
    pages = page.children.all()
217
    page_languages = settings.PAGE_LANGUAGES
218
    return render(request, "admin/pages/page/sub_menu.html", {
219
        'can_publish': request.user.has_perm('pages.can_publish'),
220
        'page': page,
221
        'pages': pages,
222
        'page_languages': page_languages,
223
    })
224