diff --git a/netbox/extras/filters.py b/netbox/extras/filters.py index 8c805ebdf..cd1306bc4 100644 --- a/netbox/extras/filters.py +++ b/netbox/extras/filters.py @@ -8,6 +8,20 @@ from .constants import * from .models import ConfigContext, CustomField, Graph, ExportTemplate, ObjectChange, Tag, TopologyMap +__all__ = ( + 'ConfigContextFilter', + 'CreatedUpdatedFilterSet', + 'CustomFieldFilter', + 'CustomFieldFilterSet', + 'ExportTemplateFilter', + 'GraphFilter', + 'LocalConfigContextFilter', + 'ObjectChangeFilter', + 'TagFilter', + 'TopologyMapFilter', +) + + class CustomFieldFilter(django_filters.Filter): """ Filter objects by the presence of a CustomFieldValue. The filter's name is used as the CustomField name. diff --git a/netbox/extras/tests/test_filters.py b/netbox/extras/tests/test_filters.py new file mode 100644 index 000000000..6c6b8145b --- /dev/null +++ b/netbox/extras/tests/test_filters.py @@ -0,0 +1,181 @@ +from django.contrib.contenttypes.models import ContentType +from django.test import TestCase + +from dcim.models import DeviceRole, Platform, Region, Site +from extras.constants import * +from extras.filters import * +from extras.models import ConfigContext, ExportTemplate, Graph +from tenancy.models import Tenant, TenantGroup + + +class GraphTestCase(TestCase): + queryset = Graph.objects.all() + filterset = GraphFilter + + @classmethod + def setUpTestData(cls): + + graphs = ( + Graph(name='Graph 1', type=GRAPH_TYPE_DEVICE, source='http://example.com/1'), + Graph(name='Graph 2', type=GRAPH_TYPE_INTERFACE, source='http://example.com/2'), + Graph(name='Graph 3', type=GRAPH_TYPE_SITE, source='http://example.com/3'), + ) + Graph.objects.bulk_create(graphs) + + def test_name(self): + params = {'name': 'Graph 1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_type(self): + params = {'type': GRAPH_TYPE_DEVICE} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + +class ExportTemplateTestCase(TestCase): + queryset = ExportTemplate.objects.all() + filterset = ExportTemplateFilter + + @classmethod + def setUpTestData(cls): + + content_types = ContentType.objects.filter(model__in=['site', 'rack', 'device']) + + export_templates = ( + ExportTemplate(name='Export Template 1', content_type=content_types[0], template_language=TEMPLATE_LANGUAGE_DJANGO, template_code='TESTING'), + ExportTemplate(name='Export Template 2', content_type=content_types[1], template_language=TEMPLATE_LANGUAGE_JINJA2, template_code='TESTING'), + ExportTemplate(name='Export Template 3', content_type=content_types[2], template_language=TEMPLATE_LANGUAGE_JINJA2, template_code='TESTING'), + ) + ExportTemplate.objects.bulk_create(export_templates) + + def test_name(self): + params = {'name': 'Export Template 1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_content_type(self): + params = {'content_type': ContentType.objects.get(model='site').pk} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_template_language(self): + params = {'template_language': TEMPLATE_LANGUAGE_JINJA2} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + +class ConfigContextTestCase(TestCase): + queryset = ConfigContext.objects.all() + filterset = ConfigContextFilter + + @classmethod + def setUpTestData(cls): + + regions = ( + Region(name='Test Region 1', slug='test-region-1'), + Region(name='Test Region 2', slug='test-region-2'), + Region(name='Test Region 3', slug='test-region-3'), + ) + # Can't use bulk_create for models with MPTT fields + for r in regions: + r.save() + + sites = ( + Site(name='Test Site 1', slug='test-site-1'), + Site(name='Test Site 2', slug='test-site-2'), + Site(name='Test Site 3', slug='test-site-3'), + ) + Site.objects.bulk_create(sites) + + device_roles = ( + DeviceRole(name='Device Role 1', slug='device-role-1'), + DeviceRole(name='Device Role 2', slug='device-role-2'), + DeviceRole(name='Device Role 3', slug='device-role-3'), + ) + DeviceRole.objects.bulk_create(device_roles) + + platforms = ( + Platform(name='Platform 1', slug='platform-1'), + Platform(name='Platform 2', slug='platform-2'), + Platform(name='Platform 3', slug='platform-3'), + ) + Platform.objects.bulk_create(platforms) + + tenant_groups = ( + TenantGroup(name='Tenant Group 1', slug='tenant-group-1'), + TenantGroup(name='Tenant Group 2', slug='tenant-group-2'), + TenantGroup(name='Tenant Group 3', slug='tenant-group-3'), + ) + TenantGroup.objects.bulk_create(tenant_groups) + + tenants = ( + Tenant(name='Tenant 1', slug='tenant-1'), + Tenant(name='Tenant 2', slug='tenant-2'), + Tenant(name='Tenant 3', slug='tenant-3'), + ) + Tenant.objects.bulk_create(tenants) + + for i in range(0, 3): + is_active = bool(i % 2) + c = ConfigContext.objects.create( + name='Config Context {}'.format(i + 1), + is_active=is_active, + data='{"foo": 123}' + ) + c.regions.set([regions[i]]) + c.sites.set([sites[i]]) + c.roles.set([device_roles[i]]) + c.platforms.set([platforms[i]]) + c.tenant_groups.set([tenant_groups[i]]) + c.tenants.set([tenants[i]]) + + def test_name(self): + params = {'name': 'Config Context 1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_is_active(self): + params = {'is_active': True} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + params = {'is_active': False} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_region(self): + regions = Region.objects.all()[:2] + params = {'region_id': [regions[0].pk, regions[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'region': [regions[0].slug, regions[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_site(self): + sites = Site.objects.all()[:2] + params = {'site_id': [sites[0].pk, sites[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'site': [sites[0].slug, sites[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_role(self): + device_roles = DeviceRole.objects.all()[:2] + params = {'role_id': [device_roles[0].pk, device_roles[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'role': [device_roles[0].slug, device_roles[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_platform(self): + platforms = Platform.objects.all()[:2] + params = {'platform_id': [platforms[0].pk, platforms[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'platform': [platforms[0].slug, platforms[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_tenant_group(self): + tenant_groups = TenantGroup.objects.all()[:2] + params = {'tenant_group_id': [tenant_groups[0].pk, tenant_groups[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'tenant_group': [tenant_groups[0].slug, tenant_groups[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_tenant_(self): + tenants = Tenant.objects.all()[:2] + params = {'tenant_id': [tenants[0].pk, tenants[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'tenant': [tenants[0].slug, tenants[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + +# TODO: ObjectChangeFilter test