filters.py 5.9 KB

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