ソースを参照

Add support for specifying different preview modes to the "View draft" URL for pages

Robin Varghese 6 ヶ月 前
コミット
576eaf37b2

+ 1 - 0
CHANGELOG.txt

@@ -21,6 +21,7 @@ Changelog
  * Add support for an image `description` field across all images, to better support accessible image descriptions (Chiemezuo Akujobi)
  * Prompt the user about unsaved changes when editing snippets (Sage Abdullah)
  * Implement incremental dashboard design enhancements (Albina Starykova)
+ * Add support for specifying different preview modes to the "View draft" URL for pages (Robin Varghese)
  * Fix: Prevent page type business rules from blocking reordering of pages (Andy Babic, Sage Abdullah)
  * Fix: Improve layout of object permissions table (Sage Abdullah)
  * Fix: Fix typo in aria-label attribute of page explorer navigation link (Sébastien Corbin)

+ 1 - 0
CONTRIBUTORS.md

@@ -839,6 +839,7 @@
 * rahulsamant37
 * Gabriel Getzie
 * Rohit Singh
+* Robin Varghese
 
 ## Translators
 

+ 1 - 0
docs/releases/6.3.md

@@ -42,6 +42,7 @@ This feature was developed by Albina Starykova based on designs by Ben Enright.
  * Fire `copy_for_translation_done` signal when copying translatable models as well as pages (Coen van der Kamp)
  * Add support for an image `description` field across all images, to better support accessible image descriptions (Chiemezuo Akujobi)
  * Prompt the user about unsaved changes when editing snippets (Sage Abdullah)
+ * Add support for specifying different preview modes to the "View draft" URL for pages (Robin Varghese)
 
 ### Bug fixes
 

+ 32 - 1
wagtail/admin/tests/pages/test_view_draft.py

@@ -4,7 +4,7 @@ from django.test import TestCase
 from django.urls import reverse
 
 from wagtail.models import Page
-from wagtail.test.testapp.models import SimplePage, StreamPage
+from wagtail.test.testapp.models import MultiPreviewModesPage, SimplePage, StreamPage
 from wagtail.test.utils import WagtailTestUtils
 
 
@@ -112,3 +112,34 @@ class TestDraftAccess(WagtailTestUtils, TestCase):
         self.assertContains(
             response, reverse("wagtailadmin_pages:edit", args=(self.child_page.id,))
         )
+
+    def test_preview_modes(self):
+        """
+        Test that the preview_modes are respected when viewing a draft.
+        """
+        # Create a page with multiple preview modes
+        page = MultiPreviewModesPage(title="multi preview modes page")
+        self.root_page.add_child(instance=page)
+
+        # Login as admin
+        self.user = self.login()
+
+        # Test using explicit preview mode parameter
+        for mode, label in page.preview_modes:
+            with self.subTest(mode=mode, label=label):
+                response = self.client.get(
+                    reverse("wagtailadmin_pages:view_draft", args=(page.id,)),
+                    {"mode": mode},
+                )
+                # Ensure the correct template is used
+                self.assertEqual(response.status_code, 200)
+                preview_template = page.preview_templates[mode]
+                self.assertTemplateUsed(response, preview_template)
+
+        # Test default preview mode with no parameter
+        response = self.client.get(
+            reverse("wagtailadmin_pages:view_draft", args=(page.id,)),
+        )
+        self.assertEqual(response.status_code, 200)
+        preview_template = page.preview_templates[page.default_preview_mode]
+        self.assertTemplateUsed(response, preview_template)

+ 1 - 1
wagtail/admin/views/pages/preview.py

@@ -14,7 +14,7 @@ def view_draft(request, page_id):
         raise PermissionDenied
 
     try:
-        preview_mode = page.default_preview_mode
+        preview_mode = request.GET.get("mode", page.default_preview_mode)
     except IndexError:
         raise PermissionDenied
 

+ 7 - 3
wagtail/test/testapp/models.py

@@ -195,7 +195,11 @@ class SimplePage(Page):
 
 
 class MultiPreviewModesPage(Page):
-    template = "tests/simple_page.html"
+    preview_templates = {
+        "original": "tests/simple_page.html",
+        "alt#1": "tests/simple_page_alt.html",
+    }
+    template = preview_templates["original"]
 
     @property
     def preview_modes(self):
@@ -206,8 +210,8 @@ class MultiPreviewModesPage(Page):
         return "alt#1"
 
     def get_preview_template(self, request, mode_name):
-        if mode_name == "alt#1":
-            return "tests/simple_page_alt.html"
+        if mode_name in self.preview_templates:
+            return self.preview_templates[mode_name]
         return super().get_preview_template(request, mode_name)