From 0827198cad4c358e3b32b463df72f660df459cea Mon Sep 17 00:00:00 2001 From: Marcus Weiner Date: Sun, 3 Aug 2025 15:19:58 +0200 Subject: [PATCH 1/3] Implement contains filter for IPAM prefixes --- netbox/ipam/graphql/filters.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/netbox/ipam/graphql/filters.py b/netbox/ipam/graphql/filters.py index c66b8d483..b7eedf1a6 100644 --- a/netbox/ipam/graphql/filters.py +++ b/netbox/ipam/graphql/filters.py @@ -238,6 +238,15 @@ class PrefixFilter(ContactFilterMixin, ScopedFilterMixin, TenancyFilterMixin, Pr is_pool: FilterLookup[bool] | None = strawberry_django.filter_field() mark_utilized: FilterLookup[bool] | None = strawberry_django.filter_field() + @strawberry_django.filter_field() + def contains(self, value: list[str], prefix) -> Q: + if not value: + return Q() + q = Q() + for subnet in value: + query = str(netaddr.IPNetwork(subnet.strip()).cidr) + q |= Q(prefix__net_contains=query) + return q @strawberry_django.filter_type(models.RIR, lookups=True) class RIRFilter(OrganizationalModelFilterMixin): From 5d194214aa29fdf569e3920603fd23fa2ae1c28c Mon Sep 17 00:00:00 2001 From: Marcus Weiner Date: Sun, 3 Aug 2025 15:32:14 +0200 Subject: [PATCH 2/3] Implement contains filter for IPAM IP ranges --- netbox/ipam/graphql/filters.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/netbox/ipam/graphql/filters.py b/netbox/ipam/graphql/filters.py index b7eedf1a6..d4fc23ef4 100644 --- a/netbox/ipam/graphql/filters.py +++ b/netbox/ipam/graphql/filters.py @@ -222,6 +222,19 @@ class IPRangeFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilterMi return Q() return q + @strawberry_django.filter_field() + def contains(self, value: list[str], prefix) -> Q: + if not value: + return Q() + q = Q() + for subnet in value: + net = netaddr.IPNetwork(subnet.strip()) + q |= Q( + start_address__host__inet__lte=str(netaddr.IPAddress(net.first)), + end_address__host__inet__gte=str(netaddr.IPAddress(net.last)), + ) + return q + @strawberry_django.filter_type(models.Prefix, lookups=True) class PrefixFilter(ContactFilterMixin, ScopedFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin): From 4506c809d8c06e5b13d2e3fee74e3828a78a394b Mon Sep 17 00:00:00 2001 From: Marcus Weiner Date: Sun, 3 Aug 2025 15:32:55 +0200 Subject: [PATCH 3/3] Fix formatting --- netbox/ipam/graphql/filters.py | 1 + 1 file changed, 1 insertion(+) diff --git a/netbox/ipam/graphql/filters.py b/netbox/ipam/graphql/filters.py index d4fc23ef4..35ddd47e4 100644 --- a/netbox/ipam/graphql/filters.py +++ b/netbox/ipam/graphql/filters.py @@ -261,6 +261,7 @@ class PrefixFilter(ContactFilterMixin, ScopedFilterMixin, TenancyFilterMixin, Pr q |= Q(prefix__net_contains=query) return q + @strawberry_django.filter_type(models.RIR, lookups=True) class RIRFilter(OrganizationalModelFilterMixin): is_private: FilterLookup[bool] | None = strawberry_django.filter_field()