mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-25 08:46:10 -06:00
Clean up filtering for users, groups, and permissions
This commit is contained in:
parent
56cb542e1a
commit
d24330f412
@ -1,12 +1,11 @@
|
|||||||
import django_filters
|
import django_filters
|
||||||
from django.conf import settings
|
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.contrib.auth.models import Group, User
|
from django.contrib.auth.models import Group
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.utils.translation import gettext as _
|
from django.utils.translation import gettext as _
|
||||||
|
|
||||||
from netbox.filtersets import BaseFilterSet
|
from netbox.filtersets import BaseFilterSet
|
||||||
from users.models import ObjectPermission, Token, NetBoxUser
|
from users.models import ObjectPermission, Token
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'GroupFilterSet',
|
'GroupFilterSet',
|
||||||
@ -116,6 +115,18 @@ class ObjectPermissionFilterSet(BaseFilterSet):
|
|||||||
method='search',
|
method='search',
|
||||||
label=_('Search'),
|
label=_('Search'),
|
||||||
)
|
)
|
||||||
|
can_view = django_filters.BooleanFilter(
|
||||||
|
method='_check_action'
|
||||||
|
)
|
||||||
|
can_add = django_filters.BooleanFilter(
|
||||||
|
method='_check_action'
|
||||||
|
)
|
||||||
|
can_change = django_filters.BooleanFilter(
|
||||||
|
method='_check_action'
|
||||||
|
)
|
||||||
|
can_delete = django_filters.BooleanFilter(
|
||||||
|
method='_check_action'
|
||||||
|
)
|
||||||
user_id = django_filters.ModelMultipleChoiceFilter(
|
user_id = django_filters.ModelMultipleChoiceFilter(
|
||||||
field_name='users',
|
field_name='users',
|
||||||
queryset=get_user_model().objects.all(),
|
queryset=get_user_model().objects.all(),
|
||||||
@ -150,3 +161,10 @@ class ObjectPermissionFilterSet(BaseFilterSet):
|
|||||||
Q(name__icontains=value) |
|
Q(name__icontains=value) |
|
||||||
Q(description__icontains=value)
|
Q(description__icontains=value)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def _check_action(self, queryset, name, value):
|
||||||
|
action = name.split('_')[1]
|
||||||
|
if value:
|
||||||
|
return queryset.filter(actions__contains=[action])
|
||||||
|
else:
|
||||||
|
return queryset.exclude(actions__contains=[action])
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
from django import forms
|
from django import forms
|
||||||
|
from django.contrib.auth import get_user_model
|
||||||
|
from django.contrib.auth.models import Group
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from users.models import NetBoxGroup, NetBoxUser, ObjectPermission
|
|
||||||
from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice
|
|
||||||
|
|
||||||
from netbox.forms import NetBoxModelFilterSetForm
|
from netbox.forms import NetBoxModelFilterSetForm
|
||||||
|
from users.models import NetBoxGroup, NetBoxUser, ObjectPermission
|
||||||
|
from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES
|
||||||
|
from utilities.forms.fields import DynamicModelMultipleChoiceField
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'GroupFilterForm',
|
'GroupFilterForm',
|
||||||
@ -12,35 +15,6 @@ __all__ = (
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class UserFilterForm(NetBoxModelFilterSetForm):
|
|
||||||
model = NetBoxUser
|
|
||||||
fieldsets = (
|
|
||||||
(None, ('q', 'filter_id',)),
|
|
||||||
(_('Security'), ('is_superuser', 'is_staff', 'is_active')),
|
|
||||||
)
|
|
||||||
is_superuser = forms.NullBooleanField(
|
|
||||||
required=False,
|
|
||||||
widget=forms.Select(
|
|
||||||
choices=BOOLEAN_WITH_BLANK_CHOICES
|
|
||||||
),
|
|
||||||
label=_('Is Superuser'),
|
|
||||||
)
|
|
||||||
is_staff = forms.NullBooleanField(
|
|
||||||
required=False,
|
|
||||||
widget=forms.Select(
|
|
||||||
choices=BOOLEAN_WITH_BLANK_CHOICES
|
|
||||||
),
|
|
||||||
label=_('Is Staff'),
|
|
||||||
)
|
|
||||||
is_active = forms.NullBooleanField(
|
|
||||||
required=False,
|
|
||||||
widget=forms.Select(
|
|
||||||
choices=BOOLEAN_WITH_BLANK_CHOICES
|
|
||||||
),
|
|
||||||
label=_('Is Active'),
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class GroupFilterForm(NetBoxModelFilterSetForm):
|
class GroupFilterForm(NetBoxModelFilterSetForm):
|
||||||
model = NetBoxGroup
|
model = NetBoxGroup
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
@ -48,11 +22,47 @@ class GroupFilterForm(NetBoxModelFilterSetForm):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class UserFilterForm(NetBoxModelFilterSetForm):
|
||||||
|
model = NetBoxUser
|
||||||
|
fieldsets = (
|
||||||
|
(None, ('q', 'filter_id',)),
|
||||||
|
(_('Group'), ('group_id',)),
|
||||||
|
(_('Status'), ('is_active', 'is_staff', 'is_superuser')),
|
||||||
|
)
|
||||||
|
group_id = DynamicModelMultipleChoiceField(
|
||||||
|
queryset=Group.objects.all(),
|
||||||
|
required=False,
|
||||||
|
label=_('Group')
|
||||||
|
)
|
||||||
|
is_active = forms.NullBooleanField(
|
||||||
|
required=False,
|
||||||
|
widget=forms.Select(
|
||||||
|
choices=BOOLEAN_WITH_BLANK_CHOICES
|
||||||
|
),
|
||||||
|
label=_('Is Active'),
|
||||||
|
)
|
||||||
|
is_staff = forms.NullBooleanField(
|
||||||
|
required=False,
|
||||||
|
widget=forms.Select(
|
||||||
|
choices=BOOLEAN_WITH_BLANK_CHOICES
|
||||||
|
),
|
||||||
|
label=_('Is Staff'),
|
||||||
|
)
|
||||||
|
is_superuser = forms.NullBooleanField(
|
||||||
|
required=False,
|
||||||
|
widget=forms.Select(
|
||||||
|
choices=BOOLEAN_WITH_BLANK_CHOICES
|
||||||
|
),
|
||||||
|
label=_('Is Superuser'),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class ObjectPermissionFilterForm(NetBoxModelFilterSetForm):
|
class ObjectPermissionFilterForm(NetBoxModelFilterSetForm):
|
||||||
model = ObjectPermission
|
model = ObjectPermission
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
(None, ('q', 'filter_id',)),
|
(None, ('q', 'filter_id',)),
|
||||||
(None, ('enabled',)),
|
(_('Permission'), ('enabled', 'group_id', 'user_id')),
|
||||||
|
(_('Actions'), ('can_view', 'can_add', 'can_change', 'can_delete')),
|
||||||
)
|
)
|
||||||
enabled = forms.NullBooleanField(
|
enabled = forms.NullBooleanField(
|
||||||
label=_('Enabled'),
|
label=_('Enabled'),
|
||||||
@ -61,3 +71,41 @@ class ObjectPermissionFilterForm(NetBoxModelFilterSetForm):
|
|||||||
choices=BOOLEAN_WITH_BLANK_CHOICES
|
choices=BOOLEAN_WITH_BLANK_CHOICES
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
group_id = DynamicModelMultipleChoiceField(
|
||||||
|
queryset=Group.objects.all(),
|
||||||
|
required=False,
|
||||||
|
label=_('Group')
|
||||||
|
)
|
||||||
|
user_id = DynamicModelMultipleChoiceField(
|
||||||
|
queryset=get_user_model().objects.all(),
|
||||||
|
required=False,
|
||||||
|
label=_('User')
|
||||||
|
)
|
||||||
|
can_view = forms.NullBooleanField(
|
||||||
|
required=False,
|
||||||
|
widget=forms.Select(
|
||||||
|
choices=BOOLEAN_WITH_BLANK_CHOICES
|
||||||
|
),
|
||||||
|
label=_('Can View'),
|
||||||
|
)
|
||||||
|
can_add = forms.NullBooleanField(
|
||||||
|
required=False,
|
||||||
|
widget=forms.Select(
|
||||||
|
choices=BOOLEAN_WITH_BLANK_CHOICES
|
||||||
|
),
|
||||||
|
label=_('Can Add'),
|
||||||
|
)
|
||||||
|
can_change = forms.NullBooleanField(
|
||||||
|
required=False,
|
||||||
|
widget=forms.Select(
|
||||||
|
choices=BOOLEAN_WITH_BLANK_CHOICES
|
||||||
|
),
|
||||||
|
label=_('Can Change'),
|
||||||
|
)
|
||||||
|
can_delete = forms.NullBooleanField(
|
||||||
|
required=False,
|
||||||
|
widget=forms.Select(
|
||||||
|
choices=BOOLEAN_WITH_BLANK_CHOICES
|
||||||
|
),
|
||||||
|
label=_('Can Delete'),
|
||||||
|
)
|
||||||
|
@ -58,6 +58,7 @@ class TokenTable(NetBoxTable):
|
|||||||
|
|
||||||
class UserTable(NetBoxTable):
|
class UserTable(NetBoxTable):
|
||||||
username = tables.Column(linkify=True)
|
username = tables.Column(linkify=True)
|
||||||
|
groups = tables.ManyToManyColumn()
|
||||||
is_active = columns.BooleanColumn()
|
is_active = columns.BooleanColumn()
|
||||||
is_staff = columns.BooleanColumn()
|
is_staff = columns.BooleanColumn()
|
||||||
is_superuser = columns.BooleanColumn()
|
is_superuser = columns.BooleanColumn()
|
||||||
@ -68,7 +69,8 @@ class UserTable(NetBoxTable):
|
|||||||
class Meta(NetBoxTable.Meta):
|
class Meta(NetBoxTable.Meta):
|
||||||
model = NetBoxUser
|
model = NetBoxUser
|
||||||
fields = (
|
fields = (
|
||||||
'pk', 'id', 'username', 'first_name', 'last_name', 'email', 'is_active', 'is_staff', 'is_superuser',
|
'pk', 'id', 'username', 'first_name', 'last_name', 'email', 'groups', 'is_active', 'is_staff',
|
||||||
|
'is_superuser',
|
||||||
)
|
)
|
||||||
default_columns = ('pk', 'username', 'first_name', 'last_name', 'email', 'is_active')
|
default_columns = ('pk', 'username', 'first_name', 'last_name', 'email', 'is_active')
|
||||||
|
|
||||||
|
@ -10,7 +10,6 @@ from users import filtersets
|
|||||||
from users.models import ObjectPermission, Token
|
from users.models import ObjectPermission, Token
|
||||||
from utilities.testing import BaseFilterSetTests
|
from utilities.testing import BaseFilterSetTests
|
||||||
|
|
||||||
|
|
||||||
User = get_user_model()
|
User = get_user_model()
|
||||||
|
|
||||||
|
|
||||||
@ -34,7 +33,8 @@ class UserTestCase(TestCase, BaseFilterSetTests):
|
|||||||
first_name='Hank',
|
first_name='Hank',
|
||||||
last_name='Hill',
|
last_name='Hill',
|
||||||
email='hank@stricklandpropane.com',
|
email='hank@stricklandpropane.com',
|
||||||
is_staff=True
|
is_staff=True,
|
||||||
|
is_superuser=True
|
||||||
),
|
),
|
||||||
User(
|
User(
|
||||||
username='User2',
|
username='User2',
|
||||||
@ -83,13 +83,17 @@ class UserTestCase(TestCase, BaseFilterSetTests):
|
|||||||
params = {'email': ['hank@stricklandpropane.com', 'dale@dalesdeadbug.com']}
|
params = {'email': ['hank@stricklandpropane.com', 'dale@dalesdeadbug.com']}
|
||||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
|
||||||
|
def test_is_active(self):
|
||||||
|
params = {'is_active': True}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
|
||||||
|
|
||||||
def test_is_staff(self):
|
def test_is_staff(self):
|
||||||
params = {'is_staff': True}
|
params = {'is_staff': True}
|
||||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
|
||||||
|
|
||||||
def test_is_active(self):
|
def test_is_superuser(self):
|
||||||
params = {'is_active': True}
|
params = {'is_superuser': True}
|
||||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
|
||||||
|
|
||||||
def test_group(self):
|
def test_group(self):
|
||||||
groups = Group.objects.all()[:2]
|
groups = Group.objects.all()[:2]
|
||||||
@ -191,6 +195,22 @@ class ObjectPermissionTestCase(TestCase, BaseFilterSetTests):
|
|||||||
params = {'description': ['foobar1', 'foobar2']}
|
params = {'description': ['foobar1', 'foobar2']}
|
||||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
|
||||||
|
def test_can_view(self):
|
||||||
|
params = {'can_view': True}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
|
||||||
|
|
||||||
|
def test_can_add(self):
|
||||||
|
params = {'can_add': True}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
|
||||||
|
|
||||||
|
def test_can_change(self):
|
||||||
|
params = {'can_change': True}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
|
||||||
|
|
||||||
|
def test_can_delete(self):
|
||||||
|
params = {'can_delete': True}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
|
||||||
|
|
||||||
|
|
||||||
class TokenTestCase(TestCase, BaseFilterSetTests):
|
class TokenTestCase(TestCase, BaseFilterSetTests):
|
||||||
queryset = Token.objects.all()
|
queryset = Token.objects.all()
|
||||||
|
Loading…
Reference in New Issue
Block a user