filters.py 5.6 KB

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