forked from ungleich-public/dynamicweb
111 lines
3.5 KiB
Python
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)
|