@@ -114,6 +114,21 @@ def get_required_permissions(self, method, model_cls):
114
114
115
115
return [perm % kwargs for perm in self .perms_map [method ]]
116
116
117
+ def _queryset (self , view ):
118
+ assert hasattr (view , 'get_queryset' ) \
119
+ or getattr (view , 'queryset' , None ) is not None , (
120
+ 'Cannot apply {} on a view that does not set '
121
+ '`.queryset` or have a `.get_queryset()` method.'
122
+ ).format (self .__class__ .__name__ )
123
+
124
+ if hasattr (view , 'get_queryset' ):
125
+ queryset = view .get_queryset ()
126
+ assert queryset is not None , (
127
+ '{}.get_queryset() returned None' .format (view .__class__ .__name__ )
128
+ )
129
+ return queryset
130
+ return view .queryset
131
+
117
132
def has_permission (self , request , view ):
118
133
# Workaround to ensure DjangoModelPermissions are not applied
119
134
# to the root view when using DefaultRouter.
@@ -124,19 +139,7 @@ def has_permission(self, request, view):
124
139
not is_authenticated (request .user ) and self .authenticated_users_only ):
125
140
return False
126
141
127
- if hasattr (view , 'get_queryset' ):
128
- queryset = view .get_queryset ()
129
- assert queryset is not None , (
130
- '{}.get_queryset() returned None' .format (view .__class__ .__name__ )
131
- )
132
- else :
133
- queryset = getattr (view , 'queryset' , None )
134
-
135
- assert queryset is not None , (
136
- 'Cannot apply DjangoModelPermissions on a view that '
137
- 'does not set `.queryset` or have a `.get_queryset()` method.'
138
- )
139
-
142
+ queryset = self ._queryset (view )
140
143
perms = self .get_required_permissions (request .method , queryset .model )
141
144
142
145
return request .user .has_perms (perms )
@@ -183,16 +186,8 @@ def get_required_object_permissions(self, method, model_cls):
183
186
return [perm % kwargs for perm in self .perms_map [method ]]
184
187
185
188
def has_object_permission (self , request , view , obj ):
186
- if hasattr (view , 'get_queryset' ):
187
- queryset = view .get_queryset ()
188
- else :
189
- queryset = getattr (view , 'queryset' , None )
190
-
191
- assert queryset is not None , (
192
- 'Cannot apply DjangoObjectPermissions on a view that '
193
- 'does not set `.queryset` or have a `.get_queryset()` method.'
194
- )
195
-
189
+ # authentication checks have already executed via has_permission
190
+ queryset = self ._queryset (view )
196
191
model_cls = queryset .model
197
192
user = request .user
198
193
0 commit comments