Skip to content

Commit cc935db

Browse files
Closes #20926: Rename and clean up GraphQL filters (#20935)
1 parent 3483d97 commit cc935db

File tree

21 files changed

+267
-292
lines changed

21 files changed

+267
-292
lines changed

docs/plugins/development/migration-v4.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -325,23 +325,22 @@ class CircuitTypeType(OrganizationalObjectType):
325325

326326
### Change filters.py
327327

328-
Strawberry currently doesn't directly support django-filter, so an explicit filters.py file will need to be created. NetBox includes a new `autotype_decorator` used to automatically wrap FilterSets to reduce the required code to a minimum.
328+
Filter classes should inherit from `netbox.graphql.filters.BaseModelFilter`.
329329

330330
```python title="New"
331331
import strawberry
332332
import strawberry_django
333333
from circuits import filtersets, models
334334

335-
from netbox.graphql.filter_mixins import autotype_decorator, BaseFilterMixin
335+
from netbox.graphql.filters import BaseModelFilter
336336

337337
__all__ = (
338338
'CircuitFilter',
339339
)
340340

341341

342342
@strawberry_django.filter(models.Circuit, lookups=True)
343-
@autotype_decorator(filtersets.CircuitFilterSet)
344-
class CircuitFilter(BaseFilterMixin):
343+
class CircuitFilter(BaseModelFilter):
345344
pass
346345

347346
```

netbox/circuits/graphql/filter_mixins.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,18 @@
33

44
import strawberry
55
import strawberry_django
6-
7-
from netbox.graphql.filter_mixins import OrganizationalModelFilterMixin
6+
from strawberry_django import BaseFilterLookup
87

98
if TYPE_CHECKING:
109
from netbox.graphql.enums import ColorEnum
1110

1211
__all__ = (
13-
'BaseCircuitTypeFilterMixin',
12+
'CircuitTypeFilterMixin',
1413
)
1514

1615

1716
@dataclass
18-
class BaseCircuitTypeFilterMixin(OrganizationalModelFilterMixin):
19-
color: Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')] | None = strawberry_django.filter_field()
17+
class CircuitTypeFilterMixin:
18+
color: BaseFilterLookup[Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')]] | None = (
19+
strawberry_django.filter_field()
20+
)

netbox/circuits/graphql/filters.py

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,12 @@
77
from strawberry_django import BaseFilterLookup, FilterLookup, DateFilterLookup
88

99
from circuits import models
10-
from core.graphql.filter_mixins import BaseObjectTypeFilterMixin, ChangeLogFilterMixin
10+
from circuits.graphql.filter_mixins import CircuitTypeFilterMixin
1111
from dcim.graphql.filter_mixins import CabledObjectModelFilterMixin
1212
from extras.graphql.filter_mixins import CustomFieldsFilterMixin, TagsFilterMixin
13-
from netbox.graphql.filter_mixins import (
14-
DistanceFilterMixin,
15-
ImageAttachmentFilterMixin,
16-
OrganizationalModelFilterMixin,
17-
PrimaryModelFilterMixin,
18-
)
13+
from netbox.graphql.filter_mixins import DistanceFilterMixin, ImageAttachmentFilterMixin
14+
from netbox.graphql.filters import ChangeLoggedModelFilter, OrganizationalModelFilter, PrimaryModelFilter
1915
from tenancy.graphql.filter_mixins import ContactFilterMixin, TenancyFilterMixin
20-
from .filter_mixins import BaseCircuitTypeFilterMixin
2116

2217
if TYPE_CHECKING:
2318
from core.graphql.filters import ContentTypeFilter
@@ -43,10 +38,9 @@
4338

4439
@strawberry_django.filter_type(models.CircuitTermination, lookups=True)
4540
class CircuitTerminationFilter(
46-
BaseObjectTypeFilterMixin,
4741
CustomFieldsFilterMixin,
4842
TagsFilterMixin,
49-
ChangeLogFilterMixin,
43+
ChangeLoggedModelFilter,
5044
CabledObjectModelFilterMixin,
5145
):
5246
circuit: Annotated['CircuitFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
@@ -95,7 +89,7 @@ class CircuitFilter(
9589
ImageAttachmentFilterMixin,
9690
DistanceFilterMixin,
9791
TenancyFilterMixin,
98-
PrimaryModelFilterMixin
92+
PrimaryModelFilter
9993
):
10094
cid: FilterLookup[str] | None = strawberry_django.filter_field()
10195
provider: Annotated['ProviderFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
@@ -124,19 +118,17 @@ class CircuitFilter(
124118

125119

126120
@strawberry_django.filter_type(models.CircuitType, lookups=True)
127-
class CircuitTypeFilter(BaseCircuitTypeFilterMixin):
121+
class CircuitTypeFilter(CircuitTypeFilterMixin, OrganizationalModelFilter):
128122
pass
129123

130124

131125
@strawberry_django.filter_type(models.CircuitGroup, lookups=True)
132-
class CircuitGroupFilter(TenancyFilterMixin, OrganizationalModelFilterMixin):
126+
class CircuitGroupFilter(TenancyFilterMixin, OrganizationalModelFilter):
133127
pass
134128

135129

136130
@strawberry_django.filter_type(models.CircuitGroupAssignment, lookups=True)
137-
class CircuitGroupAssignmentFilter(
138-
BaseObjectTypeFilterMixin, CustomFieldsFilterMixin, TagsFilterMixin, ChangeLogFilterMixin
139-
):
131+
class CircuitGroupAssignmentFilter(CustomFieldsFilterMixin, TagsFilterMixin, ChangeLoggedModelFilter):
140132
member_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
141133
strawberry_django.filter_field()
142134
)
@@ -151,7 +143,7 @@ class CircuitGroupAssignmentFilter(
151143

152144

153145
@strawberry_django.filter_type(models.Provider, lookups=True)
154-
class ProviderFilter(ContactFilterMixin, PrimaryModelFilterMixin):
146+
class ProviderFilter(ContactFilterMixin, PrimaryModelFilter):
155147
name: FilterLookup[str] | None = strawberry_django.filter_field()
156148
slug: FilterLookup[str] | None = strawberry_django.filter_field()
157149
asns: Annotated['ASNFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
@@ -161,7 +153,7 @@ class ProviderFilter(ContactFilterMixin, PrimaryModelFilterMixin):
161153

162154

163155
@strawberry_django.filter_type(models.ProviderAccount, lookups=True)
164-
class ProviderAccountFilter(ContactFilterMixin, PrimaryModelFilterMixin):
156+
class ProviderAccountFilter(ContactFilterMixin, PrimaryModelFilter):
165157
provider: Annotated['ProviderFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
166158
strawberry_django.filter_field()
167159
)
@@ -171,7 +163,7 @@ class ProviderAccountFilter(ContactFilterMixin, PrimaryModelFilterMixin):
171163

172164

173165
@strawberry_django.filter_type(models.ProviderNetwork, lookups=True)
174-
class ProviderNetworkFilter(PrimaryModelFilterMixin):
166+
class ProviderNetworkFilter(PrimaryModelFilter):
175167
name: FilterLookup[str] | None = strawberry_django.filter_field()
176168
provider: Annotated['ProviderFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
177169
strawberry_django.filter_field()
@@ -181,12 +173,12 @@ class ProviderNetworkFilter(PrimaryModelFilterMixin):
181173

182174

183175
@strawberry_django.filter_type(models.VirtualCircuitType, lookups=True)
184-
class VirtualCircuitTypeFilter(BaseCircuitTypeFilterMixin):
176+
class VirtualCircuitTypeFilter(CircuitTypeFilterMixin, OrganizationalModelFilter):
185177
pass
186178

187179

188180
@strawberry_django.filter_type(models.VirtualCircuit, lookups=True)
189-
class VirtualCircuitFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
181+
class VirtualCircuitFilter(TenancyFilterMixin, PrimaryModelFilter):
190182
cid: FilterLookup[str] | None = strawberry_django.filter_field()
191183
provider_network: Annotated['ProviderNetworkFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
192184
strawberry_django.filter_field()
@@ -209,9 +201,7 @@ class VirtualCircuitFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
209201

210202

211203
@strawberry_django.filter_type(models.VirtualCircuitTermination, lookups=True)
212-
class VirtualCircuitTerminationFilter(
213-
BaseObjectTypeFilterMixin, CustomFieldsFilterMixin, TagsFilterMixin, ChangeLogFilterMixin
214-
):
204+
class VirtualCircuitTerminationFilter(CustomFieldsFilterMixin, TagsFilterMixin, ChangeLoggedModelFilter):
215205
virtual_circuit: Annotated['VirtualCircuitFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
216206
strawberry_django.filter_field()
217207
)

netbox/core/graphql/filter_mixins.py

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,18 @@
44

55
import strawberry
66
import strawberry_django
7-
from strawberry import ID
8-
from strawberry_django import FilterLookup, DatetimeFilterLookup
7+
from strawberry_django import DatetimeFilterLookup
98

109
if TYPE_CHECKING:
1110
from .filters import *
1211

1312
__all__ = (
14-
'BaseFilterMixin',
15-
'BaseObjectTypeFilterMixin',
16-
'ChangeLogFilterMixin',
13+
'ChangeLoggingMixin',
1714
)
1815

1916

20-
# @strawberry.input
21-
class BaseFilterMixin: ...
22-
23-
24-
@dataclass
25-
class BaseObjectTypeFilterMixin(BaseFilterMixin):
26-
id: FilterLookup[ID] | None = strawberry_django.filter_field()
27-
28-
2917
@dataclass
30-
class ChangeLogFilterMixin(BaseFilterMixin):
31-
id: FilterLookup[ID] | None = strawberry_django.filter_field()
18+
class ChangeLoggingMixin:
3219
# TODO: "changelog" is not a valid field name; needs to be updated for ObjectChange
3320
changelog: Annotated['ObjectChangeFilter', strawberry.lazy('core.graphql.filters')] | None = (
3421
strawberry_django.filter_field()

netbox/core/graphql/filters.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@
88
from strawberry_django import BaseFilterLookup, DatetimeFilterLookup, FilterLookup
99

1010
from core import models
11-
from core.graphql.filter_mixins import BaseFilterMixin
12-
from netbox.graphql.filter_mixins import PrimaryModelFilterMixin
11+
from netbox.graphql.filters import BaseModelFilter, PrimaryModelFilter
1312
from .enums import *
1413

1514
if TYPE_CHECKING:
@@ -25,8 +24,7 @@
2524

2625

2726
@strawberry_django.filter_type(models.DataFile, lookups=True)
28-
class DataFileFilter(BaseFilterMixin):
29-
id: FilterLookup[ID] | None = strawberry_django.filter_field()
27+
class DataFileFilter(BaseModelFilter):
3028
created: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
3129
last_updated: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
3230
source: Annotated['DataSourceFilter', strawberry.lazy('core.graphql.filters')] | None = (
@@ -41,7 +39,7 @@ class DataFileFilter(BaseFilterMixin):
4139

4240

4341
@strawberry_django.filter_type(models.DataSource, lookups=True)
44-
class DataSourceFilter(PrimaryModelFilterMixin):
42+
class DataSourceFilter(PrimaryModelFilter):
4543
name: FilterLookup[str] | None = strawberry_django.filter_field()
4644
type: FilterLookup[str] | None = strawberry_django.filter_field()
4745
source_url: FilterLookup[str] | None = strawberry_django.filter_field()
@@ -60,8 +58,7 @@ class DataSourceFilter(PrimaryModelFilterMixin):
6058

6159

6260
@strawberry_django.filter_type(models.ObjectChange, lookups=True)
63-
class ObjectChangeFilter(BaseFilterMixin):
64-
id: FilterLookup[ID] | None = strawberry_django.filter_field()
61+
class ObjectChangeFilter(BaseModelFilter):
6562
time: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
6663
user: Annotated['UserFilter', strawberry.lazy('users.graphql.filters')] | None = strawberry_django.filter_field()
6764
user_name: FilterLookup[str] | None = strawberry_django.filter_field()
@@ -88,7 +85,6 @@ class ObjectChangeFilter(BaseFilterMixin):
8885

8986

9087
@strawberry_django.filter_type(DjangoContentType, lookups=True)
91-
class ContentTypeFilter(BaseFilterMixin):
92-
id: FilterLookup[ID] | None = strawberry_django.filter_field()
88+
class ContentTypeFilter(BaseModelFilter):
9389
app_label: FilterLookup[str] | None = strawberry_django.filter_field()
9490
model: FilterLookup[str] | None = strawberry_django.filter_field()

netbox/dcim/graphql/filter_mixins.py

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66
from strawberry import ID
77
from strawberry_django import BaseFilterLookup, FilterLookup
88

9-
from core.graphql.filter_mixins import BaseFilterMixin, ChangeLogFilterMixin
109
from core.graphql.filters import ContentTypeFilter
11-
from netbox.graphql.filter_mixins import NetBoxModelFilterMixin, PrimaryModelFilterMixin, WeightFilterMixin
1210
from .enums import *
1311

1412
if TYPE_CHECKING:
@@ -22,24 +20,24 @@
2220
'ComponentModelFilterMixin',
2321
'ComponentTemplateFilterMixin',
2422
'InterfaceBaseFilterMixin',
25-
'ModularComponentModelFilterMixin',
23+
'ModularComponentFilterMixin',
2624
'ModularComponentTemplateFilterMixin',
27-
'RackBaseFilterMixin',
25+
'RackFilterMixin',
2826
'RenderConfigFilterMixin',
2927
'ScopedFilterMixin',
3028
)
3129

3230

3331
@dataclass
34-
class ScopedFilterMixin(BaseFilterMixin):
32+
class ScopedFilterMixin:
3533
scope_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
3634
strawberry_django.filter_field()
3735
)
3836
scope_id: ID | None = strawberry_django.filter_field()
3937

4038

4139
@dataclass
42-
class ComponentModelFilterMixin(NetBoxModelFilterMixin):
40+
class ComponentModelFilterMixin:
4341
device: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
4442
device_id: ID | None = strawberry_django.filter_field()
4543
name: FilterLookup[str] | None = strawberry_django.filter_field()
@@ -48,7 +46,7 @@ class ComponentModelFilterMixin(NetBoxModelFilterMixin):
4846

4947

5048
@dataclass
51-
class ModularComponentModelFilterMixin(ComponentModelFilterMixin):
49+
class ModularComponentFilterMixin(ComponentModelFilterMixin):
5250
module: Annotated['ModuleFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
5351
module_id: ID | None = strawberry_django.filter_field()
5452
inventory_items: Annotated['InventoryItemFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
@@ -57,7 +55,7 @@ class ModularComponentModelFilterMixin(ComponentModelFilterMixin):
5755

5856

5957
@dataclass
60-
class CabledObjectModelFilterMixin(BaseFilterMixin):
58+
class CabledObjectModelFilterMixin:
6159
cable: Annotated['CableFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
6260
cable_id: ID | None = strawberry_django.filter_field()
6361
cable_end: (
@@ -67,7 +65,7 @@ class CabledObjectModelFilterMixin(BaseFilterMixin):
6765

6866

6967
@dataclass
70-
class ComponentTemplateFilterMixin(ChangeLogFilterMixin):
68+
class ComponentTemplateFilterMixin:
7169
device_type: Annotated['DeviceTypeFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
7270
strawberry_django.filter_field()
7371
)
@@ -85,15 +83,15 @@ class ModularComponentTemplateFilterMixin(ComponentTemplateFilterMixin):
8583

8684

8785
@dataclass
88-
class RenderConfigFilterMixin(BaseFilterMixin):
86+
class RenderConfigFilterMixin:
8987
config_template: Annotated['ConfigTemplateFilter', strawberry.lazy('extras.graphql.filters')] | None = (
9088
strawberry_django.filter_field()
9189
)
9290
config_template_id: ID | None = strawberry_django.filter_field()
9391

9492

9593
@dataclass
96-
class InterfaceBaseFilterMixin(BaseFilterMixin):
94+
class InterfaceBaseFilterMixin:
9795
enabled: FilterLookup[bool] | None = strawberry_django.filter_field()
9896
mtu: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
9997
strawberry_django.filter_field()
@@ -124,7 +122,7 @@ class InterfaceBaseFilterMixin(BaseFilterMixin):
124122

125123

126124
@dataclass
127-
class RackBaseFilterMixin(WeightFilterMixin, PrimaryModelFilterMixin):
125+
class RackFilterMixin:
128126
width: BaseFilterLookup[Annotated['RackWidthEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
129127
strawberry_django.filter_field()
130128
)

0 commit comments

Comments
 (0)