Coverage for cookbook/helper/scope_middleware.py: 69%

48 statements  

« prev     ^ index     » next       coverage.py v7.4.0, created at 2023-12-29 01:02 +0100

1from django.urls import reverse 

2from django_scopes import scope, scopes_disabled 

3from oauth2_provider.contrib.rest_framework import OAuth2Authentication 

4from rest_framework.exceptions import AuthenticationFailed 

5 

6from cookbook.views import views 

7from recipes import settings 

8 

9 

10class ScopeMiddleware: 

11 def __init__(self, get_response): 

12 self.get_response = get_response 

13 

14 def __call__(self, request): 

15 prefix = settings.JS_REVERSE_SCRIPT_PREFIX or '' 

16 

17 # need to disable scopes for writing requests into userpref and enable for loading ? 

18 if request.path.startswith(prefix + '/api/user-preference/'): 

19 with scopes_disabled(): 

20 return self.get_response(request) 

21 

22 if request.user.is_authenticated: 

23 

24 if request.path.startswith(prefix + '/admin/'): 

25 with scopes_disabled(): 

26 return self.get_response(request) 

27 

28 if request.path.startswith(prefix + '/signup/') or request.path.startswith(prefix + '/invite/'): 

29 return self.get_response(request) 

30 

31 if request.path.startswith(prefix + '/accounts/'): 

32 return self.get_response(request) 

33 

34 if request.path.startswith(prefix + '/switch-space/'): 

35 return self.get_response(request) 

36 

37 with scopes_disabled(): 

38 if request.user.userspace_set.count() == 0 and not reverse('account_logout') in request.path: 

39 return views.space_overview(request) 

40 

41 # get active user space, if for some reason more than one space is active select first (group permission checks will fail, this is not intended at this point) 

42 user_space = request.user.userspace_set.filter(active=True).first() 

43 

44 if not user_space: 

45 return views.space_overview(request) 

46 

47 if user_space.groups.count() == 0 and not reverse('account_logout') in request.path: 

48 return views.no_groups(request) 

49 

50 request.space = user_space.space 

51 with scope(space=request.space): 

52 return self.get_response(request) 

53 else: 

54 if request.path.startswith(prefix + '/api/'): 

55 try: 

56 if auth := OAuth2Authentication().authenticate(request): 

57 user_space = auth[0].userspace_set.filter(active=True).first() 

58 if user_space: 

59 request.space = user_space.space 

60 with scope(space=request.space): 

61 return self.get_response(request) 

62 except AuthenticationFailed: 

63 pass 

64 

65 with scopes_disabled(): 

66 request.space = None 

67 return self.get_response(request)