Restructure API v2 module (as per RFC 8) (#2649)

* Moved api/apps.py into api/v2/apps.py

You now must add ``wagtail.api.v2`` instead of ``wagtail.api`` into ``INSTALLED_APPS``

* Restructure API v2 module

Images and documents endpoints are now defined in their respective apps
This commit is contained in:
Karl Hobley 2016-07-06 13:57:09 +01:00 committed by Mikalai Radchuk
parent 60003da430
commit 098433a724
14 changed files with 94 additions and 78 deletions

View file

@ -5,16 +5,16 @@ from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
class WagtailAPIAppConfig(AppConfig):
name = 'wagtail.api'
label = 'wagtailapi'
verbose_name = "Wagtail API"
class WagtailAPIV2AppConfig(AppConfig):
name = 'wagtail.api.v2'
label = 'wagtailapi_v2'
verbose_name = "Wagtail API v2"
def ready(self):
# Install cache purging signal handlers
if getattr(settings, 'WAGTAILAPI_USE_FRONTENDCACHE', False):
if apps.is_installed('wagtail.contrib.wagtailfrontendcache'):
from wagtail.api.v2.signal_handlers import register_signal_handlers as register_signal_handlers_v2
register_signal_handlers_v2()
from wagtail.api.v2.signal_handlers import register_signal_handlers
register_signal_handlers()
else:
raise ImproperlyConfigured("The setting 'WAGTAILAPI_USE_FRONTENDCACHE' is True but 'wagtail.contrib.wagtailfrontendcache' is not in INSTALLED_APPS.")

View file

@ -12,15 +12,12 @@ from rest_framework.response import Response
from rest_framework.viewsets import GenericViewSet
from wagtail.wagtailcore.models import Page
from wagtail.wagtaildocs.models import get_document_model
from wagtail.wagtailimages.models import get_image_model
from .filters import (
FieldsFilter, OrderingFilter, RestrictedChildOfFilter, RestrictedDescendantOfFilter,
SearchFilter)
from .pagination import WagtailPagination
from .serializers import (
BaseSerializer, DocumentSerializer, ImageSerializer, PageSerializer, get_serializer_class)
from .serializers import BaseSerializer, PageSerializer, get_serializer_class
from .utils import BadRequestError, filter_page_type, page_models_from_string
@ -263,23 +260,3 @@ class PagesAPIEndpoint(BaseAPIEndpoint):
def get_object(self):
base = super(PagesAPIEndpoint, self).get_object()
return base.specific
class ImagesAPIEndpoint(BaseAPIEndpoint):
base_serializer_class = ImageSerializer
filter_backends = [FieldsFilter, OrderingFilter, SearchFilter]
extra_body_fields = ['title', 'width', 'height']
extra_meta_fields = ['tags']
default_fields = ['title', 'tags']
name = 'images'
model = get_image_model()
class DocumentsAPIEndpoint(BaseAPIEndpoint):
base_serializer_class = DocumentSerializer
filter_backends = [FieldsFilter, OrderingFilter, SearchFilter]
extra_body_fields = ['title']
extra_meta_fields = ['tags', ]
default_fields = ['title', 'tags']
name = 'documents'
model = get_document_model()

View file

@ -98,20 +98,6 @@ class PageTypeField(Field):
return page.specific_class._meta.app_label + '.' + page.specific_class.__name__
class DocumentDownloadUrlField(Field):
"""
Serializes the "download_url" field for documents.
Example:
"download_url": "http://api.example.com/documents/1/my_document.pdf"
"""
def get_attribute(self, instance):
return instance
def to_representation(self, document):
return get_full_url(self.context['request'], document.url)
class RelatedField(relations.RelatedField):
"""
Serializes related objects (eg, foreign keys).
@ -372,22 +358,6 @@ class PageSerializer(BaseSerializer):
return super(BaseSerializer, self).build_relational_field(field_name, relation_info)
class ImageSerializer(BaseSerializer):
pass
class DocumentSerializer(BaseSerializer):
download_url = DocumentDownloadUrlField(read_only=True)
default_fields = BaseSerializer.default_fields + [
'download_url',
]
meta_fields = BaseSerializer.meta_fields + [
'download_url',
]
def get_serializer_class(model_, fields_, meta_fields=None, base=BaseSerializer):
class Meta:
model = model_

View file

@ -1,15 +0,0 @@
from __future__ import absolute_import, unicode_literals
from django.conf.urls import url
from .endpoints import DocumentsAPIEndpoint, ImagesAPIEndpoint, PagesAPIEndpoint
from .router import WagtailAPIRouter
v2 = WagtailAPIRouter('wagtailapi_v2')
v2.register_endpoint('pages', PagesAPIEndpoint)
v2.register_endpoint('images', ImagesAPIEndpoint)
v2.register_endpoint('documents', DocumentsAPIEndpoint)
urlpatterns = [
url(r'^v2beta/', v2.urls),
]

View file

@ -111,7 +111,7 @@ INSTALLED_APPS = (
'wagtail.wagtailsnippets',
'wagtail.wagtaildocs',
'wagtail.wagtailadmin',
'wagtail.api',
'wagtail.api.v2',
'wagtail.wagtailcore',
'taggit',

View file

@ -2,17 +2,27 @@ from __future__ import absolute_import, unicode_literals
from django.conf.urls import include, url
from wagtail.api.v2 import urls as wagtailapi2_urls
from wagtail.api.v2.endpoints import PagesAPIEndpoint
from wagtail.api.v2.router import WagtailAPIRouter
from wagtail.contrib.wagtailapi import urls as wagtailapi_urls
from wagtail.contrib.wagtailsitemaps.views import sitemap
from wagtail.tests.testapp import urls as testapp_urls
from wagtail.wagtailadmin import urls as wagtailadmin_urls
from wagtail.wagtailcore import urls as wagtail_urls
from wagtail.wagtaildocs import urls as wagtaildocs_urls
from wagtail.wagtaildocs.api.v2.endpoints import DocumentsAPIEndpoint
from wagtail.wagtailimages import urls as wagtailimages_urls
from wagtail.wagtailimages.api.v2.endpoints import ImagesAPIEndpoint
from wagtail.wagtailimages.tests import urls as wagtailimages_test_urls
from wagtail.wagtailsearch import urls as wagtailsearch_urls
api_router = WagtailAPIRouter('wagtailapi_v2')
api_router.register_endpoint('pages', PagesAPIEndpoint)
api_router.register_endpoint('images', ImagesAPIEndpoint)
api_router.register_endpoint('documents', DocumentsAPIEndpoint)
urlpatterns = [
url(r'^admin/', include(wagtailadmin_urls)),
url(r'^search/', include(wagtailsearch_urls)),
@ -21,7 +31,7 @@ urlpatterns = [
url(r'^images/', include(wagtailimages_urls)),
url(r'^api/', include(wagtailapi_urls)),
url(r'^api/', include(wagtailapi2_urls)),
url(r'^api/v2beta/', api_router.urls),
url(r'^sitemap\.xml$', sitemap),
url(r'^testapp/', include(testapp_urls)),

View file

View file

View file

@ -0,0 +1,17 @@
from __future__ import absolute_import, unicode_literals
from wagtail.api.v2.endpoints import BaseAPIEndpoint
from wagtail.api.v2.filters import FieldsFilter, OrderingFilter, SearchFilter
from ...models import get_document_model
from .serializers import DocumentSerializer
class DocumentsAPIEndpoint(BaseAPIEndpoint):
base_serializer_class = DocumentSerializer
filter_backends = [FieldsFilter, OrderingFilter, SearchFilter]
extra_body_fields = ['title']
extra_meta_fields = ['tags', ]
default_fields = ['title', 'tags']
name = 'documents'
model = get_document_model()

View file

@ -0,0 +1,32 @@
from __future__ import absolute_import, unicode_literals
from rest_framework.fields import Field
from wagtail.api.v2.serializers import BaseSerializer
from wagtail.api.v2.utils import get_full_url
class DocumentDownloadUrlField(Field):
"""
Serializes the "download_url" field for documents.
Example:
"download_url": "http://api.example.com/documents/1/my_document.pdf"
"""
def get_attribute(self, instance):
return instance
def to_representation(self, document):
return get_full_url(self.context['request'], document.url)
class DocumentSerializer(BaseSerializer):
download_url = DocumentDownloadUrlField(read_only=True)
default_fields = BaseSerializer.default_fields + [
'download_url',
]
meta_fields = BaseSerializer.meta_fields + [
'download_url',
]

View file

View file

View file

@ -0,0 +1,18 @@
from __future__ import absolute_import, unicode_literals
from wagtail.api.v2.endpoints import BaseAPIEndpoint
from wagtail.api.v2.filters import FieldsFilter, OrderingFilter, SearchFilter
from ...models import get_image_model
from .serializers import ImageSerializer
class ImagesAPIEndpoint(BaseAPIEndpoint):
base_serializer_class = ImageSerializer
filter_backends = [FieldsFilter, OrderingFilter, SearchFilter]
extra_body_fields = ['title', 'width', 'height']
extra_meta_fields = ['tags']
default_fields = ['title', 'tags']
name = 'images'
model = get_image_model()

View file

@ -0,0 +1,7 @@
from __future__ import absolute_import, unicode_literals
from wagtail.api.v2.serializers import BaseSerializer
class ImageSerializer(BaseSerializer):
pass