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
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)
|
|
|