mirror of
https://github.com/netbox-community/netbox.git
synced 2025-12-23 13:52:17 -06:00
Fixes #845: Fix missing edit/delete buttons on object tables for non-superusers
This commit is contained in:
@@ -17,10 +17,6 @@ class BaseTable(tables.Table):
|
||||
'class': 'table table-hover',
|
||||
}
|
||||
|
||||
@property
|
||||
def model(self):
|
||||
return self._meta.model
|
||||
|
||||
|
||||
class ToggleColumn(tables.CheckBoxColumn):
|
||||
|
||||
|
||||
@@ -44,24 +44,6 @@ def startswith(value, arg):
|
||||
return str(value).startswith(arg)
|
||||
|
||||
|
||||
@register.filter()
|
||||
def user_can_add(model, user):
|
||||
perm_name = '{}:add_{}'.format(model._meta.app_label, model.__class__.__name__.lower())
|
||||
return user.has_perm(perm_name)
|
||||
|
||||
|
||||
@register.filter()
|
||||
def user_can_change(model, user):
|
||||
perm_name = '{}:change_{}'.format(model._meta.app_label, model.__class__.__name__.lower())
|
||||
return user.has_perm(perm_name)
|
||||
|
||||
|
||||
@register.filter()
|
||||
def user_can_delete(model, user):
|
||||
perm_name = '{}:delete_{}'.format(model._meta.app_label, model.__class__.__name__.lower())
|
||||
return user.has_perm(perm_name)
|
||||
|
||||
|
||||
#
|
||||
# Tags
|
||||
#
|
||||
|
||||
@@ -46,14 +46,12 @@ class ObjectListView(View):
|
||||
filter: A django-filter FilterSet that is applied to the queryset
|
||||
filter_form: The form used to render filter options
|
||||
table: The django-tables2 Table used to render the objects list
|
||||
edit_permissions: Editing controls are displayed only if the user has these permissions
|
||||
template_name: The name of the template
|
||||
"""
|
||||
queryset = None
|
||||
filter = None
|
||||
filter_form = None
|
||||
table = None
|
||||
edit_permissions = []
|
||||
template_name = None
|
||||
|
||||
def get(self, request):
|
||||
@@ -95,14 +93,19 @@ class ObjectListView(View):
|
||||
# Provide a hook to tweak the queryset based on the request immediately prior to rendering the object list
|
||||
self.queryset = self.alter_queryset(request)
|
||||
|
||||
# Compile user model permissions for access from within the template
|
||||
perm_base_name = '{}.{{}}_{}'.format(model._meta.app_label, model._meta.model_name)
|
||||
permissions = {p: request.user.has_perm(perm_base_name.format(p)) for p in ['add', 'change', 'delete']}
|
||||
|
||||
# Construct the table based on the user's permissions
|
||||
table = self.table(self.queryset)
|
||||
if 'pk' in table.base_columns and any([request.user.has_perm(perm) for perm in self.edit_permissions]):
|
||||
if 'pk' in table.base_columns and (permissions['change'] or permissions['delete']):
|
||||
table.base_columns['pk'].visible = True
|
||||
RequestConfig(request, paginate={'klass': EnhancedPaginator}).configure(table)
|
||||
|
||||
context = {
|
||||
'table': table,
|
||||
'permissions': permissions,
|
||||
'filter_form': self.filter_form(request.GET, label_suffix='') if self.filter_form else None,
|
||||
'export_templates': ExportTemplate.objects.filter(content_type=object_ct),
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user