Przeglądaj źródła

Fixes #19640: restores device/vm FHRPGroupAssignment graphql filters (#19712)

* Fixes #19640: restores device/vm FHRPGroupAssignment graphql filters

* Add docstring for device_filter helper function
Jason Novinger 7 miesięcy temu
rodzic
commit
c48e4f590e
1 zmienionych plików z 26 dodań i 0 usunięć
  1. 26 0
      netbox/ipam/graphql/filters.py

+ 26 - 0
netbox/ipam/graphql/filters.py

@@ -11,10 +11,12 @@ from strawberry_django import FilterLookup, DateFilterLookup
 
 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,30 @@ 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:
+        """Helper to standardize logic for device and device_id filters"""
+        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):