filters.py 6.8 KB

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