@@ -114,6 +114,17 @@ 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
+ return view .get_queryset ()
126
+ return view .queryset
127
+
117
128
def has_permission (self , request , view ):
118
129
# Workaround to ensure DjangoModelPermissions are not applied
119
130
# to the root view when using DefaultRouter.
@@ -124,19 +135,7 @@ def has_permission(self, request, view):
124
135
not is_authenticated (request .user ) and self .authenticated_users_only ):
125
136
return False
126
137
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
-
138
+ queryset = self ._queryset (view )
140
139
perms = self .get_required_permissions (request .method , queryset .model )
141
140
142
141
return request .user .has_perms (perms )
@@ -183,16 +182,8 @@ def get_required_object_permissions(self, method, model_cls):
183
182
return [perm % kwargs for perm in self .perms_map [method ]]
184
183
185
184
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
-
185
+ # authentication checks have already executed via has_permission
186
+ queryset = self ._queryset (view )
196
187
model_cls = queryset .model
197
188
user = request .user
198
189
0 commit comments