filters.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  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, TenantGroup
  9. from utilities.filters import NameSlugSearchFilterSet, NumericInFilter, TagFilter
  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 = django_filters.NumberFilter(
  110. method='filter_region',
  111. field_name='pk',
  112. label='Region (ID)',
  113. )
  114. region = django_filters.CharFilter(
  115. method='filter_region',
  116. 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. tenant_group_id = django_filters.ModelMultipleChoiceFilter(
  141. field_name='tenant__group__id',
  142. queryset=TenantGroup.objects.all(),
  143. to_field_name='id',
  144. label='Tenant Group (ID)',
  145. )
  146. tenant_group = django_filters.ModelMultipleChoiceFilter(
  147. field_name='tenant__group__slug',
  148. queryset=TenantGroup.objects.all(),
  149. to_field_name='slug',
  150. label='Tenant Group (slug)',
  151. )
  152. tenant_id = django_filters.ModelMultipleChoiceFilter(
  153. queryset=Tenant.objects.all(),
  154. label='Tenant (ID)',
  155. )
  156. tenant = django_filters.ModelMultipleChoiceFilter(
  157. field_name='tenant__slug',
  158. queryset=Tenant.objects.all(),
  159. to_field_name='slug',
  160. label='Tenant (slug)',
  161. )
  162. platform_id = django_filters.ModelMultipleChoiceFilter(
  163. queryset=Platform.objects.all(),
  164. label='Platform (ID)',
  165. )
  166. platform = django_filters.ModelMultipleChoiceFilter(
  167. field_name='platform__slug',
  168. queryset=Platform.objects.all(),
  169. to_field_name='slug',
  170. label='Platform (slug)',
  171. )
  172. tag = TagFilter()
  173. class Meta:
  174. model = VirtualMachine
  175. fields = ['name', 'cluster']
  176. def search(self, queryset, name, value):
  177. if not value.strip():
  178. return queryset
  179. return queryset.filter(
  180. Q(name__icontains=value) |
  181. Q(comments__icontains=value)
  182. )
  183. def filter_region(self, queryset, name, value):
  184. try:
  185. region = Region.objects.get(**{name: value})
  186. except ObjectDoesNotExist:
  187. return queryset.none()
  188. return queryset.filter(
  189. Q(cluster__site__region=region) |
  190. Q(cluster__site__region__in=region.get_descendants())
  191. )
  192. class InterfaceFilter(django_filters.FilterSet):
  193. q = django_filters.CharFilter(
  194. method='search',
  195. label='Search',
  196. )
  197. virtual_machine_id = django_filters.ModelMultipleChoiceFilter(
  198. field_name='virtual_machine',
  199. queryset=VirtualMachine.objects.all(),
  200. label='Virtual machine (ID)',
  201. )
  202. virtual_machine = django_filters.ModelMultipleChoiceFilter(
  203. field_name='virtual_machine__name',
  204. queryset=VirtualMachine.objects.all(),
  205. to_field_name='name',
  206. label='Virtual machine',
  207. )
  208. mac_address = django_filters.CharFilter(
  209. method='_mac_address',
  210. label='MAC address',
  211. )
  212. class Meta:
  213. model = Interface
  214. fields = ['name', 'enabled', 'mtu']
  215. def _mac_address(self, queryset, name, value):
  216. value = value.strip()
  217. if not value:
  218. return queryset
  219. try:
  220. mac = EUI(value.strip())
  221. return queryset.filter(mac_address=mac)
  222. except AddrFormatError:
  223. return queryset.none()
  224. def search(self, queryset, name, value):
  225. if not value.strip():
  226. return queryset
  227. return queryset.filter(
  228. Q(name__icontains=value)
  229. )