Coverage for /home/runner/work/netbox-InterfaceNameRules-plugin/netbox-InterfaceNameRules-plugin/netbox-InterfaceNameRules-plugin/netbox_interface_name_rules/graphql/filters.py: 100%

7 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-22 21:16 +0000

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",)