Skip to content

Commit c48e4f5

Browse files
authored
Fixes #19640: restores device/vm FHRPGroupAssignment graphql filters (#19712)
* Fixes #19640: restores device/vm FHRPGroupAssignment graphql filters * Add docstring for device_filter helper function
1 parent aee83a4 commit c48e4f5

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

netbox/ipam/graphql/filters.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@
1111

1212
from core.graphql.filter_mixins import BaseObjectTypeFilterMixin, ChangeLogFilterMixin
1313
from dcim.graphql.filter_mixins import ScopedFilterMixin
14+
from dcim.models import Device
1415
from ipam import models
1516
from ipam.graphql.filter_mixins import ServiceBaseFilterMixin
1617
from netbox.graphql.filter_mixins import NetBoxModelFilterMixin, OrganizationalModelFilterMixin, PrimaryModelFilterMixin
1718
from tenancy.graphql.filter_mixins import ContactFilterMixin, TenancyFilterMixin
19+
from virtualization.models import VMInterface
1820

1921
if TYPE_CHECKING:
2022
from netbox.graphql.filter_lookups import IntegerArrayLookup, IntegerLookup
@@ -116,6 +118,30 @@ class FHRPGroupAssignmentFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin)
116118
strawberry_django.filter_field()
117119
)
118120

121+
@strawberry_django.filter_field()
122+
def device_id(self, queryset, value: list[str], prefix) -> Q:
123+
return self.filter_device('id', value)
124+
125+
@strawberry_django.filter_field()
126+
def device(self, value: list[str], prefix) -> Q:
127+
return self.filter_device('name', value)
128+
129+
@strawberry_django.filter_field()
130+
def virtual_machine_id(self, value: list[str], prefix) -> Q:
131+
return Q(interface_id__in=VMInterface.objects.filter(virtual_machine_id__in=value))
132+
133+
@strawberry_django.filter_field()
134+
def virtual_machine(self, value: list[str], prefix) -> Q:
135+
return Q(interface_id__in=VMInterface.objects.filter(virtual_machine__name__in=value))
136+
137+
def filter_device(self, field, value) -> Q:
138+
"""Helper to standardize logic for device and device_id filters"""
139+
devices = Device.objects.filter(**{f'{field}__in': value})
140+
interface_ids = []
141+
for device in devices:
142+
interface_ids.extend(device.vc_interfaces().values_list('id', flat=True))
143+
return Q(interface_id__in=interface_ids)
144+
119145

120146
@strawberry_django.filter_type(models.IPAddress, lookups=True)
121147
class IPAddressFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):

0 commit comments

Comments
 (0)