1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Add filters for ObjectPermissions

This commit is contained in:
Jeremy Stretch
2020-07-22 16:34:16 -04:00
parent 4f54ffa9aa
commit 380d30e612
3 changed files with 109 additions and 2 deletions

View File

@ -31,4 +31,4 @@ class GroupViewSet(ModelViewSet):
class ObjectPermissionViewSet(ModelViewSet): class ObjectPermissionViewSet(ModelViewSet):
queryset = ObjectPermission.objects.prefetch_related('object_types', 'groups', 'users') queryset = ObjectPermission.objects.prefetch_related('object_types', 'groups', 'users')
serializer_class = serializers.ObjectPermissionSerializer serializer_class = serializers.ObjectPermissionSerializer
# filterset_class = filters.ObjectPermissionFilterSet filterset_class = filters.ObjectPermissionFilterSet

View File

@ -2,10 +2,12 @@ import django_filters
from django.contrib.auth.models import Group, User from django.contrib.auth.models import Group, User
from django.db.models import Q from django.db.models import Q
from users.models import ObjectPermission
from utilities.filters import BaseFilterSet from utilities.filters import BaseFilterSet
__all__ = ( __all__ = (
'GroupFilterSet', 'GroupFilterSet',
'ObjectPermissionFilterSet',
'UserFilterSet', 'UserFilterSet',
) )
@ -56,3 +58,32 @@ class UserFilterSet(BaseFilterSet):
Q(last_name__icontains=value) | Q(last_name__icontains=value) |
Q(email__icontains=value) Q(email__icontains=value)
) )
class ObjectPermissionFilterSet(BaseFilterSet):
user_id = django_filters.ModelMultipleChoiceFilter(
field_name='users',
queryset=User.objects.all(),
label='User',
)
user = django_filters.ModelMultipleChoiceFilter(
field_name='users__username',
queryset=User.objects.all(),
to_field_name='username',
label='User (name)',
)
group_id = django_filters.ModelMultipleChoiceFilter(
field_name='groups',
queryset=Group.objects.all(),
label='Group',
)
group = django_filters.ModelMultipleChoiceFilter(
field_name='groups__name',
queryset=Group.objects.all(),
to_field_name='name',
label='Group (name)',
)
class Meta:
model = ObjectPermission
fields = ['id', 'name', 'enabled', 'object_types']

View File

@ -1,7 +1,9 @@
from django.contrib.auth.models import Group, User from django.contrib.auth.models import Group, User
from django.contrib.contenttypes.models import ContentType
from django.test import TestCase from django.test import TestCase
from users.filters import GroupFilterSet, UserFilterSet from users.filters import GroupFilterSet, ObjectPermissionFilterSet, UserFilterSet
from users.models import ObjectPermission
class UserTestCase(TestCase): class UserTestCase(TestCase):
@ -114,3 +116,77 @@ class GroupTestCase(TestCase):
def test_name(self): def test_name(self):
params = {'name': ['Group 1', 'Group 2']} params = {'name': ['Group 1', 'Group 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
class ObjectPermissionTestCase(TestCase):
queryset = ObjectPermission.objects.all()
filterset = ObjectPermissionFilterSet
@classmethod
def setUpTestData(cls):
groups = (
Group(name='Group 1'),
Group(name='Group 2'),
Group(name='Group 3'),
)
Group.objects.bulk_create(groups)
users = (
User(username='User1'),
User(username='User2'),
User(username='User3'),
)
User.objects.bulk_create(users)
object_types = (
ContentType.objects.get(app_label='dcim', model='site'),
ContentType.objects.get(app_label='dcim', model='rack'),
ContentType.objects.get(app_label='dcim', model='device'),
)
permissions = (
ObjectPermission(name='Permission 1', actions=['view', 'add', 'change', 'delete']),
ObjectPermission(name='Permission 2', actions=['view', 'add', 'change', 'delete']),
ObjectPermission(name='Permission 3', actions=['view', 'add', 'change', 'delete']),
ObjectPermission(name='Permission 4', actions=['view'], enabled=False),
ObjectPermission(name='Permission 5', actions=['add'], enabled=False),
ObjectPermission(name='Permission 6', actions=['change'], enabled=False),
ObjectPermission(name='Permission 7', actions=['delete'], enabled=False),
)
ObjectPermission.objects.bulk_create(permissions)
for i in range(0, 3):
permissions[i].groups.set([groups[i]])
permissions[i].users.set([users[i]])
permissions[i].object_types.set([object_types[i]])
def test_id(self):
params = {'id': self.queryset.values_list('pk', flat=True)[:2]}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_name(self):
params = {'name': ['Permission 1', 'Permission 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_enabled(self):
params = {'enabled': True}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3)
def test_group(self):
groups = Group.objects.filter(name__in=['Group 1', 'Group 2'])
params = {'group_id': [groups[0].pk, groups[1].pk]}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
params = {'group': [groups[0].name, groups[1].name]}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_user(self):
users = User.objects.filter(username__in=['User1', 'User2'])
params = {'user_id': [users[0].pk, users[1].pk]}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
params = {'user': [users[0].username, users[1].username]}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_object_types(self):
object_types = ContentType.objects.filter(model__in=['site', 'rack'])
params = {'object_types': [object_types[0].pk, object_types[1].pk]}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)