Completed
Push — master ( 63b44b...a884de )
by Batiste
10s
created

get_media_url()   A

Complexity

Conditions 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

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