-
-
Notifications
You must be signed in to change notification settings - Fork 3.1k
/
Copy pathtoolbar.py
126 lines (99 loc) · 4.61 KB
/
toolbar.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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
"""
Edit Toolbar middleware
"""
from django import forms
from django.contrib.admin.models import ADDITION, CHANGE, LogEntry
from django.core.exceptions import ValidationError
from django.urls import Resolver404, resolve
from cms.toolbar.toolbar import CMSToolbar
from cms.toolbar.utils import get_toolbar_from_request
from cms.utils.conf import get_cms_setting
from cms.utils.request_ip_resolvers import get_request_ip_resolver
get_request_ip = get_request_ip_resolver()
class ToolbarMiddleware:
"""
Middleware to set up CMS Toolbar.
"""
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if not self.is_cms_request(request):
return self.get_response(request)
edit_on = get_cms_setting('CMS_TOOLBAR_URL__EDIT_ON')
edit_off = get_cms_setting('CMS_TOOLBAR_URL__EDIT_OFF')
disable = get_cms_setting('CMS_TOOLBAR_URL__DISABLE')
anonymous_on = get_cms_setting('TOOLBAR_ANONYMOUS_ON')
edit_enabled = edit_on in request.GET and 'preview' not in request.GET
edit_disabled = edit_off in request.GET or 'preview' in request.GET
if disable in request.GET:
request.session['cms_toolbar_disabled'] = True
if edit_enabled:
# If we actively enter edit mode, we should show the toolbar in any case
request.session['cms_toolbar_disabled'] = False
toolbar_enabled = not request.session.get('cms_toolbar_disabled', False)
can_see_toolbar = request.user.is_staff or (anonymous_on and request.user.is_anonymous)
show_toolbar = (toolbar_enabled and can_see_toolbar)
if edit_enabled and show_toolbar and not request.session.get('cms_edit'):
# User has explicitly enabled mode
# AND can see the toolbar
request.session['cms_edit'] = True
request.session['cms_preview'] = False
if edit_disabled or not show_toolbar and request.session.get('cms_edit'):
# User has explicitly disabled the toolbar
# OR user has explicitly turned off edit mode
# OR user can't see toolbar
request.session['cms_edit'] = False
if 'preview' in request.GET and not request.session.get('cms_preview'):
# User has explicitly requested a preview of the live page.
request.session['cms_preview'] = True
if request.user.is_staff:
try:
request.cms_latest_entry = LogEntry.objects.filter(
user=request.user,
action_flag__in=(ADDITION, CHANGE)
).only('pk').order_by('-pk')[0].pk
except IndexError:
request.cms_latest_entry = -1
request.toolbar = CMSToolbar(request)
response = self.get_response(request)
if not self.is_cms_request(request):
return response
from django.utils.cache import add_never_cache_headers
toolbar = get_toolbar_from_request(request)
if toolbar._cache_disabled:
add_never_cache_headers(response)
if hasattr(request, 'user') and request.user.is_staff and response.status_code != 500:
try:
if hasattr(request, 'cms_latest_entry'):
pk = LogEntry.objects.filter(
user=request.user,
action_flag__in=(ADDITION, CHANGE)
).only('pk').order_by('-pk')[0].pk
if request.cms_latest_entry != pk:
request.session['cms_log_latest'] = pk
# If there were no LogEntries, just don't touch the session.
# Note that in the case of a user logging-in as another user,
# request may have a cms_latest_entry attribute, but there are no
# LogEntries for request.user.
except IndexError:
pass
return response
def is_cms_request(self, request):
toolbar_hide = get_cms_setting('TOOLBAR_HIDE')
internal_ips = get_cms_setting('INTERNAL_IPS')
if internal_ips:
client_ip = get_request_ip(request)
try:
client_ip = forms.GenericIPAddressField().clean(client_ip)
except ValidationError:
return False
else:
if client_ip not in internal_ips:
return False
if not toolbar_hide:
return True
try:
match = resolve(request.path_info)
except Resolver404:
return False
return match.url_name in ('pages-root', 'pages-details-by-slug', 'cms_page_edit_plugin')