2
0

headless.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. from django.views.generic import TemplateView
  2. from wagtail.admin.userbar import (
  3. AccessibilityItem,
  4. AddPageItem,
  5. AdminItem,
  6. EditPageItem,
  7. ExplorePageItem,
  8. apply_userbar_hooks,
  9. )
  10. from wagtail.models import Page, Revision
  11. from wagtail_headless_preview.models import HeadlessMixin
  12. from wagtail_headless_preview.settings import headless_preview_settings
  13. class CustomHeadlessMixin(HeadlessMixin):
  14. def get_client_root_url(self, request):
  15. """
  16. Use a dedicated API endpoint for drafts.
  17. By default, the method uses the root URL of the client site.
  18. """
  19. root_url = super().get_client_root_url(request)
  20. if getattr(request, "is_preview", False):
  21. return f"{root_url}/api/draft"
  22. return root_url
  23. def get_userbar_context(request, object, position):
  24. # Extracted from wagtail.admin.templatetags.wagtailuserbar.wagtailuserbar
  25. revision_id = getattr(request, "revision_id", None)
  26. in_preview_panel = getattr(request, "in_preview_panel", False)
  27. if in_preview_panel:
  28. items = []
  29. else:
  30. items = [AdminItem()]
  31. if isinstance(object, Page) and object.pk:
  32. if revision_id:
  33. revision = (
  34. Revision.objects.for_instance(object)
  35. .filter(id=revision_id)
  36. .prefetch_related("content_object")
  37. .first()
  38. )
  39. revision_object = revision.content_object if revision else None
  40. items.append(ExplorePageItem(revision_object))
  41. items.append(EditPageItem(revision_object))
  42. else:
  43. # Not a revision
  44. items.append(ExplorePageItem(object))
  45. items.append(EditPageItem(object))
  46. items.append(AddPageItem(object))
  47. items.append(AccessibilityItem())
  48. apply_userbar_hooks(request, items, object)
  49. # Render the items
  50. rendered_items = [item.render(request) for item in items]
  51. # Remove any unrendered items
  52. rendered_items = [item for item in rendered_items if item]
  53. # Render the userbar items
  54. return {
  55. "request": request,
  56. "items": rendered_items,
  57. "position": position,
  58. "page": object,
  59. "revision_id": revision_id,
  60. }
  61. class UserbarView(TemplateView):
  62. template_name = "wagtailadmin/userbar/base.html"
  63. http_method_names = ["get"]
  64. def dispatch(self, request, *args, **kwargs):
  65. response = super().dispatch(request, *args, **kwargs)
  66. client_url = headless_preview_settings.CLIENT_URLS["default"]
  67. response["Access-Control-Allow-Origin"] = client_url
  68. return response
  69. def get_context_data(self, **kwargs):
  70. context = super().get_context_data(**kwargs)
  71. context.update(get_userbar_context(self.request, None, None))
  72. return context