filters.py 6.9 KB

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