Extract generic RevisionsUnscheduleView and make page's unpublish view extend from it

pull/8812/head
Sage Abdullah 2022-08-11 11:37:11 +07:00 zatwierdzone przez Matt Westcott
rodzic e9e1ad8cf7
commit ae06030016
5 zmienionych plików z 119 dodań i 42 usunięć

Wyświetl plik

@ -1,19 +1,19 @@
{% extends "wagtailadmin/base.html" %}
{% load i18n %}
{% block titletag %}{% blocktrans trimmed with title=page.get_admin_display_title %}Unschedule Revision {{ revision.id }} for {{ title }}{% endblocktrans %}{% endblock %}
{% block titletag %}{% blocktrans trimmed with title=object_display_title %}Unschedule Revision {{ revision.id }} for {{ title }}{% endblocktrans %}{% endblock %}
{% block content %}
{% trans "Unschedule" as unschedule_str %}
{% include "wagtailadmin/shared/header.html" with title=unschedule_str subtitle=subtitle icon="doc-empty-inverse" %}
<div class="nice-padding">
<p>{% trans "Are you sure you want to unschedule this revision?" %}</p>
<form action="{% url 'wagtailadmin_pages:revisions_unschedule' page.id revision.id %}" method="POST">
<form action="{{ revisions_unschedule_url }}" method="POST">
{% csrf_token %}
<input type="hidden" name="next" value="{{ next }}">
<ul class="fields">
<li>
<input type="submit" value="{% trans 'Yes, unschedule' %}" class="button">
<a href="{% if next %}{{ next }}{% else %}{% url 'wagtailadmin_pages:history' page.id %}{% endif %}" class="button button-secondary">{% trans "No, don't unschedule" %}</a>
<a href="{{ next_url }}" class="button button-secondary">{% trans "No, don't unschedule" %}</a>
</li>
</ul>
</form>

Wyświetl plik

@ -453,7 +453,7 @@ class TestRevisionsUnschedule(TestCase, WagtailTestUtils):
)
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(
response, "wagtailadmin/pages/revisions/confirm_unschedule.html"
response, "wagtailadmin/shared/revisions/confirm_unschedule.html"
)
def test_unschedule_view_invalid_page_id(self):
@ -567,7 +567,7 @@ class TestRevisionsUnscheduleForUnpublishedPages(TestCase, WagtailTestUtils):
)
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(
response, "wagtailadmin/pages/revisions/confirm_unschedule.html"
response, "wagtailadmin/shared/revisions/confirm_unschedule.html"
)
def test_unschedule_view_post(self):

Wyświetl plik

@ -121,7 +121,7 @@ urlpatterns = [
),
path(
"<int:page_id>/revisions/<int:revision_id>/unschedule/",
revisions.revisions_unschedule,
revisions.RevisionsUnschedule.as_view(),
name="revisions_unschedule",
),
re_path(

Wyświetl plik

@ -978,3 +978,92 @@ class UnpublishView(HookResponseMixin, TemplateView):
context["unpublish_url"] = self.get_unpublish_url()
context["next_url"] = self.get_next_url()
return context
class RevisionsUnscheduleView(TemplateView):
model = None
edit_url_name = None
history_url_name = None
revisions_unschedule_url_name = None
success_message = gettext_lazy('Version {revision_id} of "{object}" unscheduled.')
template_name = "wagtailadmin/shared/revisions/confirm_unschedule.html"
def setup(self, request, pk, revision_id, *args, **kwargs):
super().setup(request, *args, **kwargs)
self.pk = pk
self.revision_id = revision_id
self.object = self.get_object()
self.revision = self.get_revision()
def get_object(self, queryset=None):
if not self.model or not issubclass(self.model, DraftStateMixin):
raise Http404
return get_object_or_404(self.model, pk=unquote(self.pk))
def get_revision(self):
return get_object_or_404(self.object.revisions, id=self.revision_id)
def get_revisions_unschedule_url(self):
return reverse(
self.revisions_unschedule_url_name,
args=(quote(self.object.pk), self.revision.id),
)
def get_object_display_title(self):
return str(self.object)
def get_success_message(self):
if self.success_message is None:
return None
return self.success_message.format(
revision_id=self.revision.id, object=self.get_object_display_title()
)
def get_success_buttons(self):
return [
messages.button(
reverse(self.edit_url_name, args=(quote(self.object.pk),)), _("Edit")
)
]
def get_next_url(self):
if not self.history_url_name:
raise ImproperlyConfigured(
"Subclasses of wagtail.admin.views.generic.models.RevisionsUnscheduleView "
" must provide a history_url_name attribute or a get_next_url method"
)
return reverse(self.history_url_name, args=(quote(self.object.pk),))
def get_page_subtitle(self):
return _('revision {revision_id} of "{object}"').format(
revision_id=self.revision.id, object=self.get_object_display_title()
)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context.update(
{
"object": self.object,
"revision": self.revision,
"subtitle": self.get_page_subtitle(),
"object_display_title": self.get_object_display_title(),
"revisions_unschedule_url": self.get_revisions_unschedule_url(),
"next_url": self.get_next_url(),
}
)
return context
def post(self, request, *args, **kwargs):
self.revision.approved_go_live_at = None
self.revision.save(user=request.user, update_fields=["approved_go_live_at"])
success_message = self.get_success_message()
success_buttons = self.get_success_buttons()
if success_message:
messages.success(
request,
success_message,
buttons=success_buttons,
)
return redirect(self.get_next_url())

Wyświetl plik

@ -3,7 +3,6 @@ from django.core.exceptions import PermissionDenied
from django.shortcuts import get_object_or_404, redirect
from django.template.loader import render_to_string
from django.template.response import TemplateResponse
from django.urls import reverse
from django.utils.decorators import method_decorator
from django.utils.safestring import mark_safe
from django.utils.translation import gettext as _
@ -13,7 +12,10 @@ from wagtail.admin import messages
from wagtail.admin.action_menu import PageActionMenu
from wagtail.admin.auth import user_has_any_page_permission, user_passes_test
from wagtail.admin.ui.side_panels import PageSidePanels
from wagtail.admin.views.generic.models import RevisionsCompareView
from wagtail.admin.views.generic.models import (
RevisionsCompareView,
RevisionsUnscheduleView,
)
from wagtail.admin.views.generic.preview import PreviewRevision
from wagtail.admin.views.pages.utils import get_valid_next_url_from_request
from wagtail.models import Page, UserPagePermissionsProxy
@ -137,43 +139,29 @@ class RevisionsCompare(RevisionsCompareView):
return self.object.get_admin_display_title()
def revisions_unschedule(request, page_id, revision_id):
page = get_object_or_404(Page, id=page_id).specific
class RevisionsUnschedule(RevisionsUnscheduleView):
model = Page
edit_url_name = "wagtailadmin_pages:edit"
history_url_name = "wagtailadmin_pages:history"
revisions_unschedule_url_name = "wagtailadmin_pages:revisions_unschedule"
user_perms = UserPagePermissionsProxy(request.user)
if not user_perms.for_page(page).can_unschedule():
raise PermissionDenied
def setup(self, request, page_id, revision_id, *args, **kwargs):
# Rename path kwargs from pk to page_id
return super().setup(request, page_id, revision_id, *args, **kwargs)
revision = get_object_or_404(page.revisions, id=revision_id)
def get_object(self, queryset=None):
page = get_object_or_404(Page, id=self.pk).specific
next_url = get_valid_next_url_from_request(request)
user_perms = UserPagePermissionsProxy(self.request.user)
if not user_perms.for_page(page).can_unschedule():
raise PermissionDenied
return page
subtitle = _('revision {0} of "{1}"').format(
revision.id, page.get_admin_display_title()
)
if request.method == "POST":
revision.approved_go_live_at = None
revision.save(user=request.user, update_fields=["approved_go_live_at"])
messages.success(
request,
_('Version {0} of "{1}" unscheduled.').format(
revision.id, page.get_admin_display_title()
),
buttons=[
messages.button(
reverse("wagtailadmin_pages:edit", args=(page.id,)), _("Edit")
)
],
)
def get_object_display_title(self):
return self.object.get_admin_display_title()
def get_success_url(self):
next_url = get_valid_next_url_from_request(self.request)
if next_url:
return redirect(next_url)
return redirect("wagtailadmin_pages:history", page.id)
return TemplateResponse(
request,
"wagtailadmin/pages/revisions/confirm_unschedule.html",
{"page": page, "revision": revision, "next": next_url, "subtitle": subtitle},
)
return next_url
return super().get_success_url()