From 16d5b5c99e44c53e09ef35f876a76698bd17d6a9 Mon Sep 17 00:00:00 2001 From: Karl Hobley Date: Tue, 5 Nov 2019 11:30:43 +0000 Subject: [PATCH] Rename Endpoints to ViewSets For consistency with Django REST Framework --- docs/advanced_topics/api/v2/configuration.rst | 20 +++++++++---------- wagtail/admin/api/endpoints.py | 12 +++++------ wagtail/admin/api/urls.py | 4 ++-- wagtail/api/v2/endpoints.py | 16 +++++++-------- wagtail/documents/api/admin/endpoints.py | 4 ++-- wagtail/documents/api/v2/endpoints.py | 12 +++++------ wagtail/documents/wagtail_hooks.py | 4 ++-- wagtail/images/api/admin/endpoints.py | 8 ++++---- wagtail/images/api/v2/endpoints.py | 12 +++++------ wagtail/images/wagtail_hooks.py | 4 ++-- wagtail/tests/urls.py | 12 +++++------ 11 files changed, 54 insertions(+), 54 deletions(-) diff --git a/docs/advanced_topics/api/v2/configuration.rst b/docs/advanced_topics/api/v2/configuration.rst index e6326b7ac7..74eb07eccb 100644 --- a/docs/advanced_topics/api/v2/configuration.rst +++ b/docs/advanced_topics/api/v2/configuration.rst @@ -45,13 +45,13 @@ can hook into the rest of your project. Wagtail provides three endpoint classes you can use: - - Pages :class:`wagtail.api.v2.endpoints.PagesAPIEndpoint` - - Images :class:`wagtail.images.api.v2.endpoints.ImagesAPIEndpoint` - - Documents :class:`wagtail.documents.api.v2.endpoints.DocumentsAPIEndpoint` + - Pages :class:`wagtail.api.v2.endpoints.PagesAPIViewSet` + - Images :class:`wagtail.images.api.v2.endpoints.ImagesAPIViewSet` + - Documents :class:`wagtail.documents.api.v2.endpoints.DocumentsAPIViewSet` You can subclass any of these endpoint classes to customise their functionality. Additionally, there is a base endpoint class you can use for adding different -content types to the API: :class:`wagtail.api.v2.endpoints.BaseAPIEndpoint` +content types to the API: :class:`wagtail.api.v2.endpoints.BaseAPIViewSet` For this example, we will create an API that includes all three builtin content types in their default configuration: @@ -60,10 +60,10 @@ types in their default configuration: # api.py - from wagtail.api.v2.endpoints import PagesAPIEndpoint + from wagtail.api.v2.endpoints import PagesAPIViewSet from wagtail.api.v2.router import WagtailAPIRouter - from wagtail.images.api.v2.endpoints import ImagesAPIEndpoint - from wagtail.documents.api.v2.endpoints import DocumentsAPIEndpoint + from wagtail.images.api.v2.endpoints import ImagesAPIViewSet + from wagtail.documents.api.v2.endpoints import DocumentsAPIViewSet # Create the router. "wagtailapi" is the URL namespace api_router = WagtailAPIRouter('wagtailapi') @@ -72,9 +72,9 @@ types in their default configuration: # The first parameter is the name of the endpoint (eg. pages, images). This # is used in the URL of the endpoint # The second parameter is the endpoint class that handles the requests - api_router.register_endpoint('pages', PagesAPIEndpoint) - api_router.register_endpoint('images', ImagesAPIEndpoint) - api_router.register_endpoint('documents', DocumentsAPIEndpoint) + api_router.register_endpoint('pages', PagesAPIViewSet) + api_router.register_endpoint('images', ImagesAPIViewSet) + api_router.register_endpoint('documents', DocumentsAPIViewSet) Next, register the URLs so Django can route requests into the API: diff --git a/wagtail/admin/api/endpoints.py b/wagtail/admin/api/endpoints.py index ea278141f0..d6df1f7210 100644 --- a/wagtail/admin/api/endpoints.py +++ b/wagtail/admin/api/endpoints.py @@ -2,7 +2,7 @@ from collections import OrderedDict from rest_framework.authentication import SessionAuthentication -from wagtail.api.v2.endpoints import PagesAPIEndpoint +from wagtail.api.v2.endpoints import PagesAPIViewSet from wagtail.api.v2.filters import ( ChildOfFilter, DescendantOfFilter, FieldsFilter, ForExplorerFilter, OrderingFilter, SearchFilter) @@ -13,7 +13,7 @@ from .filters import HasChildrenFilter from .serializers import AdminPageSerializer -class PagesAdminAPIEndpoint(PagesAPIEndpoint): +class PagesAdminAPIViewSet(PagesAPIViewSet): base_serializer_class = AdminPageSerializer authentication_classes = [SessionAuthentication] @@ -29,7 +29,7 @@ class PagesAdminAPIEndpoint(PagesAPIEndpoint): SearchFilter, ] - meta_fields = PagesAPIEndpoint.meta_fields + [ + meta_fields = PagesAPIViewSet.meta_fields + [ 'latest_revision_created_at', 'status', 'children', @@ -38,11 +38,11 @@ class PagesAdminAPIEndpoint(PagesAPIEndpoint): 'ancestors', ] - body_fields = PagesAPIEndpoint.body_fields + [ + body_fields = PagesAPIViewSet.body_fields + [ 'admin_display_title', ] - listing_default_fields = PagesAPIEndpoint.listing_default_fields + [ + listing_default_fields = PagesAPIViewSet.listing_default_fields + [ 'latest_revision_created_at', 'status', 'children', @@ -52,7 +52,7 @@ class PagesAdminAPIEndpoint(PagesAPIEndpoint): # Allow the parent field to appear on listings detail_only_fields = [] - known_query_parameters = PagesAPIEndpoint.known_query_parameters.union([ + known_query_parameters = PagesAPIViewSet.known_query_parameters.union([ 'for_explorer', 'has_children' ]) diff --git a/wagtail/admin/api/urls.py b/wagtail/admin/api/urls.py index 672608d56f..aefb53f3ef 100644 --- a/wagtail/admin/api/urls.py +++ b/wagtail/admin/api/urls.py @@ -3,10 +3,10 @@ from django.conf.urls import url from wagtail.api.v2.router import WagtailAPIRouter from wagtail.core import hooks -from .endpoints import PagesAdminAPIEndpoint +from .endpoints import PagesAdminAPIViewSet admin_api = WagtailAPIRouter('wagtailadmin_api_v1') -admin_api.register_endpoint('pages', PagesAdminAPIEndpoint) +admin_api.register_endpoint('pages', PagesAdminAPIViewSet) for fn in hooks.get_hooks('construct_admin_api'): fn(admin_api) diff --git a/wagtail/api/v2/endpoints.py b/wagtail/api/v2/endpoints.py index 3f02be47a5..2b552437c1 100644 --- a/wagtail/api/v2/endpoints.py +++ b/wagtail/api/v2/endpoints.py @@ -24,7 +24,7 @@ from .utils import ( parse_fields_parameter) -class BaseAPIEndpoint(GenericViewSet): +class BaseAPIViewSet(GenericViewSet): renderer_classes = [JSONRenderer, BrowsableAPIRenderer] pagination_class = WagtailPagination @@ -269,7 +269,7 @@ class BaseAPIEndpoint(GenericViewSet): # Get a serializer class for the related object child_model = django_field.related_model child_endpoint_class = router.get_model_endpoint(child_model) - child_endpoint_class = child_endpoint_class[1] if child_endpoint_class else BaseAPIEndpoint + child_endpoint_class = child_endpoint_class[1] if child_endpoint_class else BaseAPIViewSet child_serializer_classes[field_name] = child_endpoint_class._get_serializer_class(router, child_model, child_sub_fields, nested=True) else: @@ -362,7 +362,7 @@ class BaseAPIEndpoint(GenericViewSet): return reverse(url_name, args=(pk, )) -class PagesAPIEndpoint(BaseAPIEndpoint): +class PagesAPIViewSet(BaseAPIViewSet): base_serializer_class = PageSerializer filter_backends = [ FieldsFilter, @@ -371,15 +371,15 @@ class PagesAPIEndpoint(BaseAPIEndpoint): OrderingFilter, SearchFilter ] - known_query_parameters = BaseAPIEndpoint.known_query_parameters.union([ + known_query_parameters = BaseAPIViewSet.known_query_parameters.union([ 'type', 'child_of', 'descendant_of', ]) - body_fields = BaseAPIEndpoint.body_fields + [ + body_fields = BaseAPIViewSet.body_fields + [ 'title', ] - meta_fields = BaseAPIEndpoint.meta_fields + [ + meta_fields = BaseAPIViewSet.meta_fields + [ 'html_url', 'slug', 'show_in_menus', @@ -388,13 +388,13 @@ class PagesAPIEndpoint(BaseAPIEndpoint): 'first_published_at', 'parent', ] - listing_default_fields = BaseAPIEndpoint.listing_default_fields + [ + listing_default_fields = BaseAPIViewSet.listing_default_fields + [ 'title', 'html_url', 'slug', 'first_published_at', ] - nested_default_fields = BaseAPIEndpoint.nested_default_fields + [ + nested_default_fields = BaseAPIViewSet.nested_default_fields + [ 'title', ] detail_only_fields = ['parent'] diff --git a/wagtail/documents/api/admin/endpoints.py b/wagtail/documents/api/admin/endpoints.py index aac3bad997..dc1403f5d3 100644 --- a/wagtail/documents/api/admin/endpoints.py +++ b/wagtail/documents/api/admin/endpoints.py @@ -1,5 +1,5 @@ -from ..v2.endpoints import DocumentsAPIEndpoint +from ..v2.endpoints import DocumentsAPIViewSet -class DocumentsAdminAPIEndpoint(DocumentsAPIEndpoint): +class DocumentsAdminAPIViewSet(DocumentsAPIViewSet): pass diff --git a/wagtail/documents/api/v2/endpoints.py b/wagtail/documents/api/v2/endpoints.py index 6b07d37f21..e476a225c7 100644 --- a/wagtail/documents/api/v2/endpoints.py +++ b/wagtail/documents/api/v2/endpoints.py @@ -1,16 +1,16 @@ -from wagtail.api.v2.endpoints import BaseAPIEndpoint +from wagtail.api.v2.endpoints import BaseAPIViewSet from wagtail.api.v2.filters import FieldsFilter, OrderingFilter, SearchFilter from ... import get_document_model from .serializers import DocumentSerializer -class DocumentsAPIEndpoint(BaseAPIEndpoint): +class DocumentsAPIViewSet(BaseAPIViewSet): base_serializer_class = DocumentSerializer filter_backends = [FieldsFilter, OrderingFilter, SearchFilter] - body_fields = BaseAPIEndpoint.body_fields + ['title'] - meta_fields = BaseAPIEndpoint.meta_fields + ['tags', 'download_url'] - listing_default_fields = BaseAPIEndpoint.listing_default_fields + ['title', 'tags', 'download_url'] - nested_default_fields = BaseAPIEndpoint.nested_default_fields + ['title', 'download_url'] + body_fields = BaseAPIViewSet.body_fields + ['title'] + meta_fields = BaseAPIViewSet.meta_fields + ['tags', 'download_url'] + listing_default_fields = BaseAPIViewSet.listing_default_fields + ['title', 'tags', 'download_url'] + nested_default_fields = BaseAPIViewSet.nested_default_fields + ['title', 'download_url'] name = 'documents' model = get_document_model() diff --git a/wagtail/documents/wagtail_hooks.py b/wagtail/documents/wagtail_hooks.py index bc89137b3a..2ac329be10 100644 --- a/wagtail/documents/wagtail_hooks.py +++ b/wagtail/documents/wagtail_hooks.py @@ -17,7 +17,7 @@ from wagtail.core import hooks from wagtail.core.models import BaseViewRestriction from wagtail.core.wagtail_hooks import require_wagtail_login from wagtail.documents import admin_urls, get_document_model -from wagtail.documents.api.admin.endpoints import DocumentsAdminAPIEndpoint +from wagtail.documents.api.admin.endpoints import DocumentsAdminAPIViewSet from wagtail.documents.forms import GroupDocumentPermissionFormSet from wagtail.documents.permissions import permission_policy from wagtail.documents.rich_text import DocumentLinkHandler @@ -34,7 +34,7 @@ def register_admin_urls(): @hooks.register('construct_admin_api') def construct_admin_api(router): - router.register_endpoint('documents', DocumentsAdminAPIEndpoint) + router.register_endpoint('documents', DocumentsAdminAPIViewSet) class DocumentsMenuItem(MenuItem): diff --git a/wagtail/images/api/admin/endpoints.py b/wagtail/images/api/admin/endpoints.py index 53a84a0ead..99c2de905b 100644 --- a/wagtail/images/api/admin/endpoints.py +++ b/wagtail/images/api/admin/endpoints.py @@ -1,15 +1,15 @@ -from ..v2.endpoints import ImagesAPIEndpoint +from ..v2.endpoints import ImagesAPIViewSet from .serializers import AdminImageSerializer -class ImagesAdminAPIEndpoint(ImagesAPIEndpoint): +class ImagesAdminAPIViewSet(ImagesAPIViewSet): base_serializer_class = AdminImageSerializer - body_fields = ImagesAPIEndpoint.body_fields + [ + body_fields = ImagesAPIViewSet.body_fields + [ 'thumbnail', ] - listing_default_fields = ImagesAPIEndpoint.listing_default_fields + [ + listing_default_fields = ImagesAPIViewSet.listing_default_fields + [ 'width', 'height', 'thumbnail', diff --git a/wagtail/images/api/v2/endpoints.py b/wagtail/images/api/v2/endpoints.py index bd8715d8dd..6c62070946 100644 --- a/wagtail/images/api/v2/endpoints.py +++ b/wagtail/images/api/v2/endpoints.py @@ -1,16 +1,16 @@ -from wagtail.api.v2.endpoints import BaseAPIEndpoint +from wagtail.api.v2.endpoints import BaseAPIViewSet from wagtail.api.v2.filters import FieldsFilter, OrderingFilter, SearchFilter from ... import get_image_model from .serializers import ImageSerializer -class ImagesAPIEndpoint(BaseAPIEndpoint): +class ImagesAPIViewSet(BaseAPIViewSet): base_serializer_class = ImageSerializer filter_backends = [FieldsFilter, OrderingFilter, SearchFilter] - body_fields = BaseAPIEndpoint.body_fields + ['title', 'width', 'height'] - meta_fields = BaseAPIEndpoint.meta_fields + ['tags', 'download_url'] - listing_default_fields = BaseAPIEndpoint.listing_default_fields + ['title', 'tags', 'download_url'] - nested_default_fields = BaseAPIEndpoint.nested_default_fields + ['title', 'download_url'] + body_fields = BaseAPIViewSet.body_fields + ['title', 'width', 'height'] + meta_fields = BaseAPIViewSet.meta_fields + ['tags', 'download_url'] + listing_default_fields = BaseAPIViewSet.listing_default_fields + ['title', 'tags', 'download_url'] + nested_default_fields = BaseAPIViewSet.nested_default_fields + ['title', 'download_url'] name = 'images' model = get_image_model() diff --git a/wagtail/images/wagtail_hooks.py b/wagtail/images/wagtail_hooks.py index 4a609a026a..989b84c91f 100644 --- a/wagtail/images/wagtail_hooks.py +++ b/wagtail/images/wagtail_hooks.py @@ -13,7 +13,7 @@ from wagtail.admin.site_summary import SummaryItem from wagtail.admin.staticfiles import versioned_static from wagtail.core import hooks from wagtail.images import admin_urls, get_image_model, image_operations -from wagtail.images.api.admin.endpoints import ImagesAdminAPIEndpoint +from wagtail.images.api.admin.endpoints import ImagesAdminAPIViewSet from wagtail.images.forms import GroupImagePermissionFormSet from wagtail.images.permissions import permission_policy from wagtail.images.rich_text import ImageEmbedHandler @@ -30,7 +30,7 @@ def register_admin_urls(): @hooks.register('construct_admin_api') def construct_admin_api(router): - router.register_endpoint('images', ImagesAdminAPIEndpoint) + router.register_endpoint('images', ImagesAdminAPIViewSet) class ImagesMenuItem(MenuItem): diff --git a/wagtail/tests/urls.py b/wagtail/tests/urls.py index 23c3d45633..a970784313 100644 --- a/wagtail/tests/urls.py +++ b/wagtail/tests/urls.py @@ -2,23 +2,23 @@ from django.conf.urls import include, url from django.http import HttpResponse from wagtail.admin import urls as wagtailadmin_urls -from wagtail.api.v2.endpoints import PagesAPIEndpoint +from wagtail.api.v2.endpoints import PagesAPIViewSet from wagtail.api.v2.router import WagtailAPIRouter from wagtail.contrib.sitemaps import views as sitemaps_views from wagtail.contrib.sitemaps import Sitemap from wagtail.core import urls as wagtail_urls from wagtail.documents import urls as wagtaildocs_urls -from wagtail.documents.api.v2.endpoints import DocumentsAPIEndpoint +from wagtail.documents.api.v2.endpoints import DocumentsAPIViewSet from wagtail.images import urls as wagtailimages_urls -from wagtail.images.api.v2.endpoints import ImagesAPIEndpoint +from wagtail.images.api.v2.endpoints import ImagesAPIViewSet from wagtail.images.tests import urls as wagtailimages_test_urls from wagtail.tests.testapp import urls as testapp_urls from wagtail.tests.testapp.models import EventSitemap api_router = WagtailAPIRouter('wagtailapi_v2') -api_router.register_endpoint('pages', PagesAPIEndpoint) -api_router.register_endpoint('images', ImagesAPIEndpoint) -api_router.register_endpoint('documents', DocumentsAPIEndpoint) +api_router.register_endpoint('pages', PagesAPIViewSet) +api_router.register_endpoint('images', ImagesAPIViewSet) +api_router.register_endpoint('documents', DocumentsAPIViewSet) urlpatterns = [