Просмотр исходного кода

Add filters for ObjectPermissions

Jeremy Stretch 5 лет назад
Родитель
Сommit
380d30e612
3 измененных файлов с 109 добавлено и 2 удалено
  1. 1 1
      netbox/users/api/views.py
  2. 31 0
      netbox/users/filters.py
  3. 77 1
      netbox/users/tests/test_filters.py

+ 1 - 1
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

+ 31 - 0
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']

+ 77 - 1
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)