diff --git a/netbox/users/api/views.py b/netbox/users/api/views.py index 5e9624ee8..1c3a92bcc 100644 --- a/netbox/users/api/views.py +++ b/netbox/users/api/views.py @@ -31,4 +31,4 @@ class GroupViewSet(ModelViewSet): class ObjectPermissionViewSet(ModelViewSet): queryset = ObjectPermission.objects.prefetch_related('object_types', 'groups', 'users') serializer_class = serializers.ObjectPermissionSerializer - # filterset_class = filters.ObjectPermissionFilterSet + filterset_class = filters.ObjectPermissionFilterSet diff --git a/netbox/users/filters.py b/netbox/users/filters.py index d33c10270..359cf9cc7 100644 --- a/netbox/users/filters.py +++ b/netbox/users/filters.py @@ -2,10 +2,12 @@ import django_filters from django.contrib.auth.models import Group, User from django.db.models import Q +from users.models import ObjectPermission from utilities.filters import BaseFilterSet __all__ = ( 'GroupFilterSet', + 'ObjectPermissionFilterSet', 'UserFilterSet', ) @@ -56,3 +58,32 @@ class UserFilterSet(BaseFilterSet): Q(last_name__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'] diff --git a/netbox/users/tests/test_filters.py b/netbox/users/tests/test_filters.py index 7db013a4b..c3774927c 100644 --- a/netbox/users/tests/test_filters.py +++ b/netbox/users/tests/test_filters.py @@ -1,7 +1,9 @@ from django.contrib.auth.models import Group, User +from django.contrib.contenttypes.models import ContentType 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): @@ -114,3 +116,77 @@ class GroupTestCase(TestCase): def test_name(self): params = {'name': ['Group 1', 'Group 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)