Coverage for tenancy/graphql/filters.py: 88%
84 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 typing import TYPE_CHECKING, Annotated
3import strawberry
4import strawberry_django
5from strawberry.scalars import ID
6from strawberry_django import BaseFilterLookup, StrFilterLookup
8from extras.graphql.filter_mixins import CustomFieldsFilterMixin, TagsFilterMixin
9from netbox.graphql.filters import (
10 ChangeLoggedModelFilter,
11 NestedGroupModelFilter,
12 OrganizationalModelFilter,
13 PrimaryModelFilter,
14 register_filter,
15)
16from tenancy import models
18from .filter_mixins import ContactFilterMixin
20if TYPE_CHECKING: 20 ↛ 21line 20 didn't jump to line 21 because the condition on line 20 was never true
21 from circuits.graphql.filters import CircuitFilter, CircuitGroupFilter, VirtualCircuitFilter
22 from core.graphql.filters import ContentTypeFilter
23 from dcim.graphql.filters import (
24 CableFilter,
25 DeviceFilter,
26 LocationFilter,
27 PowerFeedFilter,
28 RackFilter,
29 RackReservationFilter,
30 SiteFilter,
31 VirtualDeviceContextFilter,
32 )
33 from ipam.graphql.filters import (
34 AggregateFilter,
35 ASNFilter,
36 ASNRangeFilter,
37 IPAddressFilter,
38 IPRangeFilter,
39 PrefixFilter,
40 RouteTargetFilter,
41 VLANFilter,
42 VLANGroupFilter,
43 VRFFilter,
44 )
45 from netbox.graphql.filter_lookups import TreeNodeFilter
46 from virtualization.graphql.filters import ClusterFilter, VirtualMachineFilter
47 from vpn.graphql.filters import L2VPNFilter, TunnelFilter
48 from wireless.graphql.filters import WirelessLANFilter, WirelessLinkFilter
50 from .enums import *
52__all__ = (
53 'ContactAssignmentFilter',
54 'ContactFilter',
55 'ContactGroupFilter',
56 'ContactRoleFilter',
57 'TenantFilter',
58 'TenantGroupFilter',
59)
62@register_filter(models.Tenant, lookups=True)
63class TenantFilter(ContactFilterMixin, PrimaryModelFilter):
64 name: StrFilterLookup | None = strawberry_django.filter_field()
65 slug: StrFilterLookup | None = strawberry_django.filter_field()
66 group: Annotated['TenantGroupFilter', strawberry.lazy('tenancy.graphql.filters')] | None = (
67 strawberry_django.filter_field()
68 )
69 group_id: Annotated['TreeNodeFilter', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
70 strawberry_django.filter_field()
71 )
73 # Reverse relations
74 aggregates: Annotated['AggregateFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
75 strawberry_django.filter_field()
76 )
77 asns: Annotated['ASNFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
78 asn_ranges: Annotated['ASNRangeFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
79 strawberry_django.filter_field()
80 )
81 cables: Annotated['CableFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
82 circuit_groups: Annotated['CircuitGroupFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
83 strawberry_django.filter_field()
84 )
85 circuits: Annotated['CircuitFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
86 strawberry_django.filter_field()
87 )
88 clusters: Annotated['ClusterFilter', strawberry.lazy('virtualization.graphql.filters')] | None = (
89 strawberry_django.filter_field()
90 )
91 devices: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
92 strawberry_django.filter_field()
93 )
94 ip_addresses: Annotated['IPAddressFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
95 strawberry_django.filter_field()
96 )
97 ip_ranges: Annotated['IPRangeFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
98 strawberry_django.filter_field()
99 )
100 l2vpns: Annotated['L2VPNFilter', strawberry.lazy('vpn.graphql.filters')] | None = strawberry_django.filter_field()
101 locations: Annotated['LocationFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
102 strawberry_django.filter_field()
103 )
104 power_feeds: Annotated['PowerFeedFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
105 strawberry_django.filter_field()
106 )
107 prefixes: Annotated['PrefixFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
108 strawberry_django.filter_field()
109 )
110 racks: Annotated['RackFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
111 rackreservations: Annotated['RackReservationFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
112 strawberry_django.filter_field()
113 )
114 route_targets: Annotated['RouteTargetFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
115 strawberry_django.filter_field()
116 )
117 sites: Annotated['SiteFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
118 tunnels: Annotated['TunnelFilter', strawberry.lazy('vpn.graphql.filters')] | None = strawberry_django.filter_field()
119 vdcs: Annotated['VirtualDeviceContextFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
120 strawberry_django.filter_field()
121 )
122 virtual_machines: Annotated['VirtualMachineFilter', strawberry.lazy('virtualization.graphql.filters')] | None = (
123 strawberry_django.filter_field()
124 )
125 vlan_groups: Annotated['VLANGroupFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
126 strawberry_django.filter_field()
127 )
128 vlans: Annotated['VLANFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
129 virtual_circuits: Annotated['VirtualCircuitFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
130 strawberry_django.filter_field()
131 )
132 vrfs: Annotated['VRFFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
133 wireless_lans: Annotated['WirelessLANFilter', strawberry.lazy('wireless.graphql.filters')] | None = (
134 strawberry_django.filter_field()
135 )
136 wireless_links: Annotated['WirelessLinkFilter', strawberry.lazy('wireless.graphql.filters')] | None = (
137 strawberry_django.filter_field()
138 )
141@register_filter(models.TenantGroup, lookups=True)
142class TenantGroupFilter(OrganizationalModelFilter):
143 parent: Annotated['TenantGroupFilter', strawberry.lazy('tenancy.graphql.filters')] | None = (
144 strawberry_django.filter_field()
145 )
146 parent_id: ID | None = strawberry.UNSET
147 tenants: Annotated['TenantFilter', strawberry.lazy('tenancy.graphql.filters')] | None = (
148 strawberry_django.filter_field()
149 )
150 children: Annotated['TenantGroupFilter', strawberry.lazy('tenancy.graphql.filters'), True] | None = (
151 strawberry_django.filter_field()
152 )
155@register_filter(models.Contact, lookups=True)
156class ContactFilter(PrimaryModelFilter):
157 name: StrFilterLookup | None = strawberry_django.filter_field()
158 title: StrFilterLookup | None = strawberry_django.filter_field()
159 phone: StrFilterLookup | None = strawberry_django.filter_field()
160 email: StrFilterLookup | None = strawberry_django.filter_field()
161 address: StrFilterLookup | None = strawberry_django.filter_field()
162 link: StrFilterLookup | None = strawberry_django.filter_field()
163 groups: Annotated['ContactGroupFilter', strawberry.lazy('tenancy.graphql.filters')] | None = (
164 strawberry_django.filter_field()
165 )
166 assignments: Annotated['ContactAssignmentFilter', strawberry.lazy('tenancy.graphql.filters')] | None = (
167 strawberry_django.filter_field()
168 )
171@register_filter(models.ContactRole, lookups=True)
172class ContactRoleFilter(OrganizationalModelFilter):
173 pass
176@register_filter(models.ContactGroup, lookups=True)
177class ContactGroupFilter(NestedGroupModelFilter):
178 parent: Annotated['ContactGroupFilter', strawberry.lazy('tenancy.graphql.filters')] | None = (
179 strawberry_django.filter_field()
180 )
183@register_filter(models.ContactAssignment, lookups=True)
184class ContactAssignmentFilter(CustomFieldsFilterMixin, TagsFilterMixin, ChangeLoggedModelFilter):
185 object_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
186 strawberry_django.filter_field()
187 )
188 object_id: ID | None = strawberry_django.filter_field()
189 contact: Annotated['ContactFilter', strawberry.lazy('tenancy.graphql.filters')] | None = (
190 strawberry_django.filter_field()
191 )
192 contact_id: ID | None = strawberry_django.filter_field()
193 role: Annotated['ContactRoleFilter', strawberry.lazy('tenancy.graphql.filters')] | None = (
194 strawberry_django.filter_field()
195 )
196 role_id: ID | None = strawberry_django.filter_field()
197 priority: BaseFilterLookup[Annotated['ContactPriorityEnum', strawberry.lazy('tenancy.graphql.enums')]] | None = (
198 strawberry_django.filter_field()
199 )