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
111from wagtail_headless_preview .models import HeadlessMixin
12+ from wagtail_headless_preview .settings import headless_preview_settings
213
314
415class CustomHeadlessMixin (HeadlessMixin ):
@@ -11,3 +22,67 @@ def get_client_root_url(self, request):
1122 if getattr (request , "is_preview" , False ):
1223 return f"{ root_url } /api/draft"
1324 return root_url
25+
26+
27+ def get_userbar_context (request , object , position ):
28+ # Extracted from wagtail.admin.templatetags.wagtailuserbar.wagtailuserbar
29+
30+ revision_id = getattr (request , "revision_id" , None )
31+ in_preview_panel = getattr (request , "in_preview_panel" , False )
32+
33+ if in_preview_panel :
34+ items = []
35+ else :
36+ items = [AdminItem ()]
37+
38+ if isinstance (object , Page ) and object .pk :
39+ if revision_id :
40+ revision = (
41+ Revision .objects .for_instance (object )
42+ .filter (id = revision_id )
43+ .prefetch_related ("content_object" )
44+ .first ()
45+ )
46+ revision_object = revision .content_object if revision else None
47+ items .append (ExplorePageItem (revision_object ))
48+ items .append (EditPageItem (revision_object ))
49+ else :
50+ # Not a revision
51+ items .append (ExplorePageItem (object ))
52+ items .append (EditPageItem (object ))
53+ items .append (AddPageItem (object ))
54+
55+ items .append (AccessibilityItem ())
56+
57+ apply_userbar_hooks (request , items , object )
58+
59+ # Render the items
60+ rendered_items = [item .render (request ) for item in items ]
61+
62+ # Remove any unrendered items
63+ rendered_items = [item for item in rendered_items if item ]
64+
65+ # Render the userbar items
66+ return {
67+ "request" : request ,
68+ "items" : rendered_items ,
69+ "position" : position ,
70+ "page" : object ,
71+ "revision_id" : revision_id ,
72+ }
73+
74+
75+ class UserbarView (TemplateView ):
76+ template_name = "wagtailadmin/userbar/base.html"
77+ http_method_names = ["get" ]
78+
79+ def dispatch (self , request , * args , ** kwargs ):
80+ response = super ().dispatch (request , * args , ** kwargs )
81+ client_url = headless_preview_settings .CLIENT_URLS ["default" ]
82+ response ["Access-Control-Allow-Origin" ] = client_url
83+ return response
84+
85+ def get_context_data (self , ** kwargs ):
86+ context = super ().get_context_data (** kwargs )
87+ context .update (get_userbar_context (self .request , None , None ))
88+ return context
0 commit comments