class CableFilter(django_filters.FilterSet): q = django_filters.CharFilter( method='search', label='Search', ) type = django_filters.MultipleChoiceFilter(choices=CABLE_TYPE_CHOICES) status = django_filters.MultipleChoiceFilter( choices=CONNECTION_STATUS_CHOICES) color = django_filters.MultipleChoiceFilter(choices=COLOR_CHOICES) device_id = MultiValueNumberFilter(method='filter_device') device = MultiValueCharFilter(method='filter_device', field_name='device__name') rack_id = MultiValueNumberFilter(method='filter_device', field_name='device__rack_id') rack = MultiValueNumberFilter(method='filter_device', field_name='device__rack__name') site_id = MultiValueNumberFilter(method='filter_device', field_name='device__site_id') site = MultiValueNumberFilter(method='filter_device', field_name='device__site__slug') class Meta: model = Cable fields = ['id', 'label', 'length', 'length_unit'] def search(self, queryset, name, value): if not value.strip(): return queryset return queryset.filter(label__icontains=value) def filter_device(self, queryset, name, value): queryset = queryset.filter( Q(**{'_termination_a_{}__in'.format(name): value}) | Q(**{'_termination_b_{}__in'.format(name): value})) return queryset
class ConnectionFilterSet(BaseFilterSet): site_id = MultiValueNumberFilter(method='filter_connections', field_name='device__site_id') site = MultiValueCharFilter(method='filter_connections', field_name='device__site__slug') device_id = MultiValueNumberFilter(method='filter_connections', field_name='device_id') device = MultiValueCharFilter(method='filter_connections', field_name='device__name') def filter_connections(self, queryset, name, value): if not value: return queryset return queryset.filter(**{f'{name}__in': value})
class InterfaceConnectionFilterSet(BaseFilterSet): site = django_filters.CharFilter( method='filter_site', label='Site (slug)', ) device_id = MultiValueNumberFilter(method='filter_device') device = MultiValueCharFilter(method='filter_device', field_name='device__name') class Meta: model = Interface fields = ['connection_status'] def filter_site(self, queryset, name, value): if not value.strip(): return queryset return queryset.filter( Q(device__site__slug=value) | Q(_connected_interface__device__site__slug=value)) def filter_device(self, queryset, name, value): if not value: return queryset return queryset.filter( Q(**{'{}__in'.format(name): value}) | Q(**{'_connected_interface__{}__in'.format(name): value}))
class ConsoleConnectionFilterSet(django_filters.FilterSet): site = django_filters.CharFilter( method='filter_site', label='Site (slug)', ) device_id = MultiValueNumberFilter( method='filter_device' ) device = MultiValueCharFilter( method='filter_device', field_name='device__name' ) class Meta: model = ConsolePort fields = ['name', 'connection_status'] def filter_site(self, queryset, name, value): if not value.strip(): return queryset return queryset.filter(connected_endpoint__device__site__slug=value) def filter_device(self, queryset, name, value): if not value: return queryset return queryset.filter( Q(**{'{}__in'.format(name): value}) | Q(**{'connected_endpoint__{}__in'.format(name): value}) )
class CableFilterSet(PrimaryModelFilterSet): q = django_filters.CharFilter( method='search', label='Search', ) termination_a_type = ContentTypeFilter() termination_a_id = MultiValueNumberFilter() termination_b_type = ContentTypeFilter() termination_b_id = MultiValueNumberFilter() type = django_filters.MultipleChoiceFilter(choices=CableTypeChoices) status = django_filters.MultipleChoiceFilter(choices=CableStatusChoices) color = django_filters.MultipleChoiceFilter(choices=ColorChoices) device_id = MultiValueNumberFilter(method='filter_device') device = MultiValueCharFilter(method='filter_device', field_name='device__name') rack_id = MultiValueNumberFilter(method='filter_device', field_name='device__rack_id') rack = MultiValueNumberFilter(method='filter_device', field_name='device__rack__name') site_id = MultiValueNumberFilter(method='filter_device', field_name='device__site_id') site = MultiValueNumberFilter(method='filter_device', field_name='device__site__slug') tenant_id = MultiValueNumberFilter(method='filter_device', field_name='device__tenant_id') tenant = MultiValueNumberFilter(method='filter_device', field_name='device__tenant__slug') tag = TagFilter() class Meta: model = Cable fields = [ 'id', 'label', 'length', 'length_unit', 'termination_a_id', 'termination_b_id' ] def search(self, queryset, name, value): if not value.strip(): return queryset return queryset.filter(label__icontains=value) def filter_device(self, queryset, name, value): queryset = queryset.filter( Q(**{'_termination_a_{}__in'.format(name): value}) | Q(**{'_termination_b_{}__in'.format(name): value})) return queryset
class InterfaceConnectionFilterSet(ConnectionFilterSet, BaseFilterSet): site = django_filters.CharFilter( method='filter_site', label='Site (slug)', ) device_id = MultiValueNumberFilter(method='filter_device') device = MultiValueCharFilter(method='filter_device', field_name='device__name') class Meta: model = Interface fields = []
class PowerConnectionFilterSet(ConnectionFilterSet): site = django_filters.CharFilter( method='filter_site', label='Site (slug)', ) device_id = MultiValueNumberFilter(method='filter_device') device = MultiValueCharFilter(method='filter_device', field_name='device__name') class Meta: model = PowerPort fields = ['name']
class WirelessLinkFilterSet(PrimaryModelFilterSet): q = django_filters.CharFilter( method='search', label='Search', ) interface_a_id = MultiValueNumberFilter() interface_b_id = MultiValueNumberFilter() status = django_filters.MultipleChoiceFilter(choices=LinkStatusChoices) auth_type = django_filters.MultipleChoiceFilter( choices=WirelessAuthTypeChoices) auth_cipher = django_filters.MultipleChoiceFilter( choices=WirelessAuthCipherChoices) tag = TagFilter() class Meta: model = WirelessLink fields = ['id', 'ssid', 'auth_psk'] def search(self, queryset, name, value): if not value.strip(): return queryset qs_filter = (Q(ssid__icontains=value) | Q(description__icontains=value)) return queryset.filter(qs_filter)
class TagFilterSet(ChangeLoggedModelFilterSet): q = django_filters.CharFilter( method='search', label='Search', ) content_type = MultiValueCharFilter(method='_content_type') content_type_id = MultiValueNumberFilter(method='_content_type_id') class Meta: model = Tag fields = ['id', 'name', 'slug', 'color'] def search(self, queryset, name, value): if not value.strip(): return queryset return queryset.filter( Q(name__icontains=value) | Q(slug__icontains=value)) def _content_type(self, queryset, name, values): ct_filter = Q() # Compile list of app_label & model pairings for value in values: try: app_label, model = value.lower().split('.') ct_filter |= Q(app_label=app_label, model=model) except ValueError: pass # Get ContentType instances content_types = ContentType.objects.filter(ct_filter) return queryset.filter( extras_taggeditem_items__content_type__in=content_types).distinct( ) def _content_type_id(self, queryset, name, values): # Get ContentType instances content_types = ContentType.objects.filter(pk__in=values) return queryset.filter( extras_taggeditem_items__content_type__in=content_types).distinct( )
class InterfaceFilterSet(BaseFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet, PathEndpointFilterSet): q = django_filters.CharFilter( method='search', label='Search', ) # Override device and device_id filters from DeviceComponentFilterSet to match against any peer virtual chassis # members device = MultiValueCharFilter( method='filter_device', field_name='name', label='Device', ) device_id = MultiValueNumberFilter( method='filter_device_id', field_name='pk', label='Device (ID)', ) kind = django_filters.CharFilter( method='filter_kind', label='Kind of interface', ) parent_id = django_filters.ModelMultipleChoiceFilter( field_name='parent', queryset=Interface.objects.all(), label='Parent interface (ID)', ) lag_id = django_filters.ModelMultipleChoiceFilter( field_name='lag', queryset=Interface.objects.all(), label='LAG interface (ID)', ) mac_address = MultiValueMACAddressFilter() tag = TagFilter() vlan_id = django_filters.CharFilter(method='filter_vlan_id', label='Assigned VLAN') vlan = django_filters.CharFilter(method='filter_vlan', label='Assigned VID') type = django_filters.MultipleChoiceFilter(choices=InterfaceTypeChoices, null_value=None) class Meta: model = Interface fields = [ 'id', 'name', 'label', 'type', 'enabled', 'mtu', 'mgmt_only', 'mode', 'description' ] def filter_device(self, queryset, name, value): try: devices = Device.objects.filter(**{'{}__in'.format(name): value}) vc_interface_ids = [] for device in devices: vc_interface_ids.extend(device.vc_interfaces().values_list( 'id', flat=True)) return queryset.filter(pk__in=vc_interface_ids) except Device.DoesNotExist: return queryset.none() def filter_device_id(self, queryset, name, id_list): # Include interfaces belonging to peer virtual chassis members vc_interface_ids = [] try: devices = Device.objects.filter(pk__in=id_list) for device in devices: vc_interface_ids += device.vc_interfaces().values_list( 'id', flat=True) return queryset.filter(pk__in=vc_interface_ids) except Device.DoesNotExist: return queryset.none() def filter_vlan_id(self, queryset, name, value): value = value.strip() if not value: return queryset return queryset.filter( Q(untagged_vlan_id=value) | Q(tagged_vlans=value)) def filter_vlan(self, queryset, name, value): value = value.strip() if not value: return queryset return queryset.filter( Q(untagged_vlan_id__vid=value) | Q(tagged_vlans__vid=value)) def filter_kind(self, queryset, name, value): value = value.strip().lower() return { 'physical': queryset.exclude(type__in=NONCONNECTABLE_IFACE_TYPES), 'virtual': queryset.filter(type__in=VIRTUAL_IFACE_TYPES), 'wireless': queryset.filter(type__in=WIRELESS_IFACE_TYPES), }.get(value, queryset.none())
class IPAddressFilterSet(BaseFilterSet, TenancyFilterSet, CustomFieldModelFilterSet, CreatedUpdatedFilterSet): q = django_filters.CharFilter( method='search', label='Search', ) family = django_filters.NumberFilter( field_name='address', lookup_expr='family' ) parent = django_filters.CharFilter( method='search_by_parent', label='Parent prefix', ) address = MultiValueCharFilter( method='filter_address', label='Address', ) mask_length = django_filters.NumberFilter( method='filter_mask_length', label='Mask length', ) vrf_id = django_filters.ModelMultipleChoiceFilter( queryset=VRF.objects.all(), label='VRF', ) vrf = django_filters.ModelMultipleChoiceFilter( field_name='vrf__rd', queryset=VRF.objects.all(), to_field_name='rd', label='VRF (RD)', ) present_in_vrf_id = django_filters.ModelChoiceFilter( queryset=VRF.objects.all(), method='filter_present_in_vrf', label='VRF' ) present_in_vrf = django_filters.ModelChoiceFilter( queryset=VRF.objects.all(), method='filter_present_in_vrf', to_field_name='rd', label='VRF (RD)', ) device = MultiValueCharFilter( method='filter_device', field_name='name', label='Device (name)', ) device_id = MultiValueNumberFilter( method='filter_device', field_name='pk', label='Device (ID)', ) virtual_machine = MultiValueCharFilter( method='filter_virtual_machine', field_name='name', label='Virtual machine (name)', ) virtual_machine_id = MultiValueNumberFilter( method='filter_virtual_machine', field_name='pk', label='Virtual machine (ID)', ) interface = django_filters.ModelMultipleChoiceFilter( field_name='interface__name', queryset=Interface.objects.all(), to_field_name='name', label='Interface (name)', ) interface_id = django_filters.ModelMultipleChoiceFilter( field_name='interface', queryset=Interface.objects.all(), label='Interface (ID)', ) vminterface = django_filters.ModelMultipleChoiceFilter( field_name='vminterface__name', queryset=VMInterface.objects.all(), to_field_name='name', label='VM interface (name)', ) vminterface_id = django_filters.ModelMultipleChoiceFilter( field_name='vminterface', queryset=VMInterface.objects.all(), label='VM interface (ID)', ) assigned_to_interface = django_filters.BooleanFilter( method='_assigned_to_interface', label='Is assigned to an interface', ) status = django_filters.MultipleChoiceFilter( choices=IPAddressStatusChoices, null_value=None ) role = django_filters.MultipleChoiceFilter( choices=IPAddressRoleChoices ) tag = TagFilter() class Meta: model = IPAddress fields = ['id', 'dns_name'] def search(self, queryset, name, value): if not value.strip(): return queryset qs_filter = ( Q(dns_name__icontains=value) | Q(description__icontains=value) | Q(address__istartswith=value) ) return queryset.filter(qs_filter) def search_by_parent(self, queryset, name, value): value = value.strip() if not value: return queryset try: query = str(netaddr.IPNetwork(value.strip()).cidr) return queryset.filter(address__net_host_contained=query) except (AddrFormatError, ValueError): return queryset.none() def filter_address(self, queryset, name, value): try: return queryset.filter(address__net_in=value) except ValidationError: return queryset.none() def filter_mask_length(self, queryset, name, value): if not value: return queryset return queryset.filter(address__net_mask_length=value) def filter_present_in_vrf(self, queryset, name, vrf): if vrf is None: return queryset.none return queryset.filter( Q(vrf=vrf) | Q(vrf__export_targets__in=vrf.import_targets.all()) ) def filter_device(self, queryset, name, value): devices = Device.objects.filter(**{'{}__in'.format(name): value}) if not devices.exists(): return queryset.none() interface_ids = [] for device in devices: interface_ids.extend(device.vc_interfaces.values_list('id', flat=True)) return queryset.filter( interface__in=interface_ids ) def filter_virtual_machine(self, queryset, name, value): virtual_machines = VirtualMachine.objects.filter(**{'{}__in'.format(name): value}) if not virtual_machines.exists(): return queryset.none() interface_ids = [] for vm in virtual_machines: interface_ids.extend(vm.interfaces.values_list('id', flat=True)) return queryset.filter( vminterface__in=interface_ids ) def _assigned_to_interface(self, queryset, name, value): return queryset.exclude(assigned_object_id__isnull=value)
class InterfaceFilter(django_filters.FilterSet): """ Not using DeviceComponentFilterSet for Interfaces because we need to check for VirtualChassis membership. """ q = django_filters.CharFilter( method='search', label='Search', ) device = django_filters.CharFilter( method='filter_device', field_name='name', label='Device', ) device_id = MultiValueNumberFilter( method='filter_device_id', field_name='pk', label='Device (ID)', ) cabled = django_filters.BooleanFilter( field_name='cable', lookup_expr='isnull', exclude=True ) kind = django_filters.CharFilter( method='filter_kind', label='Kind of interface', ) lag_id = django_filters.ModelMultipleChoiceFilter( field_name='lag', queryset=Interface.objects.all(), label='LAG interface (ID)', ) mac_address = MultiValueMACAddressFilter() tag = TagFilter() vlan_id = django_filters.CharFilter( method='filter_vlan_id', label='Assigned VLAN' ) vlan = django_filters.CharFilter( method='filter_vlan', label='Assigned VID' ) type = django_filters.MultipleChoiceFilter( choices=IFACE_TYPE_CHOICES, null_value=None ) class Meta: model = Interface fields = ['id', 'name', 'connection_status', 'type', 'enabled', 'mtu', 'mgmt_only', 'mode', 'description'] def search(self, queryset, name, value): if not value.strip(): return queryset return queryset.filter( Q(name__icontains=value) | Q(description__icontains=value) ).distinct() def filter_device(self, queryset, name, value): try: device = Device.objects.get(**{name: value}) vc_interface_ids = device.vc_interfaces.values_list('id', flat=True) return queryset.filter(pk__in=vc_interface_ids) except Device.DoesNotExist: return queryset.none() def filter_device_id(self, queryset, name, id_list): # Include interfaces belonging to peer virtual chassis members vc_interface_ids = [] try: devices = Device.objects.filter(pk__in=id_list) for device in devices: vc_interface_ids += device.vc_interfaces.values_list('id', flat=True) return queryset.filter(pk__in=vc_interface_ids) except Device.DoesNotExist: return queryset.none() def filter_vlan_id(self, queryset, name, value): value = value.strip() if not value: return queryset return queryset.filter( Q(untagged_vlan_id=value) | Q(tagged_vlans=value) ) def filter_vlan(self, queryset, name, value): value = value.strip() if not value: return queryset return queryset.filter( Q(untagged_vlan_id__vid=value) | Q(tagged_vlans__vid=value) ) def filter_kind(self, queryset, name, value): value = value.strip().lower() return { 'physical': queryset.exclude(type__in=NONCONNECTABLE_IFACE_TYPES), 'virtual': queryset.filter(type__in=VIRTUAL_IFACE_TYPES), 'wireless': queryset.filter(type__in=WIRELESS_IFACE_TYPES), }.get(value, queryset.none())
class IPAddressFilterSet(BaseFilterSet, TenancyFilterSet, CustomFieldFilterSet, CreatedUpdatedFilterSet): id__in = NumericInFilter(field_name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', ) parent = django_filters.CharFilter( method='search_by_parent', label='Parent prefix', ) address = MultiValueCharFilter( method='filter_address', label='Address', ) mask_length = django_filters.NumberFilter( method='filter_mask_length', label='Mask length', ) vrf_id = django_filters.ModelMultipleChoiceFilter( queryset=VRF.objects.all(), label='VRF', ) vrf = django_filters.ModelMultipleChoiceFilter( field_name='vrf__rd', queryset=VRF.objects.all(), to_field_name='rd', label='VRF (RD)', ) device = MultiValueCharFilter( method='filter_device', field_name='name', label='Device (name)', ) device_id = MultiValueNumberFilter( method='filter_device', field_name='pk', label='Device (ID)', ) virtual_machine_id = django_filters.ModelMultipleChoiceFilter( field_name='interface__virtual_machine', queryset=VirtualMachine.objects.all(), label='Virtual machine (ID)', ) virtual_machine = django_filters.ModelMultipleChoiceFilter( field_name='interface__virtual_machine__name', queryset=VirtualMachine.objects.all(), to_field_name='name', label='Virtual machine (name)', ) interface = django_filters.ModelMultipleChoiceFilter( field_name='interface__name', queryset=Interface.objects.all(), to_field_name='name', label='Interface (ID)', ) interface_id = django_filters.ModelMultipleChoiceFilter( queryset=Interface.objects.all(), label='Interface (ID)', ) assigned_to_interface = django_filters.BooleanFilter( method='_assigned_to_interface', label='Is assigned to an interface', ) status = django_filters.MultipleChoiceFilter( choices=IPAddressStatusChoices, null_value=None) role = django_filters.MultipleChoiceFilter(choices=IPAddressRoleChoices) tag = TagFilter() class Meta: model = IPAddress fields = ['family', 'dns_name'] def search(self, queryset, name, value): if not value.strip(): return queryset qs_filter = (Q(dns_name__icontains=value) | Q(description__icontains=value) | Q(address__istartswith=value)) return queryset.filter(qs_filter) def search_by_parent(self, queryset, name, value): value = value.strip() if not value: return queryset try: query = str(netaddr.IPNetwork(value.strip()).cidr) return queryset.filter(address__net_host_contained=query) except (AddrFormatError, ValueError): return queryset.none() def filter_address(self, queryset, name, value): try: return queryset.filter(address__net_in=value) except ValidationError: return queryset.none() def filter_mask_length(self, queryset, name, value): if not value: return queryset return queryset.filter(address__net_mask_length=value) def filter_device(self, queryset, name, value): try: devices = Device.objects.prefetch_related('device_type').filter( **{'{}__in'.format(name): value}) vc_interface_ids = [] for device in devices: vc_interface_ids.extend( [i['id'] for i in device.vc_interfaces.values('id')]) return queryset.filter(interface_id__in=vc_interface_ids) except Device.DoesNotExist: return queryset.none() def _assigned_to_interface(self, queryset, name, value): return queryset.exclude(interface__isnull=value)
class PrefixFilterSet(PrimaryModelFilterSet, TenancyFilterSet): q = django_filters.CharFilter( method='search', label='Search', ) family = django_filters.NumberFilter(field_name='prefix', lookup_expr='family') prefix = MultiValueCharFilter( method='filter_prefix', label='Prefix', ) within = django_filters.CharFilter( method='search_within', label='Within prefix', ) within_include = django_filters.CharFilter( method='search_within_include', label='Within and including prefix', ) contains = django_filters.CharFilter( method='search_contains', label='Prefixes which contain this prefix or IP', ) depth = MultiValueNumberFilter(field_name='_depth') children = MultiValueNumberFilter(field_name='_children') mask_length = django_filters.NumberFilter(field_name='prefix', lookup_expr='net_mask_length') mask_length__gte = django_filters.NumberFilter( field_name='prefix', lookup_expr='net_mask_length__gte') mask_length__lte = django_filters.NumberFilter( field_name='prefix', lookup_expr='net_mask_length__lte') vrf_id = django_filters.ModelMultipleChoiceFilter( queryset=VRF.objects.all(), label='VRF', ) vrf = django_filters.ModelMultipleChoiceFilter( field_name='vrf__rd', queryset=VRF.objects.all(), to_field_name='rd', label='VRF (RD)', ) present_in_vrf_id = django_filters.ModelChoiceFilter( queryset=VRF.objects.all(), method='filter_present_in_vrf', label='VRF') present_in_vrf = django_filters.ModelChoiceFilter( queryset=VRF.objects.all(), method='filter_present_in_vrf', to_field_name='rd', label='VRF (RD)', ) region_id = TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), field_name='site__region', lookup_expr='in', label='Region (ID)', ) region = TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), field_name='site__region', lookup_expr='in', to_field_name='slug', label='Region (slug)', ) site_group_id = TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='site__group', lookup_expr='in', label='Site group (ID)', ) site_group = TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='site__group', lookup_expr='in', to_field_name='slug', label='Site group (slug)', ) site_id = django_filters.ModelMultipleChoiceFilter( queryset=Site.objects.all(), label='Site (ID)', ) site = django_filters.ModelMultipleChoiceFilter( field_name='site__slug', queryset=Site.objects.all(), to_field_name='slug', label='Site (slug)', ) vlan_id = django_filters.ModelMultipleChoiceFilter( queryset=VLAN.objects.all(), label='VLAN (ID)', ) vlan_vid = django_filters.NumberFilter( field_name='vlan__vid', label='VLAN number (1-4095)', ) role_id = django_filters.ModelMultipleChoiceFilter( queryset=Role.objects.all(), label='Role (ID)', ) role = django_filters.ModelMultipleChoiceFilter( field_name='role__slug', queryset=Role.objects.all(), to_field_name='slug', label='Role (slug)', ) status = django_filters.MultipleChoiceFilter(choices=PrefixStatusChoices, null_value=None) tag = TagFilter() class Meta: model = Prefix fields = ['id', 'is_pool'] def search(self, queryset, name, value): if not value.strip(): return queryset qs_filter = Q(description__icontains=value) try: prefix = str(netaddr.IPNetwork(value.strip()).cidr) qs_filter |= Q(prefix__net_contains_or_equals=prefix) except (AddrFormatError, ValueError): pass return queryset.filter(qs_filter) def filter_prefix(self, queryset, name, value): query_values = [] for v in value: try: query_values.append(netaddr.IPNetwork(v)) except (AddrFormatError, ValueError): pass return queryset.filter(prefix__in=query_values) def search_within(self, queryset, name, value): value = value.strip() if not value: return queryset try: query = str(netaddr.IPNetwork(value).cidr) return queryset.filter(prefix__net_contained=query) except (AddrFormatError, ValueError): return queryset.none() def search_within_include(self, queryset, name, value): value = value.strip() if not value: return queryset try: query = str(netaddr.IPNetwork(value).cidr) return queryset.filter(prefix__net_contained_or_equal=query) except (AddrFormatError, ValueError): return queryset.none() def search_contains(self, queryset, name, value): value = value.strip() if not value: return queryset try: # Searching by prefix if '/' in value: return queryset.filter(prefix__net_contains_or_equals=str( netaddr.IPNetwork(value).cidr)) # Searching by IP address else: return queryset.filter( prefix__net_contains=str(netaddr.IPAddress(value))) except (AddrFormatError, ValueError): return queryset.none() def filter_present_in_vrf(self, queryset, name, vrf): if vrf is None: return queryset.none return queryset.filter( Q(vrf=vrf) | Q(vrf__export_targets__in=vrf.import_targets.all()))