Skip to content

Commit a611ade

Browse files
authored
Fixes #19729: GraphQL filter interfaces by kind (#20289)
1 parent 099f3b2 commit a611ade

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

netbox/dcim/graphql/enums.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
'DeviceFaceEnum',
1313
'DeviceStatusEnum',
1414
'InterfaceDuplexEnum',
15+
'InterfaceKindEnum',
1516
'InterfaceModeEnum',
1617
'InterfacePoEModeEnum',
1718
'InterfacePoETypeEnum',
@@ -48,6 +49,7 @@
4849
DeviceFaceEnum = strawberry.enum(DeviceFaceChoices.as_enum(prefix='face'))
4950
DeviceStatusEnum = strawberry.enum(DeviceStatusChoices.as_enum(prefix='status'))
5051
InterfaceDuplexEnum = strawberry.enum(InterfaceDuplexChoices.as_enum(prefix='duplex'))
52+
InterfaceKindEnum = strawberry.enum(InterfaceKindChoices.as_enum(prefix='kind'))
5153
InterfaceModeEnum = strawberry.enum(InterfaceModeChoices.as_enum(prefix='mode'))
5254
InterfacePoEModeEnum = strawberry.enum(InterfacePoEModeChoices.as_enum(prefix='mode'))
5355
InterfacePoETypeEnum = strawberry.enum(InterfacePoETypeChoices.as_enum())

netbox/dcim/graphql/filters.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
from typing import Annotated, TYPE_CHECKING
22

3+
from django.db.models import Q
34
import strawberry
45
import strawberry_django
56
from strawberry.scalars import ID
67
from strawberry_django import FilterLookup
78

89
from core.graphql.filter_mixins import ChangeLogFilterMixin
910
from dcim import models
11+
from dcim.constants import *
12+
from dcim.graphql.enums import InterfaceKindEnum
1013
from extras.graphql.filter_mixins import ConfigContextFilterMixin
1114
from netbox.graphql.filter_mixins import (
1215
PrimaryModelFilterMixin,
@@ -485,6 +488,27 @@ class InterfaceFilter(ModularComponentModelFilterMixin, InterfaceBaseFilterMixin
485488
strawberry_django.filter_field()
486489
)
487490

491+
@strawberry_django.filter_field
492+
def connected(self, queryset, value: bool, prefix: str):
493+
if value is True:
494+
return queryset, Q(**{f"{prefix}_path__is_active": True})
495+
else:
496+
return queryset, Q(**{f"{prefix}_path__isnull": True}) | Q(**{f"{prefix}_path__is_active": False})
497+
498+
@strawberry_django.filter_field
499+
def kind(
500+
self,
501+
queryset,
502+
value: Annotated['InterfaceKindEnum', strawberry.lazy('dcim.graphql.enums')],
503+
prefix: str
504+
):
505+
if value == InterfaceKindEnum.KIND_PHYSICAL:
506+
return queryset, ~Q(**{f"{prefix}type__in": NONCONNECTABLE_IFACE_TYPES})
507+
elif value == InterfaceKindEnum.KIND_VIRTUAL:
508+
return queryset, Q(**{f"{prefix}type__in": VIRTUAL_IFACE_TYPES})
509+
elif value == InterfaceKindEnum.KIND_WIRELESS:
510+
return queryset, Q(**{f"{prefix}type__in": WIRELESS_IFACE_TYPES})
511+
488512

489513
@strawberry_django.filter_type(models.InterfaceTemplate, lookups=True)
490514
class InterfaceTemplateFilter(ModularComponentTemplateFilterMixin):

0 commit comments

Comments
 (0)