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