kopia lustrzana https://github.com/wagtail/wagtail
Extract generic RevisionsUnscheduleView and make page's unpublish view extend from it
rodzic
e9e1ad8cf7
commit
ae06030016
|
@ -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>
|
|
@ -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):
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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()
|
||||
|
|
Ładowanie…
Reference in New Issue