filtersets.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. import django_filters
  2. from django.db.models import Q
  3. from extras.filters import TagFilter
  4. from netbox.filtersets import OrganizationalModelFilterSet, PrimaryModelFilterSet
  5. from utilities.filters import TreeNodeMultipleChoiceFilter
  6. from .models import *
  7. __all__ = (
  8. 'ContactAssignmentFilterSet',
  9. 'ContactFilterSet',
  10. 'ContactGroupFilterSet',
  11. 'ContactRoleFilterSet',
  12. 'TenancyFilterSet',
  13. 'TenantFilterSet',
  14. 'TenantGroupFilterSet',
  15. )
  16. #
  17. # Tenancy
  18. #
  19. class TenantGroupFilterSet(OrganizationalModelFilterSet):
  20. parent_id = django_filters.ModelMultipleChoiceFilter(
  21. queryset=TenantGroup.objects.all(),
  22. label='Tenant group (ID)',
  23. )
  24. parent = django_filters.ModelMultipleChoiceFilter(
  25. field_name='parent__slug',
  26. queryset=TenantGroup.objects.all(),
  27. to_field_name='slug',
  28. label='Tenant group (slug)',
  29. )
  30. class Meta:
  31. model = TenantGroup
  32. fields = ['id', 'name', 'slug', 'description']
  33. class TenantFilterSet(PrimaryModelFilterSet):
  34. q = django_filters.CharFilter(
  35. method='search',
  36. label='Search',
  37. )
  38. group_id = TreeNodeMultipleChoiceFilter(
  39. queryset=TenantGroup.objects.all(),
  40. field_name='group',
  41. lookup_expr='in',
  42. label='Tenant group (ID)',
  43. )
  44. group = TreeNodeMultipleChoiceFilter(
  45. queryset=TenantGroup.objects.all(),
  46. field_name='group',
  47. lookup_expr='in',
  48. to_field_name='slug',
  49. label='Tenant group (slug)',
  50. )
  51. tag = TagFilter()
  52. class Meta:
  53. model = Tenant
  54. fields = ['id', 'name', 'slug']
  55. def search(self, queryset, name, value):
  56. if not value.strip():
  57. return queryset
  58. return queryset.filter(
  59. Q(name__icontains=value) |
  60. Q(slug__icontains=value) |
  61. Q(description__icontains=value) |
  62. Q(comments__icontains=value)
  63. )
  64. class TenancyFilterSet(django_filters.FilterSet):
  65. """
  66. An inheritable FilterSet for models which support Tenant assignment.
  67. """
  68. tenant_group_id = TreeNodeMultipleChoiceFilter(
  69. queryset=TenantGroup.objects.all(),
  70. field_name='tenant__group',
  71. lookup_expr='in',
  72. label='Tenant Group (ID)',
  73. )
  74. tenant_group = TreeNodeMultipleChoiceFilter(
  75. queryset=TenantGroup.objects.all(),
  76. field_name='tenant__group',
  77. to_field_name='slug',
  78. lookup_expr='in',
  79. label='Tenant Group (slug)',
  80. )
  81. tenant_id = django_filters.ModelMultipleChoiceFilter(
  82. queryset=Tenant.objects.all(),
  83. label='Tenant (ID)',
  84. )
  85. tenant = django_filters.ModelMultipleChoiceFilter(
  86. queryset=Tenant.objects.all(),
  87. field_name='tenant__slug',
  88. to_field_name='slug',
  89. label='Tenant (slug)',
  90. )
  91. #
  92. # Contacts
  93. #
  94. class ContactGroupFilterSet(OrganizationalModelFilterSet):
  95. parent_id = django_filters.ModelMultipleChoiceFilter(
  96. queryset=ContactGroup.objects.all(),
  97. label='Contact group (ID)',
  98. )
  99. parent = django_filters.ModelMultipleChoiceFilter(
  100. field_name='parent__slug',
  101. queryset=ContactGroup.objects.all(),
  102. to_field_name='slug',
  103. label='Contact group (slug)',
  104. )
  105. class Meta:
  106. model = ContactGroup
  107. fields = ['id', 'name', 'slug', 'description']
  108. class ContactRoleFilterSet(OrganizationalModelFilterSet):
  109. class Meta:
  110. model = ContactRole
  111. fields = ['id', 'name', 'slug']
  112. class ContactFilterSet(PrimaryModelFilterSet):
  113. q = django_filters.CharFilter(
  114. method='search',
  115. label='Search',
  116. )
  117. group_id = TreeNodeMultipleChoiceFilter(
  118. queryset=ContactGroup.objects.all(),
  119. field_name='group',
  120. lookup_expr='in',
  121. label='Contact group (ID)',
  122. )
  123. group = TreeNodeMultipleChoiceFilter(
  124. queryset=ContactGroup.objects.all(),
  125. field_name='group',
  126. lookup_expr='in',
  127. to_field_name='slug',
  128. label='Contact group (slug)',
  129. )
  130. tag = TagFilter()
  131. class Meta:
  132. model = Contact
  133. fields = ['id', 'name', 'title', 'phone', 'email', 'address']
  134. def search(self, queryset, name, value):
  135. if not value.strip():
  136. return queryset
  137. return queryset.filter(
  138. Q(name__icontains=value) |
  139. Q(title__icontains=value) |
  140. Q(phone__icontains=value) |
  141. Q(email__icontains=value) |
  142. Q(address__icontains=value) |
  143. Q(comments__icontains=value)
  144. )
  145. class ContactAssignmentFilterSet(OrganizationalModelFilterSet):
  146. contact_id = django_filters.ModelMultipleChoiceFilter(
  147. queryset=Contact.objects.all(),
  148. label='Contact (ID)',
  149. )
  150. role_id = django_filters.ModelMultipleChoiceFilter(
  151. queryset=ContactRole.objects.all(),
  152. label='Contact role (ID)',
  153. )
  154. role = django_filters.ModelMultipleChoiceFilter(
  155. field_name='role__slug',
  156. queryset=ContactRole.objects.all(),
  157. to_field_name='slug',
  158. label='Contact role (slug)',
  159. )
  160. class Meta:
  161. model = ContactAssignment
  162. fields = ['id', 'priority']