1# SPDX-License-Identifier: Apache-2.0
2# Copyright (C) 2025 Marcin Zieba <marcinpsk@gmail.com>
3
4"""GraphQL filter input for InterfaceNameRule.
5
6NetBox grew a shared GraphQL filter base in 4.5; on 4.3 the filter is simply absent and
7the type is registered without one, so the plugin still exposes queries there.
8"""
9
10import strawberry
11import strawberry_django
12
13from netbox_interface_name_rules.models import InterfaceNameRule
14
15_FILTER_BASE_MODULE = "netbox.graphql.filters"
16
17try:
18 from netbox.graphql.filters import NetBoxModelFilter
19except ModuleNotFoundError as exc: # pragma: no cover — only taken on NetBox 4.3
20 # Degrade only when the module is genuinely absent (or one of its parents). Any other
21 # ImportError is a real breakage and must not masquerade as "old NetBox".
22 _missing = exc.name or ""
23 if _missing != _FILTER_BASE_MODULE and not _FILTER_BASE_MODULE.startswith(f"{_missing}."):
24 raise
25 InterfaceNameRuleFilter = None
26else: # pragma: no cover — field declarations; behaviour is covered by the GraphQL tests
27 from strawberry_django import BaseFilterLookup
28
29 # strawberry-graphql-django renamed FilterLookup to StrFilterLookup in 0.86; NetBox 4.5
30 # pins 0.75. getattr falls back only when the symbol is absent, so an ImportError raised
31 # while resolving it propagates instead of quietly selecting the legacy alias.
32 StrFilterLookup = getattr(strawberry_django, "StrFilterLookup", None)
33 if StrFilterLookup is None:
34 StrFilterLookup = strawberry_django.FilterLookup
35
36 @strawberry_django.filter_type(InterfaceNameRule, lookups=True)
37 class InterfaceNameRuleFilter(NetBoxModelFilter):
38 """Filter input mirroring the REST filterset's fields."""
39
40 module_type_id: strawberry.ID | None = strawberry_django.filter_field()
41 module_type_pattern: StrFilterLookup[str] | None = strawberry_django.filter_field()
42 module_type_is_regex: BaseFilterLookup[bool] | None = strawberry_django.filter_field()
43 parent_module_type_id: strawberry.ID | None = strawberry_django.filter_field()
44 device_type_id: strawberry.ID | None = strawberry_django.filter_field()
45 platform_id: strawberry.ID | None = strawberry_django.filter_field()
46 name_template: StrFilterLookup[str] | None = strawberry_django.filter_field()
47 parent_name_template: StrFilterLookup[str] | None = strawberry_django.filter_field()
48 breakout_mode: StrFilterLookup[str] | None = strawberry_django.filter_field()
49 channel_count: BaseFilterLookup[int] | None = strawberry_django.filter_field()
50 channel_start: BaseFilterLookup[int] | None = strawberry_django.filter_field()
51 description: StrFilterLookup[str] | None = strawberry_django.filter_field()
52 enabled: BaseFilterLookup[bool] | None = strawberry_django.filter_field()
53 applies_to_device_interfaces: BaseFilterLookup[bool] | None = strawberry_django.filter_field()
54
55
56__all__ = ("InterfaceNameRuleFilter",)