mirror of
https://github.com/Hopiu/wagtail.git
synced 2026-05-04 21:44:44 +00:00
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:
parent
60003da430
commit
098433a724
14 changed files with 94 additions and 78 deletions
|
|
@ -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.")
|
||||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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_
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
]
|
||||
|
|
@ -111,7 +111,7 @@ INSTALLED_APPS = (
|
|||
'wagtail.wagtailsnippets',
|
||||
'wagtail.wagtaildocs',
|
||||
'wagtail.wagtailadmin',
|
||||
'wagtail.api',
|
||||
'wagtail.api.v2',
|
||||
'wagtail.wagtailcore',
|
||||
|
||||
'taggit',
|
||||
|
|
|
|||
|
|
@ -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)),
|
||||
|
|
|
|||
0
wagtail/wagtaildocs/api/__init__.py
Normal file
0
wagtail/wagtaildocs/api/__init__.py
Normal file
0
wagtail/wagtaildocs/api/v2/__init__.py
Normal file
0
wagtail/wagtaildocs/api/v2/__init__.py
Normal file
17
wagtail/wagtaildocs/api/v2/endpoints.py
Normal file
17
wagtail/wagtaildocs/api/v2/endpoints.py
Normal 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()
|
||||
32
wagtail/wagtaildocs/api/v2/serializers.py
Normal file
32
wagtail/wagtaildocs/api/v2/serializers.py
Normal 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',
|
||||
]
|
||||
0
wagtail/wagtailimages/api/__init__.py
Normal file
0
wagtail/wagtailimages/api/__init__.py
Normal file
0
wagtail/wagtailimages/api/v2/__init__.py
Normal file
0
wagtail/wagtailimages/api/v2/__init__.py
Normal file
18
wagtail/wagtailimages/api/v2/endpoints.py
Normal file
18
wagtail/wagtailimages/api/v2/endpoints.py
Normal 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()
|
||||
7
wagtail/wagtailimages/api/v2/serializers.py
Normal file
7
wagtail/wagtailimages/api/v2/serializers.py
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from wagtail.api.v2.serializers import BaseSerializer
|
||||
|
||||
|
||||
class ImageSerializer(BaseSerializer):
|
||||
pass
|
||||
Loading…
Reference in a new issue