class VMInterfaceFilterSet(BaseFilterSet, CustomFieldModelFilterSet): q = SearchFilter(filter_predicates={"name": "icontains"}) cluster_id = django_filters.ModelMultipleChoiceFilter( field_name="virtual_machine__cluster", queryset=Cluster.objects.all(), label="Cluster (ID)", ) cluster = django_filters.ModelMultipleChoiceFilter( field_name="virtual_machine__cluster__name", queryset=Cluster.objects.all(), to_field_name="name", label="Cluster", ) virtual_machine_id = django_filters.ModelMultipleChoiceFilter( field_name="virtual_machine", queryset=VirtualMachine.objects.all(), label="Virtual machine (ID)", ) virtual_machine = django_filters.ModelMultipleChoiceFilter( field_name="virtual_machine__name", queryset=VirtualMachine.objects.all(), to_field_name="name", label="Virtual machine", ) mac_address = MultiValueMACAddressFilter(label="MAC address", ) tag = TagFilter() class Meta: model = VMInterface fields = ["id", "name", "enabled", "mtu"]
class VMInterfaceFilterSet(BaseFilterSet, CustomFieldModelFilterSet): q = django_filters.CharFilter( method="search", label="Search", ) cluster_id = django_filters.ModelMultipleChoiceFilter( field_name="virtual_machine__cluster", queryset=Cluster.objects.all(), label="Cluster (ID)", ) cluster = django_filters.ModelMultipleChoiceFilter( field_name="virtual_machine__cluster__name", queryset=Cluster.objects.all(), to_field_name="name", label="Cluster", ) virtual_machine_id = django_filters.ModelMultipleChoiceFilter( field_name="virtual_machine", queryset=VirtualMachine.objects.all(), label="Virtual machine (ID)", ) virtual_machine = django_filters.ModelMultipleChoiceFilter( field_name="virtual_machine__name", queryset=VirtualMachine.objects.all(), to_field_name="name", label="Virtual machine", ) mac_address = MultiValueMACAddressFilter( label="MAC address", ) tag = TagFilter() class Meta: model = VMInterface fields = ["id", "name", "enabled", "mtu"] def search(self, queryset, name, value): if not value.strip(): return queryset return queryset.filter(Q(name__icontains=value))
class InterfaceFilterSet( BaseFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet, PathEndpointFilterSet, ): # 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 (name)", ) device_id = MultiValueUUIDFilter( 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.NumberFilter(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 = str(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 DeviceFilterSet(NautobotFilterSet, TenancyFilterSet, LocalContextFilterSet, StatusModelFilterSetMixin): q = SearchFilter( filter_predicates={ "name": "icontains", "serial": { "lookup_expr": "icontains", "preprocessor": str.strip, }, "inventoryitems__serial": { "lookup_expr": "icontains", "preprocessor": str.strip, }, "asset_tag": { "lookup_expr": "icontains", "preprocessor": str.strip, }, "comments": "icontains", }, ) manufacturer_id = django_filters.ModelMultipleChoiceFilter( field_name="device_type__manufacturer", queryset=Manufacturer.objects.all(), label="Manufacturer (ID)", ) manufacturer = django_filters.ModelMultipleChoiceFilter( field_name="device_type__manufacturer__slug", queryset=Manufacturer.objects.all(), to_field_name="slug", label="Manufacturer (slug)", ) device_type_id = django_filters.ModelMultipleChoiceFilter( queryset=DeviceType.objects.all(), label="Device type (ID)", ) role_id = django_filters.ModelMultipleChoiceFilter( field_name="device_role_id", queryset=DeviceRole.objects.all(), label="Role (ID)", ) role = django_filters.ModelMultipleChoiceFilter( field_name="device_role__slug", queryset=DeviceRole.objects.all(), to_field_name="slug", label="Role (slug)", ) platform_id = django_filters.ModelMultipleChoiceFilter( queryset=Platform.objects.all(), label="Platform (ID)", ) platform = django_filters.ModelMultipleChoiceFilter( field_name="platform__slug", queryset=Platform.objects.all(), to_field_name="slug", label="Platform (slug)", ) 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_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 name (slug)", ) rack_group_id = TreeNodeMultipleChoiceFilter( queryset=RackGroup.objects.all(), field_name="rack__group", lookup_expr="in", label="Rack group (ID)", ) rack_id = django_filters.ModelMultipleChoiceFilter( field_name="rack", queryset=Rack.objects.all(), label="Rack (ID)", ) cluster_id = django_filters.ModelMultipleChoiceFilter( queryset=Cluster.objects.all(), label="VM cluster (ID)", ) model = django_filters.ModelMultipleChoiceFilter( field_name="device_type__slug", queryset=DeviceType.objects.all(), to_field_name="slug", label="Device model (slug)", ) is_full_depth = django_filters.BooleanFilter( field_name="device_type__is_full_depth", label="Is full depth", ) mac_address = MultiValueMACAddressFilter( field_name="interfaces__mac_address", label="MAC address", ) serial = django_filters.CharFilter(lookup_expr="iexact") has_primary_ip = django_filters.BooleanFilter( method="_has_primary_ip", label="Has a primary IP", ) secrets_group_id = django_filters.ModelMultipleChoiceFilter( field_name="secrets_group", queryset=SecretsGroup.objects.all(), label="Secrets group (ID)", ) secrets_group = django_filters.ModelMultipleChoiceFilter( field_name="secrets_group__slug", queryset=SecretsGroup.objects.all(), to_field_name="slug", label="Secrets group (slug)", ) virtual_chassis_id = django_filters.ModelMultipleChoiceFilter( field_name="virtual_chassis", queryset=VirtualChassis.objects.all(), label="Virtual chassis (ID)", ) is_virtual_chassis_member = RelatedMembershipBooleanFilter( field_name="virtual_chassis", label="Is a virtual chassis member", ) virtual_chassis_member = is_virtual_chassis_member has_console_ports = RelatedMembershipBooleanFilter( field_name="consoleports", label="Has console ports", ) console_ports = has_console_ports has_console_server_ports = RelatedMembershipBooleanFilter( field_name="consoleserverports", label="Has console server ports", ) console_server_ports = has_console_server_ports has_power_ports = RelatedMembershipBooleanFilter( field_name="powerports", label="Has power ports", ) power_ports = has_power_ports has_power_outlets = RelatedMembershipBooleanFilter( field_name="poweroutlets", label="Has power outlets", ) power_outlets = has_power_outlets has_interfaces = RelatedMembershipBooleanFilter( field_name="interfaces", label="Has interfaces", ) interfaces = has_interfaces pass_through_ports = django_filters.BooleanFilter( method="_pass_through_ports", label="Has pass-through ports", ) has_front_ports = RelatedMembershipBooleanFilter( field_name="frontports", label="Has front ports", ) has_rear_ports = RelatedMembershipBooleanFilter( field_name="rearports", label="Has rear ports", ) has_device_bays = RelatedMembershipBooleanFilter( field_name="devicebays", label="Has device bays", ) device_bays = has_device_bays tag = TagFilter() class Meta: model = Device fields = [ "id", "name", "asset_tag", "face", "position", "vc_position", "vc_priority", ] def _has_primary_ip(self, queryset, name, value): params = Q(primary_ip4__isnull=False) | Q(primary_ip6__isnull=False) if value: return queryset.filter(params) return queryset.exclude(params) # 2.0 TODO: Remove me and `pass_through_ports` in exchange for `has_(front|rear)_ports`. def _pass_through_ports(self, queryset, name, value): return queryset.exclude(frontports__isnull=value, rearports__isnull=value)
class VirtualMachineFilterSet( BaseFilterSet, LocalConfigContextFilterSet, TenancyFilterSet, StatusModelFilterSetMixin, CustomFieldModelFilterSet, CreatedUpdatedFilterSet, ): q = django_filters.CharFilter( method="search", label="Search", ) cluster_group_id = django_filters.ModelMultipleChoiceFilter( field_name="cluster__group", queryset=ClusterGroup.objects.all(), label="Cluster group (ID)", ) cluster_group = django_filters.ModelMultipleChoiceFilter( field_name="cluster__group__slug", queryset=ClusterGroup.objects.all(), to_field_name="slug", label="Cluster group (slug)", ) cluster_type_id = django_filters.ModelMultipleChoiceFilter( field_name="cluster__type", queryset=ClusterType.objects.all(), label="Cluster type (ID)", ) cluster_type = django_filters.ModelMultipleChoiceFilter( field_name="cluster__type__slug", queryset=ClusterType.objects.all(), to_field_name="slug", label="Cluster type (slug)", ) cluster_id = django_filters.ModelMultipleChoiceFilter( queryset=Cluster.objects.all(), label="Cluster (ID)", ) region_id = TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), field_name="cluster__site__region", lookup_expr="in", label="Region (ID)", ) region = TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), field_name="cluster__site__region", lookup_expr="in", to_field_name="slug", label="Region (slug)", ) site_id = django_filters.ModelMultipleChoiceFilter( field_name="cluster__site", queryset=Site.objects.all(), label="Site (ID)", ) site = django_filters.ModelMultipleChoiceFilter( field_name="cluster__site__slug", queryset=Site.objects.all(), to_field_name="slug", label="Site (slug)", ) role_id = django_filters.ModelMultipleChoiceFilter( queryset=DeviceRole.objects.all(), label="Role (ID)", ) role = django_filters.ModelMultipleChoiceFilter( field_name="role__slug", queryset=DeviceRole.objects.all(), to_field_name="slug", label="Role (slug)", ) platform_id = django_filters.ModelMultipleChoiceFilter( queryset=Platform.objects.all(), label="Platform (ID)", ) platform = django_filters.ModelMultipleChoiceFilter( field_name="platform__slug", queryset=Platform.objects.all(), to_field_name="slug", label="Platform (slug)", ) mac_address = MultiValueMACAddressFilter( field_name="interfaces__mac_address", label="MAC address", ) has_primary_ip = django_filters.BooleanFilter( method="_has_primary_ip", label="Has a primary IP", ) tag = TagFilter() class Meta: model = VirtualMachine fields = ["id", "name", "cluster", "vcpus", "memory", "disk"] def search(self, queryset, name, value): if not value.strip(): return queryset return queryset.filter( Q(name__icontains=value) | Q(comments__icontains=value)) def _has_primary_ip(self, queryset, name, value): params = Q(primary_ip4__isnull=False) | Q(primary_ip6__isnull=False) if value: return queryset.filter(params) return queryset.exclude(params)
class DeviceFilterSet( BaseFilterSet, TenancyFilterSet, LocalContextFilterSet, StatusModelFilterSetMixin, CustomFieldModelFilterSet, CreatedUpdatedFilterSet, ): q = django_filters.CharFilter( method="search", label="Search", ) manufacturer_id = django_filters.ModelMultipleChoiceFilter( field_name="device_type__manufacturer", queryset=Manufacturer.objects.all(), label="Manufacturer (ID)", ) manufacturer = django_filters.ModelMultipleChoiceFilter( field_name="device_type__manufacturer__slug", queryset=Manufacturer.objects.all(), to_field_name="slug", label="Manufacturer (slug)", ) device_type_id = django_filters.ModelMultipleChoiceFilter( queryset=DeviceType.objects.all(), label="Device type (ID)", ) role_id = django_filters.ModelMultipleChoiceFilter( field_name="device_role_id", queryset=DeviceRole.objects.all(), label="Role (ID)", ) role = django_filters.ModelMultipleChoiceFilter( field_name="device_role__slug", queryset=DeviceRole.objects.all(), to_field_name="slug", label="Role (slug)", ) platform_id = django_filters.ModelMultipleChoiceFilter( queryset=Platform.objects.all(), label="Platform (ID)", ) platform = django_filters.ModelMultipleChoiceFilter( field_name="platform__slug", queryset=Platform.objects.all(), to_field_name="slug", label="Platform (slug)", ) 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_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 name (slug)", ) rack_group_id = TreeNodeMultipleChoiceFilter( queryset=RackGroup.objects.all(), field_name="rack__group", lookup_expr="in", label="Rack group (ID)", ) rack_id = django_filters.ModelMultipleChoiceFilter( field_name="rack", queryset=Rack.objects.all(), label="Rack (ID)", ) cluster_id = django_filters.ModelMultipleChoiceFilter( queryset=Cluster.objects.all(), label="VM cluster (ID)", ) model = django_filters.ModelMultipleChoiceFilter( field_name="device_type__slug", queryset=DeviceType.objects.all(), to_field_name="slug", label="Device model (slug)", ) is_full_depth = django_filters.BooleanFilter( field_name="device_type__is_full_depth", label="Is full depth", ) mac_address = MultiValueMACAddressFilter( field_name="interfaces__mac_address", label="MAC address", ) serial = django_filters.CharFilter(lookup_expr="iexact") has_primary_ip = django_filters.BooleanFilter( method="_has_primary_ip", label="Has a primary IP", ) secrets_group_id = django_filters.ModelMultipleChoiceFilter( field_name="secrets_group", queryset=SecretsGroup.objects.all(), label="Secrets group (ID)", ) secrets_group = django_filters.ModelMultipleChoiceFilter( field_name="secrets_group__slug", queryset=SecretsGroup.objects.all(), to_field_name="slug", label="Secrets group (slug)", ) virtual_chassis_id = django_filters.ModelMultipleChoiceFilter( field_name="virtual_chassis", queryset=VirtualChassis.objects.all(), label="Virtual chassis (ID)", ) virtual_chassis_member = django_filters.BooleanFilter( method="_virtual_chassis_member", label="Is a virtual chassis member") console_ports = django_filters.BooleanFilter( method="_console_ports", label="Has console ports", ) console_server_ports = django_filters.BooleanFilter( method="_console_server_ports", label="Has console server ports", ) power_ports = django_filters.BooleanFilter( method="_power_ports", label="Has power ports", ) power_outlets = django_filters.BooleanFilter( method="_power_outlets", label="Has power outlets", ) interfaces = django_filters.BooleanFilter( method="_interfaces", label="Has interfaces", ) pass_through_ports = django_filters.BooleanFilter( method="_pass_through_ports", label="Has pass-through ports", ) device_bays = django_filters.BooleanFilter( method="_device_bays", label="Has device bays", ) tag = TagFilter() class Meta: model = Device fields = [ "id", "name", "asset_tag", "face", "position", "vc_position", "vc_priority", ] def search(self, queryset, name, value): if not value.strip(): return queryset return queryset.filter( Q(name__icontains=value) | Q(serial__icontains=value.strip()) | Q(inventoryitems__serial__icontains=value.strip()) | Q(asset_tag__icontains=value.strip()) | Q(comments__icontains=value)).distinct() def _has_primary_ip(self, queryset, name, value): params = Q(primary_ip4__isnull=False) | Q(primary_ip6__isnull=False) if value: return queryset.filter(params) return queryset.exclude(params) def _virtual_chassis_member(self, queryset, name, value): return queryset.exclude(virtual_chassis__isnull=value) def _console_ports(self, queryset, name, value): return queryset.exclude(consoleports__isnull=value) def _console_server_ports(self, queryset, name, value): return queryset.exclude(consoleserverports__isnull=value) def _power_ports(self, queryset, name, value): return queryset.exclude(powerports__isnull=value) def _power_outlets(self, queryset, name, value): return queryset.exclude(poweroutlets__isnull=value) def _interfaces(self, queryset, name, value): return queryset.exclude(interfaces__isnull=value) def _pass_through_ports(self, queryset, name, value): return queryset.exclude(frontports__isnull=value, rearports__isnull=value) def _device_bays(self, queryset, name, value): return queryset.exclude(devicebays__isnull=value)