@@ -142,20 +142,22 @@ def check_permissions(self, request: HttpRequest) -> bool:
142142 # and we should hide if *any* permissions are set
143143 return not self .permissions
144144
145+ if not self .permissions :
146+ return True
147+
145148 # explicitly cast to AbstractUser to make static type checkers happy
146149 # `django-stubs` types `request.user` as `django.contrib.auth.base_user.AbstractBaseUser`
147150 # as opposed to `django.contrib.auth.models.AbstractUser` or `django.contrib.auth.models.User`
148151 # so any type checkers will complain if this is not casted
149152 user = cast (AbstractUser , request .user )
150153
151- has_perm = False
152-
153- if not self .permissions :
154- has_perm = True
154+ permission_checks : list [bool ] = []
155155
156156 for idx , perm in enumerate (self .permissions ):
157+ has_perm = False
158+
157159 if getattr (user , "is_superuser" , False ):
158- has_perm = True
160+ permission_checks . append ( True )
159161 break
160162 elif callable (perm ):
161163 has_perm = perm (request )
@@ -164,19 +166,12 @@ def check_permissions(self, request: HttpRequest) -> bool:
164166 else :
165167 has_perm = user .has_perm (perm )
166168
169+ permission_checks .append (has_perm )
170+
167171 if not idx == len (self .permissions ) - 1 :
168172 continue
169173
170- if isinstance (self , NavGroup ) and hasattr (self , "items" ):
171- sub_items = [
172- sub_item
173- for sub_item in self .items
174- if sub_item .check_permissions (request ) is not False
175- ]
176- if not sub_items and not self .url :
177- has_perm = False
178-
179- return has_perm
174+ return all (permission_checks )
180175
181176
182177@dataclass (frozen = True )
@@ -186,13 +181,33 @@ class NavGroup(NavItem):
186181 @override
187182 def get_context_data (self , request : HttpRequest ) -> dict [str , object ]:
188183 context = super ().get_context_data (request )
189- context ["items" ] = [item .get_context_data (request ) for item in self .items ]
184+
185+ items = self .get_items (request )
186+ context ["items" ] = [item .get_context_data (request ) for item in items ]
187+
190188 return context
191189
190+ def get_items (self , request : HttpRequest ) -> list [NavGroup | NavItem ]:
191+ return [item for item in self .items if item .check_permissions (request )]
192+
192193 @override
193194 def get_url (self ) -> str :
194195 try :
195196 url = super ().get_url ()
196197 except ImproperlyConfigured :
197198 return ""
198199 return url
200+
201+ @override
202+ def check_permissions (self , request : HttpRequest ) -> bool :
203+ has_perm = super ().check_permissions (request )
204+
205+ sub_items = [
206+ sub_item
207+ for sub_item in self .items
208+ if sub_item .check_permissions (request ) is not False
209+ ]
210+ if not sub_items and not self .url :
211+ has_perm = False
212+
213+ return has_perm
0 commit comments