|
@@ -1,4 +1,15 @@
|
|
|
+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):
|
|
@@ -11,3 +22,67 @@ class CustomHeadlessMixin(HeadlessMixin):
|
|
|
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
|