Skip to content

Commit aebd870

Browse files
author
oko-x
committed
triv: permissions for actions change
1 parent 3bda2d9 commit aebd870

File tree

3 files changed

+55
-25
lines changed

3 files changed

+55
-25
lines changed

src/django_smartbase_admin/actions/admin_action_list.py

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -119,17 +119,6 @@ def get_excel_columns(self):
119119
if field.field in values
120120
]
121121

122-
def process_actions_permissions(self, actions):
123-
result = []
124-
for action in actions:
125-
if self.view.has_permission(
126-
self.threadsafe_request,
127-
obj=None,
128-
permission=action,
129-
):
130-
result.append(action)
131-
return result
132-
133122
def get_template_data(self):
134123
context_data = self.view.get_context_data(self.threadsafe_request)
135124
constants = {
@@ -166,17 +155,18 @@ def get_template_data(self):
166155
tabulator_definition["constants"] = constants
167156

168157
list_actions = self.list_actions or self.view._get_sbadmin_list_actions()
169-
list_selection_actions = self.view.get_sbadmin_list_selection_actions_grouped()
170158

171159
context_data.update(
172160
{
173161
"const": constants,
174162
"tabulator_definition": tabulator_definition,
175163
"id_column_name": id_column_name,
176164
"filters": self.get_filters(),
177-
"list_actions": self.process_actions_permissions(list_actions),
178-
"list_selection_actions": self.process_actions_permissions(
179-
list_selection_actions
165+
"list_actions": self.view.process_actions_permissions(
166+
self.threadsafe_request, list_actions
167+
),
168+
"list_selection_actions": self.view.get_sbadmin_list_selection_actions_grouped(
169+
self.threadsafe_request
180170
),
181171
"config_url": self.view.get_config_url(),
182172
"new_url": (

src/django_smartbase_admin/engine/actions.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,48 @@
1+
from django.core.exceptions import ImproperlyConfigured
12
from django.utils.text import slugify
23

34

45
class SBAdminCustomAction(object):
56
title = None
67
url = None
7-
slug = None
8+
view = None
9+
action_id = None
810
css_class = None
911
no_params = False
1012
open_in_modal = False
1113

1214
def __init__(
1315
self,
1416
title,
15-
url,
16-
slug=None,
17+
url=None,
18+
view=None,
19+
action_id=None,
20+
action_modifier=None,
1721
css_class=None,
1822
no_params=False,
1923
open_in_modal=False,
2024
group=None,
2125
) -> None:
2226
super().__init__()
27+
28+
if not (url or (view and action_id)):
29+
raise ImproperlyConfigured(
30+
"You must provide either url or view and action_id"
31+
)
32+
2333
self.title = title
2434
self.url = url
25-
self.slug = slug if slug is not None else slugify(title)
35+
self.view = view
36+
self.action_id = action_id
37+
self.action_modifier = action_modifier
2638
self.css_class = css_class
2739
self.no_params = no_params
2840
self.open_in_modal = open_in_modal
2941
self.group = group
42+
if not url and not action_modifier:
43+
self.url = self.view.get_action_url(self.action_id)
44+
if not url and action_modifier is not None:
45+
self.url = self.view.get_action_url(self.action_id, action_modifier)
3046

3147

3248
class SBAdminAction(object):

src/django_smartbase_admin/engine/admin_base_view.py

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,25 @@ def has_change_permission(self, request, obj=None):
6565
def has_delete_permission(self, request, obj=None):
6666
return self.has_permission(request, obj, "delete")
6767

68+
def has_permission_for_action(self, request, action_id):
69+
return self.has_permission(
70+
request,
71+
obj=None,
72+
permission=action_id,
73+
)
74+
6875
def has_view_or_change_permission(self, request, obj=None):
6976
return self.has_view_permission(request, obj) or self.has_change_permission(
7077
request, obj
7178
)
7279

80+
def process_actions_permissions(self, request, actions):
81+
result = []
82+
for action in actions:
83+
if self.has_permission_for_action(request, action.action_id):
84+
result.append(action)
85+
return result
86+
7387
def init_view_dynamic(self, request, request_data=None, **kwargs):
7488
if not self.has_view_or_change_permission(request):
7589
raise PermissionDenied
@@ -96,6 +110,9 @@ def action_view(self, request, action=None, modifier=None):
96110
action_function = getattr(self, action, None)
97111
if not action_function:
98112
raise Http404
113+
permitted_action = self.has_permission_for_action(request, action)
114+
if not permitted_action:
115+
raise PermissionDenied
99116
return action_function(request, modifier)
100117

101118
def get_action_url(self, action, modifier="template"):
@@ -367,7 +384,8 @@ def _get_sbadmin_list_actions(self):
367384
*list_actions,
368385
SBAdminCustomAction(
369386
title=_(f"Reorder {self.model._meta.verbose_name}"),
370-
url=self.get_action_url(Action.ENTER_REORDER.value),
387+
view=self,
388+
action_id=Action.ENTER_REORDER.value,
371389
no_params=True,
372390
),
373391
]
@@ -378,7 +396,8 @@ def get_sbadmin_list_actions(self):
378396
self.sbadmin_list_actions = [
379397
SBAdminCustomAction(
380398
title=_("Download XLSX"),
381-
url=self.get_action_url(action=Action.XLSX_EXPORT.value),
399+
view=self,
400+
action_id=Action.XLSX_EXPORT.value,
382401
)
383402
]
384403
return self.sbadmin_list_actions
@@ -388,19 +407,24 @@ def get_sbadmin_list_selection_actions(self):
388407
self.sbadmin_list_selection_actions = [
389408
SBAdminCustomAction(
390409
title=_("Export Selected"),
391-
url=self.get_action_url(action=Action.XLSX_EXPORT.value),
410+
view=self,
411+
action_id=Action.XLSX_EXPORT.value,
392412
),
393413
SBAdminCustomAction(
394414
title=_("Delete Selected"),
395-
url=self.get_action_url(action=Action.BULK_DELETE.value),
415+
view=self,
416+
action_id=Action.BULK_DELETE.value,
396417
css_class="btn-destructive",
397418
),
398419
]
399420
return self.sbadmin_list_selection_actions
400421

401-
def get_sbadmin_list_selection_actions_grouped(self):
422+
def get_sbadmin_list_selection_actions_grouped(self, request):
402423
result = {}
403-
for action in self.get_sbadmin_list_selection_actions():
424+
list_selection_actions = self.process_actions_permissions(
425+
request, self.get_sbadmin_list_selection_actions()
426+
)
427+
for action in list_selection_actions:
404428
if not result.get(action.group):
405429
result.update({action.group: []})
406430
result[action.group].append(action)

0 commit comments

Comments
 (0)