12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- from django.views.generic import TemplateView
- from wagtail.admin.userbar import (
- AccessibilityItem,
- AddPageItem,
- AdminItem,
- EditPageItem,
- ExplorePageItem,
- apply_userbar_hooks,
- )
- from wagtail.models import Page, Revision
- from wagtail_headless_preview.models import HeadlessMixin
- from wagtail_headless_preview.settings import headless_preview_settings
- class CustomHeadlessMixin(HeadlessMixin):
- def get_client_root_url(self, request):
- """
- Use a dedicated API endpoint for drafts.
- By default, the method uses the root URL of the client site.
- """
- root_url = super().get_client_root_url(request)
- if getattr(request, "is_preview", False):
- return f"{root_url}/api/draft"
- return root_url
- def get_userbar_context(request, object, position):
- # Extracted from wagtail.admin.templatetags.wagtailuserbar.wagtailuserbar
- revision_id = getattr(request, "revision_id", None)
- in_preview_panel = getattr(request, "in_preview_panel", False)
- if in_preview_panel:
- items = []
- else:
- items = [AdminItem()]
- if isinstance(object, Page) and object.pk:
- if revision_id:
- revision = (
- Revision.objects.for_instance(object)
- .filter(id=revision_id)
- .prefetch_related("content_object")
- .first()
- )
- revision_object = revision.content_object if revision else None
- items.append(ExplorePageItem(revision_object))
- items.append(EditPageItem(revision_object))
- else:
- # Not a revision
- items.append(ExplorePageItem(object))
- items.append(EditPageItem(object))
- items.append(AddPageItem(object))
- items.append(AccessibilityItem())
- apply_userbar_hooks(request, items, object)
- # Render the items
- rendered_items = [item.render(request) for item in items]
- # Remove any unrendered items
- rendered_items = [item for item in rendered_items if item]
- # Render the userbar items
- return {
- "request": request,
- "items": rendered_items,
- "position": position,
- "page": object,
- "revision_id": revision_id,
- }
- class UserbarView(TemplateView):
- template_name = "wagtailadmin/userbar/base.html"
- http_method_names = ["get"]
- def dispatch(self, request, *args, **kwargs):
- response = super().dispatch(request, *args, **kwargs)
- client_url = headless_preview_settings.CLIENT_URLS["default"]
- response["Access-Control-Allow-Origin"] = client_url
- return response
- def get_context_data(self, **kwargs):
- context = super().get_context_data(**kwargs)
- context.update(get_userbar_context(self.request, None, None))
- return context
|