headless.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. from django.http import HttpRequest
  2. from django.utils.http import urlencode
  3. from django.views.generic import TemplateView
  4. from wagtail.admin.userbar import (
  5. Userbar,
  6. )
  7. from wagtail_headless_preview.models import HeadlessMixin
  8. from wagtail_headless_preview.settings import headless_preview_settings
  9. class CustomHeadlessMixin(HeadlessMixin):
  10. def get_client_root_url(self, request):
  11. """
  12. Use a dedicated API endpoint for drafts.
  13. By default, the method uses the root URL of the client site.
  14. """
  15. root_url = super().get_client_root_url(request)
  16. if getattr(request, "is_preview", False):
  17. return f"{root_url}/api/draft"
  18. return root_url
  19. def get_preview_url(self, request: HttpRequest, token: str) -> str:
  20. return (
  21. self.get_client_root_url(request)
  22. + "?"
  23. + urlencode(
  24. {
  25. "content_type": self.get_content_type_str(),
  26. "token": token,
  27. "in_preview_panel": getattr(request, "in_preview_panel", False),
  28. }
  29. )
  30. )
  31. class UserbarView(TemplateView):
  32. template_name = Userbar.template_name
  33. http_method_names = ["get"]
  34. def dispatch(self, request, *args, **kwargs):
  35. response = super().dispatch(request, *args, **kwargs)
  36. client_url = headless_preview_settings.CLIENT_URLS["default"]
  37. response["Access-Control-Allow-Origin"] = client_url
  38. return response
  39. def get_context_data(self, **kwargs):
  40. return Userbar(object=None, position="bottom-left").get_context_data(
  41. super().get_context_data(request=self.request, **kwargs)
  42. )