1from django.core.exceptions import PermissionDenied
2from django.shortcuts import get_object_or_404, redirect
3from django.template.response import TemplateResponse
4from django.urls import reverse
5from django.utils.translation import gettext as _
6
7from wagtail.admin import messages
8from wagtail.admin.views.pages.utils import get_valid_next_url_from_request
9from wagtail.core import hooks
10from wagtail.core.models import Page, UserPagePermissionsProxy
11
12
13def unpublish(request, page_id):
14    page = get_object_or_404(Page, id=page_id).specific
15
16    user_perms = UserPagePermissionsProxy(request.user)
17    if not user_perms.for_page(page).can_unpublish():
18        raise PermissionDenied
19
20    next_url = get_valid_next_url_from_request(request)
21
22    if request.method == 'POST':
23        include_descendants = request.POST.get("include_descendants", False)
24
25        for fn in hooks.get_hooks('before_unpublish_page'):
26            result = fn(request, page)
27            if hasattr(result, 'status_code'):
28                return result
29
30        page.unpublish(user=request.user)
31
32        if include_descendants:
33            for live_descendant_page in page.get_descendants().live().defer_streamfields().specific():
34                if user_perms.for_page(live_descendant_page).can_unpublish():
35                    live_descendant_page.unpublish()
36
37        for fn in hooks.get_hooks('after_unpublish_page'):
38            result = fn(request, page)
39            if hasattr(result, 'status_code'):
40                return result
41
42        messages.success(request, _("Page '{0}' unpublished.").format(page.get_admin_display_title()), buttons=[
43            messages.button(reverse('wagtailadmin_pages:edit', args=(page.id,)), _('Edit'))
44        ])
45
46        if next_url:
47            return redirect(next_url)
48        return redirect('wagtailadmin_explore', page.get_parent().id)
49
50    return TemplateResponse(request, 'wagtailadmin/pages/confirm_unpublish.html', {
51        'page': page,
52        'next': next_url,
53        'live_descendant_count': page.get_descendants().live().count(),
54    })
55