filtersets.py 5.3 KB

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