Move run_hooks helper to a mixin and use it for EditView hooks

pull/6331/head
Matt Westcott 2020-08-07 12:04:51 +01:00 zatwierdzone przez Matt Westcott
rodzic edb87b1cd9
commit 15afbac957
3 zmienionych plików z 34 dodań i 30 usunięć

Wyświetl plik

@ -8,6 +8,7 @@ from django.views.generic.list import BaseListView
from wagtail.admin import messages
from wagtail.admin.auth import permission_denied
from wagtail.core import hooks
class PermissionCheckedMixin:
@ -44,6 +45,23 @@ class PermissionCheckedMixin:
return super().dispatch(request, *args, **kwargs)
class HookResponseMixin:
"""
A mixin for class-based views to support hooks like `before_edit_page`, which are triggered
during execution of some operation and can return a response to halt that operation.
"""
def run_hook(self, hook_name, *args, **kwargs):
"""
Run the named hook, passing args and kwargs to each function registered under that hook name.
If any return an HttpResponse, stop processing and return that response
"""
for fn in hooks.get_hooks(hook_name):
result = fn(*args, **kwargs)
if hasattr(result, 'status_code'):
return result
class IndexView(PermissionCheckedMixin, TemplateResponseMixin, BaseListView):
model = None
header_icon = ''

Wyświetl plik

@ -11,8 +11,8 @@ from django.views.generic.base import ContextMixin, TemplateResponseMixin, View
from wagtail.admin import messages, signals
from wagtail.admin.action_menu import PageActionMenu
from wagtail.admin.views.generic import HookResponseMixin
from wagtail.admin.views.pages.utils import get_valid_next_url_from_request
from wagtail.core import hooks
from wagtail.core.models import Page
@ -42,19 +42,9 @@ def add_subpage(request, parent_page_id):
})
class CreateView(TemplateResponseMixin, ContextMixin, View):
class CreateView(TemplateResponseMixin, ContextMixin, HookResponseMixin, View):
template_name = 'wagtailadmin/pages/create.html'
def run_hook(self, hook_name, *args, **kwargs):
"""
Run the named hook, passing args and kwargs to each function registered under that hook name.
If any return an HttpResponse, stop processing and return that response
"""
for fn in hooks.get_hooks(hook_name):
result = fn(*args, **kwargs)
if hasattr(result, 'status_code'):
return result
def dispatch(self, request, content_type_app_name, content_type_model_name, parent_page_id):
self.parent_page = get_object_or_404(Page, id=parent_page_id).specific
self.parent_page_perms = self.parent_page.permissions_for_user(self.request.user)

Wyświetl plik

@ -13,13 +13,13 @@ from django.views.generic.base import ContextMixin, TemplateResponseMixin, View
from wagtail.admin import messages
from wagtail.admin.action_menu import PageActionMenu
from wagtail.admin.views.generic import HookResponseMixin
from wagtail.admin.views.pages.utils import get_valid_next_url_from_request
from wagtail.core import hooks
from wagtail.core.exceptions import PageClassNotFoundError
from wagtail.core.models import Page, WorkflowState
class EditView(TemplateResponseMixin, ContextMixin, View):
class EditView(TemplateResponseMixin, ContextMixin, HookResponseMixin, View):
template_name = 'wagtailadmin/pages/edit.html'
def add_legacy_moderation_warning(self):
@ -69,10 +69,9 @@ class EditView(TemplateResponseMixin, ContextMixin, View):
self.next_url = get_valid_next_url_from_request(self.request)
for fn in hooks.get_hooks('before_edit_page'):
result = fn(self.request, self.page)
if hasattr(result, 'status_code'):
return result
response = self.run_hook('before_edit_page', self.request, self.page)
if response:
return response
self.edit_handler = self.page_class.get_edit_handler()
self.edit_handler = self.edit_handler.bind_to(instance=self.page, request=self.request)
@ -227,10 +226,9 @@ class EditView(TemplateResponseMixin, ContextMixin, View):
# store submitted go_live_at for messaging below
go_live_at = self.page.go_live_at
for fn in hooks.get_hooks('before_publish_page'):
result = fn(self.request, self.page)
if hasattr(result, 'status_code'):
return result
response = self.run_hook('before_publish_page', self.request, self.page)
if response:
return response
revision.publish(
user=self.request.user,
@ -242,10 +240,9 @@ class EditView(TemplateResponseMixin, ContextMixin, View):
# need the up-to-date URL for the "View Live" button.
self.page = self.page.specific_class.objects.get(pk=self.page.pk)
for fn in hooks.get_hooks('after_publish_page'):
result = fn(self.request, self.page)
if hasattr(result, 'status_code'):
return result
response = self.run_hook('after_publish_page', self.request, self.page)
if response:
return response
# Submit
if is_submitting or is_restarting_workflow:
@ -380,10 +377,9 @@ class EditView(TemplateResponseMixin, ContextMixin, View):
messages.success(self.request, message)
for fn in hooks.get_hooks('after_edit_page'):
result = fn(self.request, self.page)
if hasattr(result, 'status_code'):
return result
response = self.run_hook('after_edit_page', self.request, self.page)
if response:
return response
if is_publishing or is_submitting or is_restarting_workflow or is_performing_workflow_action:
# we're done here - redirect back to the explorer