Coverage for tenancy/filtersets.py: 82%

79 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-10 18:35 +0000

1import django_filters 

2from django.db.models import Q 

3from django.utils.translation import gettext as _ 

4 

5from netbox.filtersets import ( 

6 NestedGroupModelFilterSet, 

7 NetBoxModelFilterSet, 

8 OrganizationalModelFilterSet, 

9 PrimaryModelFilterSet, 

10) 

11from utilities.filters import MultiValueContentTypeFilter, TreeNodeMultipleChoiceFilter 

12from utilities.filtersets import register_filterset 

13 

14from .models import * 

15 

16__all__ = ( 

17 'ContactAssignmentFilterSet', 

18 'ContactFilterSet', 

19 'ContactGroupFilterSet', 

20 'ContactModelFilterSet', 

21 'ContactRoleFilterSet', 

22 'TenancyFilterSet', 

23 'TenantFilterSet', 

24 'TenantGroupFilterSet', 

25) 

26 

27 

28# 

29# Contacts 

30# 

31 

32@register_filterset 

33class ContactGroupFilterSet(NestedGroupModelFilterSet): 

34 parent_id = django_filters.ModelMultipleChoiceFilter( 

35 queryset=ContactGroup.objects.all(), 

36 distinct=False, 

37 label=_('Parent contact group (ID)'), 

38 ) 

39 parent = django_filters.ModelMultipleChoiceFilter( 

40 field_name='parent__slug', 

41 queryset=ContactGroup.objects.all(), 

42 distinct=False, 

43 to_field_name='slug', 

44 label=_('Parent contact group (slug)'), 

45 ) 

46 ancestor_id = TreeNodeMultipleChoiceFilter( 

47 queryset=ContactGroup.objects.all(), 

48 field_name='parent', 

49 lookup_expr='in', 

50 label=_('Contact group (ID)'), 

51 ) 

52 ancestor = TreeNodeMultipleChoiceFilter( 

53 queryset=ContactGroup.objects.all(), 

54 field_name='parent', 

55 lookup_expr='in', 

56 to_field_name='slug', 

57 label=_('Contact group (slug)'), 

58 ) 

59 contact_id = django_filters.ModelMultipleChoiceFilter( 

60 field_name='contact', 

61 queryset=Contact.objects.all(), 

62 label=_('Contact (ID)'), 

63 ) 

64 

65 class Meta: 

66 model = ContactGroup 

67 fields = ('id', 'name', 'slug', 'description') 

68 

69 

70@register_filterset 

71class ContactRoleFilterSet(OrganizationalModelFilterSet): 

72 

73 class Meta: 

74 model = ContactRole 

75 fields = ('id', 'name', 'slug', 'description') 

76 

77 

78@register_filterset 

79class ContactFilterSet(PrimaryModelFilterSet): 

80 group_id = TreeNodeMultipleChoiceFilter( 

81 queryset=ContactGroup.objects.all(), 

82 field_name='groups', 

83 lookup_expr='in', 

84 label=_('Contact group (ID)'), 

85 ) 

86 group = TreeNodeMultipleChoiceFilter( 

87 queryset=ContactGroup.objects.all(), 

88 field_name='groups', 

89 to_field_name='slug', 

90 lookup_expr='in', 

91 label=_('Contact group (slug)'), 

92 ) 

93 

94 class Meta: 

95 model = Contact 

96 fields = ('id', 'name', 'title', 'phone', 'email', 'address', 'link', 'description') 

97 

98 def search(self, queryset, name, value): 

99 if not value.strip(): 

100 return queryset 

101 return queryset.filter( 

102 Q(name__icontains=value) | 

103 Q(title__icontains=value) | 

104 Q(phone__icontains=value) | 

105 Q(email__icontains=value) | 

106 Q(address__icontains=value) | 

107 Q(link__icontains=value) | 

108 Q(description__icontains=value) | 

109 Q(comments__icontains=value) 

110 ) 

111 

112 

113@register_filterset 

114class ContactAssignmentFilterSet(NetBoxModelFilterSet): 

115 q = django_filters.CharFilter( 

116 method='search', 

117 label=_('Search'), 

118 ) 

119 object_type = MultiValueContentTypeFilter() 

120 contact_id = django_filters.ModelMultipleChoiceFilter( 

121 queryset=Contact.objects.all(), 

122 distinct=False, 

123 label=_('Contact (ID)'), 

124 ) 

125 group_id = TreeNodeMultipleChoiceFilter( 

126 queryset=ContactGroup.objects.all(), 

127 field_name='contact__groups', 

128 lookup_expr='in', 

129 label=_('Contact group (ID)'), 

130 ) 

131 group = TreeNodeMultipleChoiceFilter( 

132 queryset=ContactGroup.objects.all(), 

133 field_name='contact__groups', 

134 lookup_expr='in', 

135 to_field_name='slug', 

136 label=_('Contact group (slug)'), 

137 ) 

138 role_id = django_filters.ModelMultipleChoiceFilter( 

139 queryset=ContactRole.objects.all(), 

140 distinct=False, 

141 label=_('Contact role (ID)'), 

142 ) 

143 role = django_filters.ModelMultipleChoiceFilter( 

144 field_name='role__slug', 

145 queryset=ContactRole.objects.all(), 

146 distinct=False, 

147 to_field_name='slug', 

148 label=_('Contact role (slug)'), 

149 ) 

150 

151 class Meta: 

152 model = ContactAssignment 

153 fields = ('id', 'object_type_id', 'object_id', 'priority') 

154 

155 def search(self, queryset, name, value): 

156 if not value.strip(): 

157 return queryset 

158 return queryset.filter( 

159 Q(contact__name__icontains=value) | 

160 Q(role__name__icontains=value) 

161 ) 

162 

163 

164class ContactModelFilterSet(django_filters.FilterSet): 

165 contact = django_filters.ModelMultipleChoiceFilter( 

166 field_name='contacts__contact', 

167 queryset=Contact.objects.all(), 

168 label=_('Contact'), 

169 ) 

170 contact_role = django_filters.ModelMultipleChoiceFilter( 

171 field_name='contacts__role', 

172 queryset=ContactRole.objects.all(), 

173 label=_('Contact Role') 

174 ) 

175 contact_group = TreeNodeMultipleChoiceFilter( 

176 queryset=ContactGroup.objects.all(), 

177 field_name='contacts__contact__groups', 

178 lookup_expr='in', 

179 label=_('Contact group'), 

180 ) 

181 

182 

183# 

184# Tenancy 

185# 

186 

187@register_filterset 

188class TenantGroupFilterSet(NestedGroupModelFilterSet): 

189 parent_id = django_filters.ModelMultipleChoiceFilter( 

190 queryset=TenantGroup.objects.all(), 

191 distinct=False, 

192 label=_('Parent tenant group (ID)'), 

193 ) 

194 parent = django_filters.ModelMultipleChoiceFilter( 

195 field_name='parent__slug', 

196 queryset=TenantGroup.objects.all(), 

197 distinct=False, 

198 to_field_name='slug', 

199 label=_('Parent tenant group (slug)'), 

200 ) 

201 ancestor_id = TreeNodeMultipleChoiceFilter( 

202 queryset=TenantGroup.objects.all(), 

203 field_name='parent', 

204 lookup_expr='in', 

205 label=_('Tenant group (ID)'), 

206 ) 

207 ancestor = TreeNodeMultipleChoiceFilter( 

208 queryset=TenantGroup.objects.all(), 

209 field_name='parent', 

210 lookup_expr='in', 

211 to_field_name='slug', 

212 label=_('Tenant group (slug)'), 

213 ) 

214 

215 class Meta: 

216 model = TenantGroup 

217 fields = ('id', 'name', 'slug', 'description') 

218 

219 

220@register_filterset 

221class TenantFilterSet(PrimaryModelFilterSet, ContactModelFilterSet): 

222 group_id = TreeNodeMultipleChoiceFilter( 

223 queryset=TenantGroup.objects.all(), 

224 field_name='group', 

225 lookup_expr='in', 

226 label=_('Tenant group (ID)'), 

227 ) 

228 group = TreeNodeMultipleChoiceFilter( 

229 queryset=TenantGroup.objects.all(), 

230 field_name='group', 

231 lookup_expr='in', 

232 to_field_name='slug', 

233 label=_('Tenant group (slug)'), 

234 ) 

235 

236 class Meta: 

237 model = Tenant 

238 fields = ('id', 'name', 'slug', 'description') 

239 

240 def search(self, queryset, name, value): 

241 if not value.strip(): 

242 return queryset 

243 return queryset.filter( 

244 Q(name__icontains=value) | 

245 Q(slug__icontains=value) | 

246 Q(description__icontains=value) | 

247 Q(comments__icontains=value) 

248 ) 

249 

250 

251class TenancyFilterSet(django_filters.FilterSet): 

252 """ 

253 An inheritable FilterSet for models which support Tenant assignment. 

254 """ 

255 tenant_group_id = TreeNodeMultipleChoiceFilter( 

256 queryset=TenantGroup.objects.all(), 

257 field_name='tenant__group', 

258 lookup_expr='in', 

259 label=_('Tenant Group (ID)'), 

260 ) 

261 tenant_group = TreeNodeMultipleChoiceFilter( 

262 queryset=TenantGroup.objects.all(), 

263 field_name='tenant__group', 

264 to_field_name='slug', 

265 lookup_expr='in', 

266 label=_('Tenant Group (slug)'), 

267 ) 

268 tenant_id = django_filters.ModelMultipleChoiceFilter( 

269 queryset=Tenant.objects.all(), 

270 distinct=False, 

271 label=_('Tenant (ID)'), 

272 ) 

273 tenant = django_filters.ModelMultipleChoiceFilter( 

274 queryset=Tenant.objects.all(), 

275 distinct=False, 

276 field_name='tenant__slug', 

277 to_field_name='slug', 

278 label=_('Tenant (slug)'), 

279 )