Skip to content

Commit 1505285

Browse files
authored
Merge pull request #20829 from netbox-community/19338-graphql-in_list-on-feature
Closes: #19338 - GraphQL: Adds in_list lookups for id and enum fields
2 parents 7cc7c7a + ae21a6a commit 1505285

File tree

20 files changed

+287
-197
lines changed

20 files changed

+287
-197
lines changed

netbox/circuits/graphql/filters.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import strawberry
55
import strawberry_django
66
from strawberry.scalars import ID
7-
from strawberry_django import FilterLookup, DateFilterLookup
7+
from strawberry_django import BaseFilterLookup, FilterLookup, DateFilterLookup
88

99
from circuits import models
1010
from core.graphql.filter_mixins import BaseObjectTypeFilterMixin, ChangeLogFilterMixin
@@ -52,7 +52,9 @@ class CircuitTerminationFilter(
5252
circuit: Annotated['CircuitFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
5353
strawberry_django.filter_field()
5454
)
55-
term_side: Annotated['CircuitTerminationSideEnum', strawberry.lazy('circuits.graphql.enums')] | None = (
55+
term_side: (
56+
BaseFilterLookup[Annotated['CircuitTerminationSideEnum', strawberry.lazy('circuits.graphql.enums')]] | None
57+
) = (
5658
strawberry_django.filter_field()
5759
)
5860
termination_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
@@ -108,7 +110,7 @@ class CircuitFilter(
108110
strawberry_django.filter_field()
109111
)
110112
type_id: ID | None = strawberry_django.filter_field()
111-
status: Annotated['CircuitStatusEnum', strawberry.lazy('circuits.graphql.enums')] | None = (
113+
status: BaseFilterLookup[Annotated['CircuitStatusEnum', strawberry.lazy('circuits.graphql.enums')]] | None = (
112114
strawberry_django.filter_field()
113115
)
114116
install_date: DateFilterLookup[date] | None = strawberry_django.filter_field()
@@ -143,7 +145,7 @@ class CircuitGroupAssignmentFilter(
143145
strawberry_django.filter_field()
144146
)
145147
group_id: ID | None = strawberry_django.filter_field()
146-
priority: Annotated['CircuitPriorityEnum', strawberry.lazy('circuits.graphql.enums')] | None = (
148+
priority: BaseFilterLookup[Annotated['CircuitPriorityEnum', strawberry.lazy('circuits.graphql.enums')]] | None = (
147149
strawberry_django.filter_field()
148150
)
149151

@@ -198,7 +200,7 @@ class VirtualCircuitFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
198200
strawberry_django.filter_field()
199201
)
200202
type_id: ID | None = strawberry_django.filter_field()
201-
status: Annotated['CircuitStatusEnum', strawberry.lazy('circuits.graphql.enums')] | None = (
203+
status: BaseFilterLookup[Annotated['CircuitStatusEnum', strawberry.lazy('circuits.graphql.enums')]] | None = (
202204
strawberry_django.filter_field()
203205
)
204206
group_assignments: Annotated['CircuitGroupAssignmentFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
@@ -214,7 +216,11 @@ class VirtualCircuitTerminationFilter(
214216
strawberry_django.filter_field()
215217
)
216218
virtual_circuit_id: ID | None = strawberry_django.filter_field()
217-
role: Annotated['VirtualCircuitTerminationRoleEnum', strawberry.lazy('circuits.graphql.enums')] | None = (
219+
role: (
220+
BaseFilterLookup[
221+
Annotated['VirtualCircuitTerminationRoleEnum', strawberry.lazy('circuits.graphql.enums')]
222+
] | None
223+
) = (
218224
strawberry_django.filter_field()
219225
)
220226
interface: Annotated['InterfaceFilter', strawberry.lazy('dcim.graphql.filters')] | None = (

netbox/core/graphql/enums.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import strawberry
2+
3+
from core.choices import *
4+
5+
__all__ = (
6+
'DataSourceStatusEnum',
7+
'ObjectChangeActionEnum',
8+
)
9+
10+
DataSourceStatusEnum = strawberry.enum(DataSourceStatusChoices.as_enum(prefix='status'))
11+
ObjectChangeActionEnum = strawberry.enum(ObjectChangeActionChoices.as_enum(prefix='action'))

netbox/core/graphql/filter_mixins.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import strawberry
66
import strawberry_django
77
from strawberry import ID
8-
from strawberry_django import DatetimeFilterLookup
8+
from strawberry_django import FilterLookup, DatetimeFilterLookup
99

1010
if TYPE_CHECKING:
1111
from .filters import *
@@ -23,12 +23,13 @@ class BaseFilterMixin: ...
2323

2424
@dataclass
2525
class BaseObjectTypeFilterMixin(BaseFilterMixin):
26-
id: ID | None = strawberry.UNSET
26+
id: FilterLookup[ID] | None = strawberry_django.filter_field()
2727

2828

2929
@dataclass
3030
class ChangeLogFilterMixin(BaseFilterMixin):
31-
id: ID | None = strawberry.UNSET
31+
id: FilterLookup[ID] | None = strawberry_django.filter_field()
32+
# TODO: "changelog" is not a valid field name; needs to be updated for ObjectChange
3233
changelog: Annotated['ObjectChangeFilter', strawberry.lazy('core.graphql.filters')] | None = (
3334
strawberry_django.filter_field()
3435
)

netbox/core/graphql/filters.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55
import strawberry_django
66
from django.contrib.contenttypes.models import ContentType as DjangoContentType
77
from strawberry.scalars import ID
8-
from strawberry_django import DatetimeFilterLookup, FilterLookup
8+
from strawberry_django import BaseFilterLookup, DatetimeFilterLookup, FilterLookup
99

1010
from core import models
1111
from core.graphql.filter_mixins import BaseFilterMixin
1212
from netbox.graphql.filter_mixins import PrimaryModelFilterMixin
13+
from .enums import *
1314

1415
if TYPE_CHECKING:
1516
from netbox.graphql.filter_lookups import IntegerLookup, JSONFilter
@@ -25,7 +26,7 @@
2526

2627
@strawberry_django.filter_type(models.DataFile, lookups=True)
2728
class DataFileFilter(BaseFilterMixin):
28-
id: ID | None = strawberry_django.filter_field()
29+
id: FilterLookup[ID] | None = strawberry_django.filter_field()
2930
created: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
3031
last_updated: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
3132
source: Annotated['DataSourceFilter', strawberry.lazy('core.graphql.filters')] | None = (
@@ -44,7 +45,9 @@ class DataSourceFilter(PrimaryModelFilterMixin):
4445
name: FilterLookup[str] | None = strawberry_django.filter_field()
4546
type: FilterLookup[str] | None = strawberry_django.filter_field()
4647
source_url: FilterLookup[str] | None = strawberry_django.filter_field()
47-
status: FilterLookup[str] | None = strawberry_django.filter_field()
48+
status: (
49+
BaseFilterLookup[Annotated['DataSourceStatusEnum', strawberry.lazy('core.graphql.enums')]] | None
50+
) = strawberry_django.filter_field()
4851
enabled: FilterLookup[bool] | None = strawberry_django.filter_field()
4952
ignore_rules: FilterLookup[str] | None = strawberry_django.filter_field()
5053
parameters: Annotated['JSONFilter', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
@@ -58,12 +61,14 @@ class DataSourceFilter(PrimaryModelFilterMixin):
5861

5962
@strawberry_django.filter_type(models.ObjectChange, lookups=True)
6063
class ObjectChangeFilter(BaseFilterMixin):
61-
id: ID | None = strawberry_django.filter_field()
64+
id: FilterLookup[ID] | None = strawberry_django.filter_field()
6265
time: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
6366
user: Annotated['UserFilter', strawberry.lazy('users.graphql.filters')] | None = strawberry_django.filter_field()
6467
user_name: FilterLookup[str] | None = strawberry_django.filter_field()
6568
request_id: FilterLookup[str] | None = strawberry_django.filter_field()
66-
action: FilterLookup[str] | None = strawberry_django.filter_field()
69+
action: (
70+
BaseFilterLookup[Annotated['ObjectChangeActionEnum', strawberry.lazy('core.graphql.enums')]] | None
71+
) = strawberry_django.filter_field()
6772
changed_object_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
6873
strawberry_django.filter_field()
6974
)
@@ -84,6 +89,6 @@ class ObjectChangeFilter(BaseFilterMixin):
8489

8590
@strawberry_django.filter_type(DjangoContentType, lookups=True)
8691
class ContentTypeFilter(BaseFilterMixin):
87-
id: ID | None = strawberry_django.filter_field()
92+
id: FilterLookup[ID] | None = strawberry_django.filter_field()
8893
app_label: FilterLookup[str] | None = strawberry_django.filter_field()
8994
model: FilterLookup[str] | None = strawberry_django.filter_field()

netbox/dcim/graphql/enums.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,13 @@
2828
'PowerFeedSupplyEnum',
2929
'PowerFeedTypeEnum',
3030
'PowerOutletFeedLegEnum',
31+
'PowerOutletStatusEnum',
3132
'PowerOutletTypeEnum',
3233
'PowerPortTypeEnum',
3334
'RackAirflowEnum',
3435
'RackDimensionUnitEnum',
3536
'RackFormFactorEnum',
37+
'RackReservationStatusEnum',
3638
'RackStatusEnum',
3739
'RackWidthEnum',
3840
'SiteStatusEnum',
@@ -65,11 +67,13 @@
6567
PowerFeedSupplyEnum = strawberry.enum(PowerFeedSupplyChoices.as_enum(prefix='supply'))
6668
PowerFeedTypeEnum = strawberry.enum(PowerFeedTypeChoices.as_enum(prefix='type'))
6769
PowerOutletFeedLegEnum = strawberry.enum(PowerOutletFeedLegChoices.as_enum(prefix='feed_leg'))
70+
PowerOutletStatusEnum = strawberry.enum(PowerOutletStatusChoices.as_enum(prefix='status'))
6871
PowerOutletTypeEnum = strawberry.enum(PowerOutletTypeChoices.as_enum(prefix='type'))
6972
PowerPortTypeEnum = strawberry.enum(PowerPortTypeChoices.as_enum(prefix='type'))
7073
RackAirflowEnum = strawberry.enum(RackAirflowChoices.as_enum())
7174
RackDimensionUnitEnum = strawberry.enum(RackDimensionUnitChoices.as_enum(prefix='unit'))
7275
RackFormFactorEnum = strawberry.enum(RackFormFactorChoices.as_enum(prefix='type'))
76+
RackReservationStatusEnum = strawberry.enum(RackReservationStatusChoices.as_enum(prefix='status'))
7377
RackStatusEnum = strawberry.enum(RackStatusChoices.as_enum(prefix='status'))
7478
RackWidthEnum = strawberry.enum(RackWidthChoices.as_enum(prefix='width'))
7579
SiteStatusEnum = strawberry.enum(SiteStatusChoices.as_enum(prefix='status'))

netbox/dcim/graphql/filter_mixins.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import strawberry
55
import strawberry_django
66
from strawberry import ID
7-
from strawberry_django import FilterLookup
7+
from strawberry_django import BaseFilterLookup, FilterLookup
88

99
from core.graphql.filter_mixins import BaseFilterMixin, ChangeLogFilterMixin
1010
from core.graphql.filters import ContentTypeFilter
@@ -60,7 +60,9 @@ class ModularComponentModelFilterMixin(ComponentModelFilterMixin):
6060
class CabledObjectModelFilterMixin(BaseFilterMixin):
6161
cable: Annotated['CableFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
6262
cable_id: ID | None = strawberry_django.filter_field()
63-
cable_end: CableEndEnum | None = strawberry_django.filter_field()
63+
cable_end: (
64+
BaseFilterLookup[Annotated['CableEndEnum', strawberry.lazy('dcim.graphql.enums')]] | None
65+
) = strawberry_django.filter_field()
6466
mark_connected: FilterLookup[bool] | None = strawberry_django.filter_field()
6567

6668

@@ -96,7 +98,9 @@ class InterfaceBaseFilterMixin(BaseFilterMixin):
9698
mtu: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
9799
strawberry_django.filter_field()
98100
)
99-
mode: InterfaceModeEnum | None = strawberry_django.filter_field()
101+
mode: (
102+
BaseFilterLookup[Annotated['InterfaceModeEnum', strawberry.lazy('dcim.graphql.enums')]] | None
103+
) = strawberry_django.filter_field()
100104
bridge: Annotated['InterfaceFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
101105
strawberry_django.filter_field()
102106
)
@@ -110,8 +114,9 @@ class InterfaceBaseFilterMixin(BaseFilterMixin):
110114
qinq_svlan: Annotated['VLANFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
111115
strawberry_django.filter_field()
112116
)
113-
vlan_translation_policy: Annotated['VLANTranslationPolicyFilter', strawberry.lazy('ipam.graphql.filters')] | None \
114-
= strawberry_django.filter_field()
117+
vlan_translation_policy: (
118+
Annotated['VLANTranslationPolicyFilter', strawberry.lazy('ipam.graphql.filters')] | None
119+
) = strawberry_django.filter_field()
115120
primary_mac_address: Annotated['MACAddressFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
116121
strawberry_django.filter_field()
117122
)
@@ -120,7 +125,9 @@ class InterfaceBaseFilterMixin(BaseFilterMixin):
120125

121126
@dataclass
122127
class RackBaseFilterMixin(WeightFilterMixin, PrimaryModelFilterMixin):
123-
width: Annotated['RackWidthEnum', strawberry.lazy('dcim.graphql.enums')] | None = strawberry_django.filter_field()
128+
width: BaseFilterLookup[Annotated['RackWidthEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
129+
strawberry_django.filter_field()
130+
)
124131
u_height: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
125132
strawberry_django.filter_field()
126133
)
@@ -137,7 +144,7 @@ class RackBaseFilterMixin(WeightFilterMixin, PrimaryModelFilterMixin):
137144
outer_depth: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
138145
strawberry_django.filter_field()
139146
)
140-
outer_unit: Annotated['RackDimensionUnitEnum', strawberry.lazy('dcim.graphql.enums')] | None = (
147+
outer_unit: BaseFilterLookup[Annotated['RackDimensionUnitEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
141148
strawberry_django.filter_field()
142149
)
143150
mounting_depth: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (

0 commit comments

Comments
 (0)