Coverage for netbox_interface_name_rules / graphql / filters.py: 100.00%
7 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-10-16 10:13 +0000
« prev ^ index » next coverage.py v7.13.4, created at 2026-10-16 10:13 +0000
1# SPDX-License-Identifier: Apache-2.0
2# Copyright (C) 2025 Marcin Zieba <marcinpsk@gmail.com>
4"""GraphQL filter input for InterfaceNameRule.
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"""
10import strawberry
11import strawberry_django
13from netbox_interface_name_rules.models import InterfaceNameRule
15_FILTER_BASE_MODULE = "netbox.graphql.filters"
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
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
36 @strawberry_django.filter_type(InterfaceNameRule, lookups=True)
37 class InterfaceNameRuleFilter(NetBoxModelFilter):
38 """Filter input mirroring the REST filterset's fields."""
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()
56__all__ = ("InterfaceNameRuleFilter",)