From 0113b314f79cd059477c8770b7144ddd66248499 Mon Sep 17 00:00:00 2001 From: Jason Novinger Date: Mon, 16 Jun 2025 12:58:13 -0400 Subject: [PATCH 1/2] Fixes #19640: restores device/vm FHRPGroupAssignment graphql filters --- netbox/ipam/graphql/filters.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/netbox/ipam/graphql/filters.py b/netbox/ipam/graphql/filters.py index 53096af389f..887bb6ab681 100644 --- a/netbox/ipam/graphql/filters.py +++ b/netbox/ipam/graphql/filters.py @@ -11,10 +11,12 @@ from core.graphql.filter_mixins import BaseObjectTypeFilterMixin, ChangeLogFilterMixin from dcim.graphql.filter_mixins import ScopedFilterMixin +from dcim.models import Device from ipam import models from ipam.graphql.filter_mixins import ServiceBaseFilterMixin from netbox.graphql.filter_mixins import NetBoxModelFilterMixin, OrganizationalModelFilterMixin, PrimaryModelFilterMixin from tenancy.graphql.filter_mixins import ContactFilterMixin, TenancyFilterMixin +from virtualization.models import VMInterface if TYPE_CHECKING: from netbox.graphql.filter_lookups import IntegerArrayLookup, IntegerLookup @@ -116,6 +118,29 @@ class FHRPGroupAssignmentFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin) strawberry_django.filter_field() ) + @strawberry_django.filter_field() + def device_id(self, queryset, value: list[str], prefix) -> Q: + return self.filter_device('id', value) + + @strawberry_django.filter_field() + def device(self, value: list[str], prefix) -> Q: + return self.filter_device('name', value) + + @strawberry_django.filter_field() + def virtual_machine_id(self, value: list[str], prefix) -> Q: + return Q(interface_id__in=VMInterface.objects.filter(virtual_machine_id__in=value)) + + @strawberry_django.filter_field() + def virtual_machine(self, value: list[str], prefix) -> Q: + return Q(interface_id__in=VMInterface.objects.filter(virtual_machine__name__in=value)) + + def filter_device(self, field, value) -> Q: + devices = Device.objects.filter(**{f'{field}__in': value}) + interface_ids = [] + for device in devices: + interface_ids.extend(device.vc_interfaces().values_list('id', flat=True)) + return Q(interface_id__in=interface_ids) + @strawberry_django.filter_type(models.IPAddress, lookups=True) class IPAddressFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin): From b8e51bfe9d1c75e1b40de319d9b802b9be88625e Mon Sep 17 00:00:00 2001 From: Jason Novinger Date: Mon, 16 Jun 2025 13:04:36 -0400 Subject: [PATCH 2/2] Add docstring for device_filter helper function --- 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 887bb6ab681..c66b8d48392 100644 --- a/netbox/ipam/graphql/filters.py +++ b/netbox/ipam/graphql/filters.py @@ -135,6 +135,7 @@ def virtual_machine(self, value: list[str], prefix) -> Q: return Q(interface_id__in=VMInterface.objects.filter(virtual_machine__name__in=value)) def filter_device(self, field, value) -> Q: + """Helper to standardize logic for device and device_id filters""" devices = Device.objects.filter(**{f'{field}__in': value}) interface_ids = [] for device in devices: