forked from ungleich-public/dynamicweb
74 lines
2.7 KiB
Python
74 lines
2.7 KiB
Python
from urllib.parse import quote
|
|
|
|
from django.conf import settings
|
|
from django.contrib.auth.views import redirect_to_login
|
|
from django.http import Http404
|
|
from django.urls import resolve
|
|
|
|
from cms.page_rendering import _handle_no_page
|
|
from cms.utils import get_current_site
|
|
from cms.utils.page_permissions import user_can_view_page
|
|
|
|
|
|
def cms_perms(func):
|
|
def inner(request, *args, **kwargs):
|
|
page = request.current_page
|
|
if page:
|
|
if page.login_required and not request.user.is_authenticated:
|
|
return redirect_to_login(quote(request.get_full_path()), settings.LOGIN_URL)
|
|
site = get_current_site(request)
|
|
if not user_can_view_page(request.user, page, site):
|
|
return _handle_no_page(request)
|
|
return func(request, *args, **kwargs)
|
|
inner.__module__ = func.__module__
|
|
inner.__doc__ = func.__doc__
|
|
if hasattr(func, "view_class"):
|
|
inner.view_class = func.view_class
|
|
if hasattr(func, '__name__'):
|
|
inner.__name__ = func.__name__
|
|
elif hasattr(func, '__class__'):
|
|
inner.__name__ = func.__class__.__name__
|
|
|
|
# for django.contrib.admindoc
|
|
if hasattr(func, '__qualname__'):
|
|
inner.__qualname__ = func.__qualname__
|
|
elif hasattr(func, '__class__') and hasattr(func.__class__, '__qualname__'):
|
|
inner.__qualname__ = func.__class__.__qualname__
|
|
|
|
if getattr(func, 'csrf_exempt', False):
|
|
# view has set csrf_exempt flag
|
|
# so pass it down to the decorator.
|
|
inner.csrf_exempt = True
|
|
return inner
|
|
|
|
|
|
def cms_site_filter(site_id):
|
|
def _cms_site_filter(func):
|
|
def inner(request, *args, **kwargs):
|
|
site = get_current_site(request)
|
|
if site.id != site_id:
|
|
match = resolve(request.path)
|
|
raise Http404(dict(path=request.path, tried=match.tried))
|
|
return func(request, *args, **kwargs)
|
|
|
|
inner.__module__ = func.__module__
|
|
inner.__doc__ = func.__doc__
|
|
if hasattr(func, "view_class"):
|
|
inner.view_class = func.view_class
|
|
if hasattr(func, '__name__'):
|
|
inner.__name__ = func.__name__
|
|
elif hasattr(func, '__class__'):
|
|
inner.__name__ = func.__class__.__name__
|
|
|
|
# for django.contrib.admindoc
|
|
if hasattr(func, '__qualname__'):
|
|
inner.__qualname__ = func.__qualname__
|
|
elif hasattr(func, '__class__') and hasattr(func.__class__, '__qualname__'):
|
|
inner.__qualname__ = func.__class__.__qualname__
|
|
|
|
if getattr(func, 'csrf_exempt', False):
|
|
# view has set csrf_exempt flag
|
|
# so pass it down to the decorator.
|
|
inner.csrf_exempt = True
|
|
return inner
|
|
return _cms_site_filter
|