filters.py 6.5 KB

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