/
wagtailuserbar.py
106 lines (90 loc) · 3.19 KB
/
wagtailuserbar.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
from django import template
from django.template.loader import render_to_string
from django.utils import translation
from wagtail import hooks
from wagtail.admin.userbar import (
AddPageItem,
AdminItem,
ApproveModerationEditPageItem,
EditPageItem,
ExplorePageItem,
RejectModerationEditPageItem,
)
from wagtail.models import PAGE_TEMPLATE_VAR, Page, Revision
from wagtail.users.models import UserProfile
register = template.Library()
def get_page_instance(context):
"""
Given a template context, try and find a Page variable in the common
places. Returns None if a page can not be found.
"""
possible_names = [PAGE_TEMPLATE_VAR, "self"]
for name in possible_names:
if name in context:
page = context[name]
if isinstance(page, Page):
return page
@register.simple_tag(takes_context=True)
def wagtailuserbar(context, position="bottom-right"):
# Find request object
try:
request = context["request"]
except KeyError:
return ""
# Don't render without a user because we can't check their permissions
try:
user = request.user
except AttributeError:
return ""
# Don't render if user doesn't have permission to access the admin area
if not user.has_perm("wagtailadmin.access_admin"):
return ""
# Don't render if page is loaded in page editor's preview panel iframe
if getattr(request, "in_preview_panel", False):
return ""
# Render the userbar using the user's preferred admin language
userprofile = UserProfile.get_for_user(user)
with translation.override(userprofile.get_preferred_language()):
page = get_page_instance(context)
try:
revision_id = request.revision_id
except AttributeError:
revision_id = None
if page and page.id:
if revision_id:
revision = Revision.page_revisions.get(id=revision_id)
items = [
AdminItem(),
ExplorePageItem(revision.content_object),
EditPageItem(revision.content_object),
ApproveModerationEditPageItem(revision),
RejectModerationEditPageItem(revision),
]
else:
# Not a revision
items = [
AdminItem(),
ExplorePageItem(page),
EditPageItem(page),
AddPageItem(page),
]
else:
# Not a page.
items = [AdminItem()]
for fn in hooks.get_hooks("construct_wagtail_userbar"):
fn(request, items)
# 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 render_to_string(
"wagtailadmin/userbar/base.html",
{
"request": request,
"items": rendered_items,
"position": position,
"page": page,
"revision_id": revision_id,
},
)