浏览代码

Add wagtail-headless-preview

Sage Abdullah 2 月之前
父节点
当前提交
3c4805c359
共有 3 个文件被更改,包括 45 次插入0 次删除
  1. 37 0
      bakerydemo/api.py
  2. 7 0
      bakerydemo/settings/base.py
  3. 1 0
      requirements/base.txt

+ 37 - 0
bakerydemo/api.py

@@ -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.router import WagtailAPIRouter
 from wagtail.api.v2.views import PagesAPIViewSet
 from wagtail.api.v2.views import PagesAPIViewSet
 from wagtail.documents.api.v2.views import DocumentsAPIViewSet
 from wagtail.documents.api.v2.views import DocumentsAPIViewSet
 from wagtail.images.api.v2.views import ImagesAPIViewSet
 from wagtail.images.api.v2.views import ImagesAPIViewSet
+from wagtail_headless_preview.models import PagePreview
 
 
 # Create the router. "wagtailapi" is the URL namespace
 # Create the router. "wagtailapi" is the URL namespace
 api_router = WagtailAPIRouter("wagtailapi")
 api_router = WagtailAPIRouter("wagtailapi")
@@ -13,3 +16,37 @@ api_router = WagtailAPIRouter("wagtailapi")
 api_router.register_endpoint("pages", PagesAPIViewSet)
 api_router.register_endpoint("pages", PagesAPIViewSet)
 api_router.register_endpoint("images", ImagesAPIViewSet)
 api_router.register_endpoint("images", ImagesAPIViewSet)
 api_router.register_endpoint("documents", DocumentsAPIViewSet)
 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)

+ 7 - 0
bakerydemo/settings/base.py

@@ -63,6 +63,7 @@ INSTALLED_APPS = [
     "wagtail.contrib.simple_translation",
     "wagtail.contrib.simple_translation",
     "wagtail.contrib.styleguide",
     "wagtail.contrib.styleguide",
     "wagtail",
     "wagtail",
+    "wagtail_headless_preview",
     "rest_framework",
     "rest_framework",
     "modelcluster",
     "modelcluster",
     "taggit",
     "taggit",
@@ -253,3 +254,9 @@ if "CSP_DEFAULT_SRC" in os.environ:
         CSP_FRAME_SRC = os.environ.get("CSP_FRAME_SRC").split(",")
         CSP_FRAME_SRC = os.environ.get("CSP_FRAME_SRC").split(",")
     if "CSP_REPORT_URI" in os.environ:
     if "CSP_REPORT_URI" in os.environ:
         CSP_REPORT_URI = os.environ.get("CSP_REPORT_URI")
         CSP_REPORT_URI = os.environ.get("CSP_REPORT_URI")
+
+WAGTAIL_HEADLESS_PREVIEW = {
+    "CLIENT_URLS": {
+        "default": "http://localhost:3000",
+    },
+}

+ 1 - 0
requirements/base.txt

@@ -2,6 +2,7 @@ Django>=5.2,<5.3
 django-dotenv==1.4.2
 django-dotenv==1.4.2
 wagtail>=7.0,<7.1
 wagtail>=7.0,<7.1
 wagtail-font-awesome-svg>=1,<2
 wagtail-font-awesome-svg>=1,<2
+wagtail-headless-preview>=0.8,<0.9
 django-debug-toolbar>=4.2,<5
 django-debug-toolbar>=4.2,<5
 django-extensions==3.2.3
 django-extensions==3.2.3
 django-csp==3.7
 django-csp==3.7