Skip to content

Commit b92ab12

Browse files
authored
fix: has_permission callback in template (#275)
1 parent bf1ab4c commit b92ab12

File tree

4 files changed

+38
-34
lines changed

4 files changed

+38
-34
lines changed

src/unfold/sites.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -234,10 +234,6 @@ def _get_is_active(link: str) -> bool:
234234
allowed_items = []
235235

236236
for item in group["items"]:
237-
# Skip item if permission check fails
238-
if not self._call_permission_callback(item.get("permission"), request):
239-
continue
240-
241237
item["active"] = False
242238
item["active"] = _get_is_active(item["link"])
243239

@@ -260,6 +256,11 @@ def _get_is_active(link: str) -> bool:
260256
if isinstance(item["link"], Callable):
261257
item["link"] = item["link"](request)
262258

259+
# Permission callback
260+
item["has_permission"] = self._call_permission_callback(
261+
item.get("permission"), request
262+
)
263+
263264
# Badge callbacks
264265
if "badge" in item and isinstance(item["badge"], str):
265266
try:
@@ -283,9 +284,9 @@ def get_tabs_list(self, request: HttpRequest) -> List[Dict[str, Any]]:
283284
allowed_items = []
284285

285286
for item in tab["items"]:
286-
# Skip item if permission check fails
287-
if not self._call_permission_callback(item.get("permission"), request):
288-
continue
287+
item["has_permission"] = self._call_permission_callback(
288+
item.get("permission"), request
289+
)
289290

290291
if isinstance(item["link"], Callable):
291292
item["link"] = item["link"](request)

src/unfold/templates/unfold/helpers/app_list.html

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,27 @@ <h3 class="font-medium my-3 px-6 text-gray-900 text-sm first:mt-0 dark:text-gray
1616

1717
<ol class="px-6">
1818
{% for item in group.items %}
19-
<li>
20-
<a href="{{ item.link }}"
21-
class="border border-transparent flex h-11 items-center -mx-3 px-3 py-2 rounded-md {% if item.active %}bg-gray-100 font-semibold text-primary-600 dark:border dark:border-gray-800 dark:bg-white/[.02] dark:text-primary-500{% else %}text-gray-500 hover:text-gray-700 dark:text-gray-400 hover:dark:text-gray-200{% endif %}">
22-
{% if item.icon %}
23-
<span class="material-symbols-outlined md-18 mr-3 w-4.5">
24-
{{ item.icon }}
25-
</span>
26-
{% endif %}
27-
28-
<span class="text-sm">
29-
{{ item.title|safe }}
30-
</span>
19+
{% if item.has_permission %}
20+
<li>
21+
<a href="{{ item.link }}" class="border border-transparent flex h-11 items-center -mx-3 px-3 py-2 rounded-md {% if item.active %}bg-gray-100 font-semibold text-primary-600 dark:border dark:border-gray-800 dark:bg-white/[.02] dark:text-primary-500{% else %}text-gray-500 hover:text-gray-700 dark:text-gray-400 hover:dark:text-gray-200{% endif %}">
22+
{% if item.icon %}
23+
<span class="material-symbols-outlined md-18 mr-3 w-4.5">
24+
{{ item.icon }}
25+
</span>
26+
{% endif %}
3127

32-
{% if item.badge %}
33-
<span class="bg-red-600 font-semibold ml-2 px-1 rounded-sm text-xs text-white">
34-
{{ item.badge|safe }}
28+
<span class="text-sm">
29+
{{ item.title|safe }}
3530
</span>
36-
{% endif %}
37-
</a>
38-
</li>
31+
32+
{% if item.badge %}
33+
<span class="bg-red-600 font-semibold ml-2 px-1 rounded-sm text-xs text-white">
34+
{{ item.badge|safe }}
35+
</span>
36+
{% endif %}
37+
</a>
38+
</li>
39+
{% endif %}
3940
{% endfor %}
4041
</ol>
4142
{% endif %}

src/unfold/templates/unfold/helpers/tab_list.html

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44
{% if tab_list %}
55
<ul class="border rounded-md flex flex-col w-full md:flex-row md:border-b-0 md:border-t-0 md:border-l-0 md:border-r-0 dark:border-gray-800">
66
{% for item in tab_list %}
7-
<li class="border-b last:border-b-0 md:border-b-0 md:mr-8 dark:border-gray-800">
8-
<a href="{{ item.link }}" class="block px-3 py-2 {% if item.link|stringformat:"s" in request.path %} border-b md:border-primary-500 dark:md:border-primary-600 font-medium -mb-px text-primary-600 hover:text-primary-600 dark:text-primary-500{% else %} hover:text-gray-700 dark:hover:text-gray-200{% endif %} md:py-4 md:px-0 dark:border-gray-800">
9-
{{ item.title }}
10-
</a>
11-
</li>
7+
{% if item.has_permission %}
8+
<li class="border-b last:border-b-0 md:border-b-0 md:mr-8 dark:border-gray-800">
9+
<a href="{{ item.link }}" class="block px-3 py-2 {% if item.link|stringformat:"s" in request.path %} border-b md:border-primary-500 dark:md:border-primary-600 font-medium -mb-px text-primary-600 hover:text-primary-600 dark:text-primary-500{% else %} hover:text-gray-700 dark:hover:text-gray-200{% endif %} md:py-4 md:px-0 dark:border-gray-800">
10+
{{ item.title }}
11+
</a>
12+
</li>
13+
{% endif %}
1214
{% endfor %}
1315
</ul>
1416
{% endif %}

tests/test_navigations.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def test_check_tab_lambda_deny_permission(self):
3636
admin_site = UnfoldAdminSite()
3737
request = RequestFactory().get("/rand")
3838
tabs = admin_site.get_tabs_list(request)
39-
self.assertEqual(len(tabs[0]["items"]), 0)
39+
self.assertFalse(tabs[0]["items"][0]["has_permission"])
4040

4141
@override_settings(
4242
UNFOLD={
@@ -60,7 +60,7 @@ def test_check_tab_lambda_allow_permission(self):
6060
admin_site = UnfoldAdminSite()
6161
request = RequestFactory().get("/rand")
6262
tabs = admin_site.get_tabs_list(request)
63-
self.assertEqual(len(tabs[0]["items"]), 1)
63+
self.assertTrue(tabs[0]["items"][0]["has_permission"])
6464

6565
@override_settings(
6666
UNFOLD={
@@ -84,7 +84,7 @@ def test_check_tab_path_deny_permission(self):
8484
admin_site = UnfoldAdminSite()
8585
request = RequestFactory().get("/rand")
8686
tabs = admin_site.get_tabs_list(request)
87-
self.assertEqual(len(tabs[0]["items"]), 0)
87+
self.assertFalse(tabs[0]["items"][0]["has_permission"])
8888

8989
@override_settings(
9090
UNFOLD={
@@ -108,4 +108,4 @@ def test_check_tab_path_allow_permission(self):
108108
admin_site = UnfoldAdminSite()
109109
request = RequestFactory().get("/rand")
110110
tabs = admin_site.get_tabs_list(request)
111-
self.assertEqual(len(tabs[0]["items"]), 1)
111+
self.assertTrue(tabs[0]["items"][0]["has_permission"])

0 commit comments

Comments
 (0)