Coverage for tenancy/filtersets.py: 82%
79 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
1import django_filters
2from django.db.models import Q
3from django.utils.translation import gettext as _
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
14from .models import *
16__all__ = (
17 'ContactAssignmentFilterSet',
18 'ContactFilterSet',
19 'ContactGroupFilterSet',
20 'ContactModelFilterSet',
21 'ContactRoleFilterSet',
22 'TenancyFilterSet',
23 'TenantFilterSet',
24 'TenantGroupFilterSet',
25)
28#
29# Contacts
30#
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 )
65 class Meta:
66 model = ContactGroup
67 fields = ('id', 'name', 'slug', 'description')
70@register_filterset
71class ContactRoleFilterSet(OrganizationalModelFilterSet):
73 class Meta:
74 model = ContactRole
75 fields = ('id', 'name', 'slug', 'description')
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 )
94 class Meta:
95 model = Contact
96 fields = ('id', 'name', 'title', 'phone', 'email', 'address', 'link', 'description')
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 )
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 )
151 class Meta:
152 model = ContactAssignment
153 fields = ('id', 'object_type_id', 'object_id', 'priority')
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 )
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 )
183#
184# Tenancy
185#
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 )
215 class Meta:
216 model = TenantGroup
217 fields = ('id', 'name', 'slug', 'description')
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 )
236 class Meta:
237 model = Tenant
238 fields = ('id', 'name', 'slug', 'description')
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 )
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 )