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
« 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
4import strawberry_django
5from strawberry import ID
6from strawberry_django import ComparisonFilterLookup, StrFilterLookup
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
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 *
15__all__ = (
16 'BaseModelFilter',
17 'ChangeLoggedModelFilter',
18 'NestedGroupModelFilter',
19 'NetBoxModelFilter',
20 'OrganizationalModelFilter',
21 'PrimaryModelFilter',
22 'register_filter',
23)
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)
36@dataclass
37class BaseModelFilter:
38 id: ComparisonFilterLookup[ID] | None = strawberry_django.filter_field()
41class ChangeLoggedModelFilter(ChangeLoggingMixin, BaseModelFilter):
42 pass
45class NetBoxModelFilter(
46 CustomFieldsFilterMixin,
47 JournalEntriesFilterMixin,
48 TagsFilterMixin,
49 ChangeLoggingMixin,
50 BaseModelFilter
51):
52 pass
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()
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()
71@dataclass
72class PrimaryModelFilter(NetBoxModelFilter):
73 description: StrFilterLookup | None = strawberry_django.filter_field()
74 comments: StrFilterLookup | None = strawberry_django.filter_field()