filters.py 7.0 KB

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