from functools import wraps
|
|
|
def permission_required(*permissions, fn=None):
|
def decorator(view):
|
def wrapped_view(self, request, *args, **kwargs):
|
|
if callable(fn):
|
obj = fn(request, *args, **kwargs)
|
else:
|
obj = fn
|
|
missing_permissions = [perm for perm in permissions if not request.user.has_perm(perm, obj)]
|
if any(missing_permissions):
|
# raises a permission denied exception causing a 403 response
|
self.permission_denied(
|
request, message=('Permission denied: {}'.format(', '.join(missing_permissions)))
|
)
|
|
return view(self, request, *args, **kwargs)
|
|
return wrapped_view
|
|
return decorator
|
|
|
def override_report_only_csp(view_func):
|
"""
|
Decorator to switch report-only CSP to regular CSP. For use with core.middleware.HumanSignalCspMiddleware.
|
"""
|
|
@wraps(view_func)
|
def wrapper(*args, **kwargs):
|
response = view_func(*args, **kwargs)
|
setattr(response, '_override_report_only_csp', True)
|
return response
|
|
return wrapper
|