Closes #7598: Enable custom field filtering for GraphQL (#18701)

This commit is contained in:
Jeremy Stretch
2025-03-07 13:49:06 -05:00
committed by GitHub
parent bbf4eea76c
commit c35f5f829a
47 changed files with 3041 additions and 681 deletions

View File

@@ -0,0 +1,17 @@
import strawberry
from wireless.choices import *
__all__ = (
'WirelessAuthCipherEnum',
'WirelessAuthTypeEnum',
'WirelessChannelEnum',
'WirelessLANStatusEnum',
'WirelessRoleEnum',
)
WirelessAuthCipherEnum = strawberry.enum(WirelessAuthCipherChoices.as_enum())
WirelessAuthTypeEnum = strawberry.enum(WirelessAuthTypeChoices.as_enum())
WirelessChannelEnum = strawberry.enum(WirelessChannelChoices.as_enum())
WirelessLANStatusEnum = strawberry.enum(WirelessLANStatusChoices.as_enum())
WirelessRoleEnum = strawberry.enum(WirelessRoleChoices.as_enum())

View File

@@ -0,0 +1,26 @@
from dataclasses import dataclass
from typing import Annotated, TYPE_CHECKING
import strawberry
import strawberry_django
from strawberry_django import FilterLookup
from core.graphql.filter_mixins import BaseFilterMixin
if TYPE_CHECKING:
from .enums import *
__all__ = (
'WirelessAuthenticationBaseFilterMixin',
)
@dataclass
class WirelessAuthenticationBaseFilterMixin(BaseFilterMixin):
auth_type: Annotated['WirelessAuthTypeEnum', strawberry.lazy('wireless.graphql.enums')] | None = (
strawberry_django.filter_field()
)
auth_cipher: Annotated['WirelessAuthCipherEnum', strawberry.lazy('wireless.graphql.enums')] | None = (
strawberry_django.filter_field()
)
auth_psk: FilterLookup[str] | None = strawberry_django.filter_field()

View File

@@ -1,7 +1,20 @@
import strawberry_django
from typing import Annotated, TYPE_CHECKING
from netbox.graphql.filter_mixins import autotype_decorator, BaseFilterMixin
from wireless import filtersets, models
import strawberry
import strawberry_django
from strawberry.scalars import ID
from strawberry_django import FilterLookup
from dcim.graphql.filter_mixins import ScopedFilterMixin
from netbox.graphql.filter_mixins import DistanceFilterMixin, PrimaryModelFilterMixin, NestedGroupModelFilterMixin
from tenancy.graphql.filter_mixins import TenancyFilterMixin
from wireless import models
from .filter_mixins import WirelessAuthenticationBaseFilterMixin
if TYPE_CHECKING:
from dcim.graphql.filters import InterfaceFilter
from ipam.graphql.filters import VLANFilter
from .enums import *
__all__ = (
'WirelessLANGroupFilter',
@@ -11,18 +24,45 @@ __all__ = (
@strawberry_django.filter(models.WirelessLANGroup, lookups=True)
@autotype_decorator(filtersets.WirelessLANGroupFilterSet)
class WirelessLANGroupFilter(BaseFilterMixin):
class WirelessLANGroupFilter(NestedGroupModelFilterMixin):
pass
@strawberry_django.filter(models.WirelessLAN, lookups=True)
@autotype_decorator(filtersets.WirelessLANFilterSet)
class WirelessLANFilter(BaseFilterMixin):
pass
class WirelessLANFilter(
WirelessAuthenticationBaseFilterMixin,
ScopedFilterMixin,
TenancyFilterMixin,
PrimaryModelFilterMixin
):
ssid: FilterLookup[str] | None = strawberry_django.filter_field()
status: Annotated['WirelessLANStatusEnum', strawberry.lazy('wireless.graphql.enums')] | None = (
strawberry_django.filter_field()
)
group: Annotated['WirelessLANGroupFilter', strawberry.lazy('wireless.graphql.filters')] | None = (
strawberry_django.filter_field()
)
group_id: ID | None = strawberry_django.filter_field()
vlan: Annotated['VLANFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
vlan_id: ID | None = strawberry_django.filter_field()
@strawberry_django.filter(models.WirelessLink, lookups=True)
@autotype_decorator(filtersets.WirelessLinkFilterSet)
class WirelessLinkFilter(BaseFilterMixin):
pass
class WirelessLinkFilter(
WirelessAuthenticationBaseFilterMixin,
DistanceFilterMixin,
TenancyFilterMixin,
PrimaryModelFilterMixin
):
interface_a: Annotated['InterfaceFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
strawberry_django.filter_field()
)
interface_a_id: ID | None = strawberry_django.filter_field()
interface_b: Annotated['InterfaceFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
strawberry_django.filter_field()
)
interface_b_id: ID | None = strawberry_django.filter_field()
ssid: FilterLookup[str] | None = strawberry_django.filter_field()
status: Annotated['WirelessLANStatusEnum', strawberry.lazy('wireless.graphql.enums')] | None = (
strawberry_django.filter_field()
)

View File

@@ -1,4 +1,4 @@
from typing import Annotated, List, Union
from typing import Annotated, List, TYPE_CHECKING, Union
import strawberry
import strawberry_django
@@ -7,6 +7,11 @@ from netbox.graphql.types import OrganizationalObjectType, NetBoxObjectType
from wireless import models
from .filters import *
if TYPE_CHECKING:
from dcim.graphql.types import DeviceType, InterfaceType, LocationType, RegionType, SiteGroupType, SiteType
from ipam.graphql.types import VLANType
from tenancy.graphql.types import TenantType
__all__ = (
'WirelessLANType',
'WirelessLANGroupType',
@@ -28,7 +33,7 @@ class WirelessLANGroupType(OrganizationalObjectType):
@strawberry_django.type(
models.WirelessLAN,
exclude=('scope_type', 'scope_id', '_location', '_region', '_site', '_site_group'),
exclude=['scope_type', 'scope_id', '_location', '_region', '_site', '_site_group'],
filters=WirelessLANFilter
)
class WirelessLANType(NetBoxObjectType):