Преглед на файлове

Add wagtail-headless-preview

Sage Abdullah преди 2 месеца
родител
ревизия
b51a8f99a7
променени са 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.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)

+ 7 - 0
bakerydemo/settings/base.py

@@ -63,6 +63,7 @@ INSTALLED_APPS = [
     "wagtail.contrib.simple_translation",
     "wagtail.contrib.styleguide",
     "wagtail",
+    "wagtail_headless_preview",
     "rest_framework",
     "modelcluster",
     "taggit",
@@ -253,3 +254,9 @@ if "CSP_DEFAULT_SRC" in os.environ:
         CSP_FRAME_SRC = os.environ.get("CSP_FRAME_SRC").split(",")
     if "CSP_REPORT_URI" in os.environ:
         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.1,<5.2
 django-dotenv==1.4.2
 wagtail>=6.4,<6.5
 wagtail-font-awesome-svg>=1,<2
+wagtail-headless-preview>=0.8,<0.9
 django-debug-toolbar>=4.2,<5
 django-extensions==3.2.3
 django-csp==3.7