|
@@ -1,7 +1,10 @@
|
|
|
+from django.contrib.contenttypes.models import ContentType
|
|
|
+from rest_framework.response import Response
|
|
|
from wagtail.api.v2.router import WagtailAPIRouter
|
|
|
from wagtail.api.v2.views import PagesAPIViewSet
|
|
|
from wagtail.documents.api.v2.views import DocumentsAPIViewSet
|
|
|
from wagtail.images.api.v2.views import ImagesAPIViewSet
|
|
|
+from wagtail_headless_preview.models import PagePreview
|
|
|
|
|
|
# Create the router. "wagtailapi" is the URL namespace
|
|
|
api_router = WagtailAPIRouter("wagtailapi")
|
|
@@ -13,3 +16,37 @@ api_router = WagtailAPIRouter("wagtailapi")
|
|
|
api_router.register_endpoint("pages", PagesAPIViewSet)
|
|
|
api_router.register_endpoint("images", ImagesAPIViewSet)
|
|
|
api_router.register_endpoint("documents", DocumentsAPIViewSet)
|
|
|
+
|
|
|
+
|
|
|
+class PreviewAPIViewSet(PagesAPIViewSet):
|
|
|
+ known_query_parameters = PagesAPIViewSet.known_query_parameters.union(
|
|
|
+ ["content_type", "token"]
|
|
|
+ )
|
|
|
+
|
|
|
+ def listing_view(self, request):
|
|
|
+ # Delegate to detail_view, specifically so there's no
|
|
|
+ # difference between serialization formats.
|
|
|
+ self.action = "detail_view"
|
|
|
+ return self.detail_view(request, 0)
|
|
|
+
|
|
|
+ def detail_view(self, request, pk):
|
|
|
+ page = self.get_object()
|
|
|
+ serializer = self.get_serializer(page)
|
|
|
+ return Response(serializer.data)
|
|
|
+
|
|
|
+ def get_object(self):
|
|
|
+ app_label, model = self.request.GET["content_type"].split(".")
|
|
|
+ content_type = ContentType.objects.get(app_label=app_label, model=model)
|
|
|
+
|
|
|
+ page_preview = PagePreview.objects.get(
|
|
|
+ content_type=content_type, token=self.request.GET["token"]
|
|
|
+ )
|
|
|
+ page = page_preview.as_page()
|
|
|
+ if not page.pk:
|
|
|
+ # fake primary key to stop API URL routing from complaining
|
|
|
+ page.pk = 0
|
|
|
+
|
|
|
+ return page
|
|
|
+
|
|
|
+
|
|
|
+api_router.register_endpoint("preview", PreviewAPIViewSet)
|