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

1from typing import TYPE_CHECKING, Annotated 

2 

3import strawberry 

4import strawberry_django 

5from strawberry.scalars import ID 

6from strawberry_django import BaseFilterLookup, StrFilterLookup 

7 

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 

17 

18from .filter_mixins import ContactFilterMixin 

19 

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 

49 

50 from .enums import * 

51 

52__all__ = ( 

53 'ContactAssignmentFilter', 

54 'ContactFilter', 

55 'ContactGroupFilter', 

56 'ContactRoleFilter', 

57 'TenantFilter', 

58 'TenantGroupFilter', 

59) 

60 

61 

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 ) 

72 

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 ) 

139 

140 

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 ) 

153 

154 

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 ) 

169 

170 

171@register_filter(models.ContactRole, lookups=True) 

172class ContactRoleFilter(OrganizationalModelFilter): 

173 pass 

174 

175 

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 ) 

181 

182 

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 )