dynamicweb/cms/middleware/toolbar.py

111 lines
3.5 KiB
Python

"""
Edit Toolbar middleware
"""
from django import forms
from django.core.exceptions import ValidationError
from django.urls import resolve
from django.urls.exceptions import Resolver404
from django.utils.functional import SimpleLazyObject
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()
cms_endpoints = (
'pages-root',
'pages-details-by-slug',
'cms_placeholder_clear_placeholder',
'cms_placeholder_add_plugin',
'cms_placeholder_edit_plugin',
'cms_placeholder_copy_plugins',
'cms_placeholder_move_plugin',
'cms_placeholder_delete_plugin',
'cms_placeholder_render_object_edit',
'cms_placeholder_render_object_preview',
'cms_placeholder_render_object_structure',
'cms_placeholder_edit_field',
)
class ToolbarMiddleware:
"""
Middleware to set up CMS Toolbar.
"""
def __init__(self, get_response):
self.get_response = get_response
super().__init__()
def is_edit_mode(self, request):
try:
match = resolve(request.path_info)
except Resolver404:
return False
return match.url_name == 'cms_placeholder_render_object_edit'
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 cms_endpoints
def process_request(self, request):
"""
If we should show the toolbar for this request, put it on
request.toolbar. Then call the request_hook on the toolbar.
"""
if not self.is_cms_request(request):
return
persist = get_cms_setting('CMS_TOOLBAR_URL__PERSIST')
enable_toolbar = get_cms_setting('CMS_TOOLBAR_URL__ENABLE')
disable_toolbar = get_cms_setting('CMS_TOOLBAR_URL__DISABLE')
field = forms.BooleanField(required=False)
if field.clean(request.GET.get(persist, True)):
if disable_toolbar in request.GET:
request.session['cms_toolbar_disabled'] = True
if enable_toolbar in request.GET or self.is_edit_mode(request):
request.session['cms_toolbar_disabled'] = False
request.toolbar = SimpleLazyObject(lambda: CMSToolbar(request))
def process_response(self, request, response):
if toolbar := get_toolbar_from_request(request):
from django.utils.cache import add_never_cache_headers
if toolbar._cache_disabled:
add_never_cache_headers(response)
return response
def __call__(self, request):
self.process_request(request)
response = self.get_response(request)
return self.process_response(request, response)
async def __acall__(self, request):
self.process_request(request)
response = await self.get_response(request)
return self.process_response(request, response)