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.
39 lines
1.1 KiB
39 lines
1.1 KiB
2 years ago
|
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)
|