@@ -41,40 +41,64 @@ def paginate_queryset(self, query: ArangoQuery, request: Request) -> List[Dict]:
4141 return list (cur )
4242
4343
44- class WorkspaceChildMixin (NestedViewSetMixin ):
45- def get_queryset ( self ):
46- """
47- Get the queryset for workspace child enpoints.
48-
49- Check that the requeting user has appropriate permissions for the associated workspace.
50- """
51- child_objects = super (). get_queryset ()
52-
53- # prevent warning for schema generation incompatibility
54- if getattr ( self , 'swagger_fake_view' , False ):
55- return child_objects . none ()
56-
57- parent_query_dict = self . get_parents_query_dict ()
58- workspace = get_object_or_404 (
59- Workspace . objects . select_related ( 'owner' ), name = parent_query_dict [ 'workspace__name' ]
60- )
61-
62- # No user or user permission required for public workspaces
63- if workspace . public :
64- return child_objects
65-
66- # Private workspace
67- request_user = self . request . user
68- if not request_user . is_authenticated : # anonymous user
69- raise Http404
44+ def WorkspaceChildMixin (prefix = None ):
45+ class _WorkspaceChildMixin ( NestedViewSetMixin ):
46+ def my_lookup_field ( self ):
47+ field = 'workspace__name'
48+ if prefix is not None :
49+ field = f' { prefix } __ { field } '
50+
51+ return field
52+
53+ def get_parents_query_dict ( self ):
54+ parents_query_dict = super (). get_parents_query_dict ()
55+
56+ print ( parents_query_dict )
57+
58+ # Replace the standard lookup field with one that (possibly) goes
59+ # through the session object's related network or table object.
60+ new_field = self . my_lookup_field ( )
61+ if not new_field in parents_query_dict :
62+ old_field = 'workspace__name'
63+ parents_query_dict [ new_field ] = parents_query_dict . pop ( old_field )
64+
65+ return parents_query_dict
66+
67+ def get_queryset ( self ):
68+ """
69+ Get the queryset for workspace child enpoints.
7070
71- workspace_role = WorkspaceRole . objects . filter (
72- workspace = workspace , user = request_user
73- ). first ()
71+ Check that the requeting user has appropriate permissions for the associated workspace.
72+ """
73+ child_objects = super (). get_queryset ()
7474
75- # If the user is at least a reader or the owner, grant access
76- if workspace_role is not None or workspace .owner == request_user :
77- return child_objects
75+ # prevent warning for schema generation incompatibility
76+ if getattr (self , 'swagger_fake_view' , False ):
77+ return child_objects .none ()
78+
79+ parent_query_dict = self .get_parents_query_dict ()
80+ workspace = get_object_or_404 (
81+ Workspace .objects .select_related ('owner' ), name = parent_query_dict [self .my_lookup_field ()]
82+ )
83+
84+ # No user or user permission required for public workspaces
85+ if workspace .public :
86+ return child_objects
87+
88+ # Private workspace
89+ request_user = self .request .user
90+ if not request_user .is_authenticated : # anonymous user
91+ raise Http404
92+
93+ workspace_role = WorkspaceRole .objects .filter (
94+ workspace = workspace , user = request_user
95+ ).first ()
96+
97+ # If the user is at least a reader or the owner, grant access
98+ if workspace_role is not None or workspace .owner == request_user :
99+ return child_objects
100+
101+ # Read access denied
102+ raise Http404
78103
79- # Read access denied
80- raise Http404
104+ return _WorkspaceChildMixin
0 commit comments