2
0

api.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. from django.contrib.contenttypes.models import ContentType
  2. from rest_framework.response import Response
  3. from wagtail.api.v2.router import WagtailAPIRouter
  4. from wagtail.api.v2.views import PagesAPIViewSet
  5. from wagtail.documents.api.v2.views import DocumentsAPIViewSet
  6. from wagtail.images.api.v2.views import ImagesAPIViewSet
  7. from wagtail_headless_preview.models import PagePreview
  8. # Create the router. "wagtailapi" is the URL namespace
  9. api_router = WagtailAPIRouter("wagtailapi")
  10. # Add the three endpoints using the "register_endpoint" method.
  11. # The first parameter is the name of the endpoint (eg. pages, images). This
  12. # is used in the URL of the endpoint
  13. # The second parameter is the endpoint class that handles the requests
  14. api_router.register_endpoint("pages", PagesAPIViewSet)
  15. api_router.register_endpoint("images", ImagesAPIViewSet)
  16. api_router.register_endpoint("documents", DocumentsAPIViewSet)
  17. class PreviewAPIViewSet(PagesAPIViewSet):
  18. known_query_parameters = PagesAPIViewSet.known_query_parameters.union(
  19. ["content_type", "token"]
  20. )
  21. def listing_view(self, request):
  22. # Delegate to detail_view, specifically so there's no
  23. # difference between serialization formats.
  24. self.action = "detail_view"
  25. return self.detail_view(request, 0)
  26. def detail_view(self, request, pk):
  27. page = self.get_object()
  28. serializer = self.get_serializer(page)
  29. return Response(serializer.data)
  30. def get_object(self):
  31. app_label, model = self.request.GET["content_type"].split(".")
  32. content_type = ContentType.objects.get(app_label=app_label, model=model)
  33. page_preview = PagePreview.objects.get(
  34. content_type=content_type, token=self.request.GET["token"]
  35. )
  36. page = page_preview.as_page()
  37. if not page.pk:
  38. # fake primary key to stop API URL routing from complaining
  39. page.pk = 0
  40. return page
  41. api_router.register_endpoint("preview", PreviewAPIViewSet)