Coverage for netbox/graphql/filters.py: 95%

36 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-10 18:35 +0000

1from dataclasses import dataclass 

2from typing import TYPE_CHECKING 

3 

4import strawberry_django 

5from strawberry import ID 

6from strawberry_django import ComparisonFilterLookup, StrFilterLookup 

7 

8from core.graphql.filter_mixins import ChangeLoggingMixin 

9from extras.graphql.filter_mixins import CustomFieldsFilterMixin, JournalEntriesFilterMixin, TagsFilterMixin 

10from netbox.graphql.utils import register_model_graphql_type 

11 

12if TYPE_CHECKING: 12 ↛ 13line 12 didn't jump to line 13 because the condition on line 12 was never true

13 from .filters import * 

14 

15__all__ = ( 

16 'BaseModelFilter', 

17 'ChangeLoggedModelFilter', 

18 'NestedGroupModelFilter', 

19 'NetBoxModelFilter', 

20 'OrganizationalModelFilter', 

21 'PrimaryModelFilter', 

22 'register_filter', 

23) 

24 

25 

26def register_filter(model, **kwargs): 

27 """ 

28 Drop-in replacement for `strawberry_django.filter_type()` for model-bound NetBox GraphQL filters. Before 

29 delegating to `strawberry_django.filter_type()`, any plugin-registered filter mixins for the given model are 

30 spliced into the decorated class's bases. With no extensions registered this is an exact pass-through, leaving 

31 schema output unchanged. See `register_model_graphql_type` for the registry-timing contract. 

32 """ 

33 return register_model_graphql_type(model, strawberry_django.filter_type, 'graphql_filter_extensions', **kwargs) 

34 

35 

36@dataclass 

37class BaseModelFilter: 

38 id: ComparisonFilterLookup[ID] | None = strawberry_django.filter_field() 

39 

40 

41class ChangeLoggedModelFilter(ChangeLoggingMixin, BaseModelFilter): 

42 pass 

43 

44 

45class NetBoxModelFilter( 

46 CustomFieldsFilterMixin, 

47 JournalEntriesFilterMixin, 

48 TagsFilterMixin, 

49 ChangeLoggingMixin, 

50 BaseModelFilter 

51): 

52 pass 

53 

54 

55@dataclass 

56class NestedGroupModelFilter(NetBoxModelFilter): 

57 name: StrFilterLookup | None = strawberry_django.filter_field() 

58 slug: StrFilterLookup | None = strawberry_django.filter_field() 

59 description: StrFilterLookup | None = strawberry_django.filter_field() 

60 parent_id: ID | None = strawberry_django.filter_field() 

61 

62 

63@dataclass 

64class OrganizationalModelFilter(NetBoxModelFilter): 

65 name: StrFilterLookup | None = strawberry_django.filter_field() 

66 slug: StrFilterLookup | None = strawberry_django.filter_field() 

67 description: StrFilterLookup | None = strawberry_django.filter_field() 

68 comments: StrFilterLookup | None = strawberry_django.filter_field() 

69 

70 

71@dataclass 

72class PrimaryModelFilter(NetBoxModelFilter): 

73 description: StrFilterLookup | None = strawberry_django.filter_field() 

74 comments: StrFilterLookup | None = strawberry_django.filter_field()