|
11 | 11 |
|
12 | 12 | from core.graphql.filter_mixins import BaseObjectTypeFilterMixin, ChangeLogFilterMixin |
13 | 13 | from dcim.graphql.filter_mixins import ScopedFilterMixin |
| 14 | +from dcim.models import Device |
14 | 15 | from ipam import models |
15 | 16 | from ipam.graphql.filter_mixins import ServiceBaseFilterMixin |
16 | 17 | from netbox.graphql.filter_mixins import NetBoxModelFilterMixin, OrganizationalModelFilterMixin, PrimaryModelFilterMixin |
17 | 18 | from tenancy.graphql.filter_mixins import ContactFilterMixin, TenancyFilterMixin |
| 19 | +from virtualization.models import VMInterface |
18 | 20 |
|
19 | 21 | if TYPE_CHECKING: |
20 | 22 | from netbox.graphql.filter_lookups import IntegerArrayLookup, IntegerLookup |
@@ -116,6 +118,30 @@ class FHRPGroupAssignmentFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin) |
116 | 118 | strawberry_django.filter_field() |
117 | 119 | ) |
118 | 120 |
|
| 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 | + |
119 | 145 |
|
120 | 146 | @strawberry_django.filter_type(models.IPAddress, lookups=True) |
121 | 147 | class IPAddressFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin): |
|
0 commit comments