class CableFilterSet(StatusModelFilterSetMixin, BaseFilterSet): q = django_filters.CharFilter( method="search", label="Search", ) type = django_filters.MultipleChoiceFilter(choices=CableTypeChoices) 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"] 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 IPAddressFilterSet( BaseFilterSet, TenancyFilterSet, StatusModelFilterSetMixin, 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", ) 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 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", ) 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", "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())