Skip to content

Commit 1b3ef70

Browse files
fix permission checks for multiple perms and NavGroup (#99)
1 parent 39a832c commit 1b3ef70

File tree

1 file changed

+31
-16
lines changed

1 file changed

+31
-16
lines changed

src/django_simple_nav/nav.py

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)