2
0

filters.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. import django_filters
  2. from django.db.models import Q
  3. from dcim.models import DeviceRole, Interface, Platform, Region, Site
  4. from extras.filters import CustomFieldFilterSet, CreatedUpdatedFilterSet, LocalConfigContextFilter
  5. from tenancy.filtersets import TenancyFilterSet
  6. from utilities.filters import (
  7. MultiValueMACAddressFilter, NameSlugSearchFilterSet, NumericInFilter, TagFilter, TreeNodeMultipleChoiceFilter,
  8. )
  9. from .constants import *
  10. from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine
  11. __all__ = (
  12. 'ClusterFilter',
  13. 'ClusterGroupFilter',
  14. 'ClusterTypeFilter',
  15. 'InterfaceFilter',
  16. 'VirtualMachineFilter',
  17. )
  18. class ClusterTypeFilter(NameSlugSearchFilterSet):
  19. class Meta:
  20. model = ClusterType
  21. fields = ['id', 'name', 'slug']
  22. class ClusterGroupFilter(NameSlugSearchFilterSet):
  23. class Meta:
  24. model = ClusterGroup
  25. fields = ['id', 'name', 'slug']
  26. class ClusterFilter(CustomFieldFilterSet, CreatedUpdatedFilterSet):
  27. id__in = NumericInFilter(
  28. field_name='id',
  29. lookup_expr='in'
  30. )
  31. q = django_filters.CharFilter(
  32. method='search',
  33. label='Search',
  34. )
  35. region_id = TreeNodeMultipleChoiceFilter(
  36. queryset=Region.objects.all(),
  37. field_name='site__region__in',
  38. label='Region (ID)',
  39. )
  40. region = TreeNodeMultipleChoiceFilter(
  41. queryset=Region.objects.all(),
  42. field_name='site__region__in',
  43. to_field_name='slug',
  44. label='Region (slug)',
  45. )
  46. site_id = django_filters.ModelMultipleChoiceFilter(
  47. queryset=Site.objects.all(),
  48. label='Site (ID)',
  49. )
  50. site = django_filters.ModelMultipleChoiceFilter(
  51. field_name='site__slug',
  52. queryset=Site.objects.all(),
  53. to_field_name='slug',
  54. label='Site (slug)',
  55. )
  56. group_id = django_filters.ModelMultipleChoiceFilter(
  57. queryset=ClusterGroup.objects.all(),
  58. label='Parent group (ID)',
  59. )
  60. group = django_filters.ModelMultipleChoiceFilter(
  61. field_name='group__slug',
  62. queryset=ClusterGroup.objects.all(),
  63. to_field_name='slug',
  64. label='Parent group (slug)',
  65. )
  66. type_id = django_filters.ModelMultipleChoiceFilter(
  67. queryset=ClusterType.objects.all(),
  68. label='Cluster type (ID)',
  69. )
  70. type = django_filters.ModelMultipleChoiceFilter(
  71. field_name='type__slug',
  72. queryset=ClusterType.objects.all(),
  73. to_field_name='slug',
  74. label='Cluster type (slug)',
  75. )
  76. tag = TagFilter()
  77. class Meta:
  78. model = Cluster
  79. fields = ['name']
  80. def search(self, queryset, name, value):
  81. if not value.strip():
  82. return queryset
  83. return queryset.filter(
  84. Q(name__icontains=value) |
  85. Q(comments__icontains=value)
  86. )
  87. class VirtualMachineFilter(LocalConfigContextFilter, TenancyFilterSet, CustomFieldFilterSet, CreatedUpdatedFilterSet):
  88. id__in = NumericInFilter(
  89. field_name='id',
  90. lookup_expr='in'
  91. )
  92. q = django_filters.CharFilter(
  93. method='search',
  94. label='Search',
  95. )
  96. status = django_filters.MultipleChoiceFilter(
  97. choices=VM_STATUS_CHOICES,
  98. null_value=None
  99. )
  100. cluster_group_id = django_filters.ModelMultipleChoiceFilter(
  101. field_name='cluster__group',
  102. queryset=ClusterGroup.objects.all(),
  103. label='Cluster group (ID)',
  104. )
  105. cluster_group = django_filters.ModelMultipleChoiceFilter(
  106. field_name='cluster__group__slug',
  107. queryset=ClusterGroup.objects.all(),
  108. to_field_name='slug',
  109. label='Cluster group (slug)',
  110. )
  111. cluster_type_id = django_filters.ModelMultipleChoiceFilter(
  112. field_name='cluster__type',
  113. queryset=ClusterType.objects.all(),
  114. label='Cluster type (ID)',
  115. )
  116. cluster_type = django_filters.ModelMultipleChoiceFilter(
  117. field_name='cluster__type__slug',
  118. queryset=ClusterType.objects.all(),
  119. to_field_name='slug',
  120. label='Cluster type (slug)',
  121. )
  122. cluster_id = django_filters.ModelMultipleChoiceFilter(
  123. queryset=Cluster.objects.all(),
  124. label='Cluster (ID)',
  125. )
  126. region_id = TreeNodeMultipleChoiceFilter(
  127. queryset=Region.objects.all(),
  128. field_name='cluster__site__region__in',
  129. label='Region (ID)',
  130. )
  131. region = TreeNodeMultipleChoiceFilter(
  132. queryset=Region.objects.all(),
  133. field_name='cluster__site__region__in',
  134. to_field_name='slug',
  135. label='Region (slug)',
  136. )
  137. site_id = django_filters.ModelMultipleChoiceFilter(
  138. field_name='cluster__site',
  139. queryset=Site.objects.all(),
  140. label='Site (ID)',
  141. )
  142. site = django_filters.ModelMultipleChoiceFilter(
  143. field_name='cluster__site__slug',
  144. queryset=Site.objects.all(),
  145. to_field_name='slug',
  146. label='Site (slug)',
  147. )
  148. role_id = django_filters.ModelMultipleChoiceFilter(
  149. queryset=DeviceRole.objects.all(),
  150. label='Role (ID)',
  151. )
  152. role = django_filters.ModelMultipleChoiceFilter(
  153. field_name='role__slug',
  154. queryset=DeviceRole.objects.all(),
  155. to_field_name='slug',
  156. label='Role (slug)',
  157. )
  158. platform_id = django_filters.ModelMultipleChoiceFilter(
  159. queryset=Platform.objects.all(),
  160. label='Platform (ID)',
  161. )
  162. platform = django_filters.ModelMultipleChoiceFilter(
  163. field_name='platform__slug',
  164. queryset=Platform.objects.all(),
  165. to_field_name='slug',
  166. label='Platform (slug)',
  167. )
  168. mac_address = MultiValueMACAddressFilter(
  169. field_name='interfaces__mac_address',
  170. label='MAC address',
  171. )
  172. tag = TagFilter()
  173. class Meta:
  174. model = VirtualMachine
  175. fields = ['id', 'name', 'cluster', 'vcpus', 'memory', 'disk']
  176. def search(self, queryset, name, value):
  177. if not value.strip():
  178. return queryset
  179. return queryset.filter(
  180. Q(name__icontains=value) |
  181. Q(comments__icontains=value)
  182. )
  183. class InterfaceFilter(django_filters.FilterSet):
  184. q = django_filters.CharFilter(
  185. method='search',
  186. label='Search',
  187. )
  188. virtual_machine_id = django_filters.ModelMultipleChoiceFilter(
  189. field_name='virtual_machine',
  190. queryset=VirtualMachine.objects.all(),
  191. label='Virtual machine (ID)',
  192. )
  193. virtual_machine = django_filters.ModelMultipleChoiceFilter(
  194. field_name='virtual_machine__name',
  195. queryset=VirtualMachine.objects.all(),
  196. to_field_name='name',
  197. label='Virtual machine',
  198. )
  199. mac_address = MultiValueMACAddressFilter(
  200. label='MAC address',
  201. )
  202. class Meta:
  203. model = Interface
  204. fields = ['id', 'name', 'enabled', 'mtu']
  205. def search(self, queryset, name, value):
  206. if not value.strip():
  207. return queryset
  208. return queryset.filter(
  209. Q(name__icontains=value)
  210. )