You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

38 lines
1.1 KiB

from django.http import HttpResponse
try:
from django_scopes import scope
except ImportError:
from contextlib import nullcontext as scope
class UserScopeMiddleware:
"""
if django_scopes is installed, wrap the current view into a scope of user=request.user
override scope_condition to make it conditional
must be after AuthenticationMiddleware
"""
@staticmethod
def scope_condition(request):
return True
def __init__(self, get_response: callable):
self.get_response = get_response
def __call__(self, request):
if self.scope_condition(request):
with scope(user=request.user):
return self.get_response(request)
else:
return self.get_response(request)
class UserScopeOrDropMiddleware(UserScopeMiddleware):
def __call__(self, request):
if self.scope_condition(request):
if request.user.is_authenticated:
with scope(user=request.user):
return self.get_response(request)
return HttpResponse('Unauthorized', status=401)
return self.get_response(request)