2
0

filters.py 7.0 KB

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