filters.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. import django_filters
  2. from django.db.models import Q
  3. from dcim.models import DeviceRole, Platform, Region, Site, SiteGroup
  4. from extras.filtersets import LocalConfigContextFilterSet
  5. from tenancy.filters import TenancyFilterSet
  6. from utilities.filters import MultiValueMACAddressFilter, TagFilter, TreeNodeMultipleChoiceFilter
  7. from utilities.filtersets import OrganizationalModelFilterSet, PrimaryModelFilterSet
  8. from .choices import *
  9. from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface
  10. __all__ = (
  11. 'ClusterFilterSet',
  12. 'ClusterGroupFilterSet',
  13. 'ClusterTypeFilterSet',
  14. 'VirtualMachineFilterSet',
  15. 'VMInterfaceFilterSet',
  16. )
  17. class ClusterTypeFilterSet(OrganizationalModelFilterSet):
  18. class Meta:
  19. model = ClusterType
  20. fields = ['id', 'name', 'slug', 'description']
  21. class ClusterGroupFilterSet(OrganizationalModelFilterSet):
  22. class Meta:
  23. model = ClusterGroup
  24. fields = ['id', 'name', 'slug', 'description']
  25. class ClusterFilterSet(PrimaryModelFilterSet, TenancyFilterSet):
  26. q = django_filters.CharFilter(
  27. method='search',
  28. label='Search',
  29. )
  30. region_id = TreeNodeMultipleChoiceFilter(
  31. queryset=Region.objects.all(),
  32. field_name='site__region',
  33. lookup_expr='in',
  34. label='Region (ID)',
  35. )
  36. region = TreeNodeMultipleChoiceFilter(
  37. queryset=Region.objects.all(),
  38. field_name='site__region',
  39. lookup_expr='in',
  40. to_field_name='slug',
  41. label='Region (slug)',
  42. )
  43. site_group_id = TreeNodeMultipleChoiceFilter(
  44. queryset=SiteGroup.objects.all(),
  45. field_name='site__group',
  46. lookup_expr='in',
  47. label='Site group (ID)',
  48. )
  49. site_group = TreeNodeMultipleChoiceFilter(
  50. queryset=SiteGroup.objects.all(),
  51. field_name='site__group',
  52. lookup_expr='in',
  53. to_field_name='slug',
  54. label='Site group (slug)',
  55. )
  56. site_id = django_filters.ModelMultipleChoiceFilter(
  57. queryset=Site.objects.all(),
  58. label='Site (ID)',
  59. )
  60. site = django_filters.ModelMultipleChoiceFilter(
  61. field_name='site__slug',
  62. queryset=Site.objects.all(),
  63. to_field_name='slug',
  64. label='Site (slug)',
  65. )
  66. group_id = django_filters.ModelMultipleChoiceFilter(
  67. queryset=ClusterGroup.objects.all(),
  68. label='Parent group (ID)',
  69. )
  70. group = django_filters.ModelMultipleChoiceFilter(
  71. field_name='group__slug',
  72. queryset=ClusterGroup.objects.all(),
  73. to_field_name='slug',
  74. label='Parent group (slug)',
  75. )
  76. type_id = django_filters.ModelMultipleChoiceFilter(
  77. queryset=ClusterType.objects.all(),
  78. label='Cluster type (ID)',
  79. )
  80. type = django_filters.ModelMultipleChoiceFilter(
  81. field_name='type__slug',
  82. queryset=ClusterType.objects.all(),
  83. to_field_name='slug',
  84. label='Cluster type (slug)',
  85. )
  86. tag = TagFilter()
  87. class Meta:
  88. model = Cluster
  89. fields = ['id', 'name']
  90. def search(self, queryset, name, value):
  91. if not value.strip():
  92. return queryset
  93. return queryset.filter(
  94. Q(name__icontains=value) |
  95. Q(comments__icontains=value)
  96. )
  97. class VirtualMachineFilterSet(PrimaryModelFilterSet, TenancyFilterSet, LocalConfigContextFilterSet):
  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',
  135. lookup_expr='in',
  136. label='Region (ID)',
  137. )
  138. region = TreeNodeMultipleChoiceFilter(
  139. queryset=Region.objects.all(),
  140. field_name='cluster__site__region',
  141. lookup_expr='in',
  142. to_field_name='slug',
  143. label='Region (slug)',
  144. )
  145. site_group_id = TreeNodeMultipleChoiceFilter(
  146. queryset=SiteGroup.objects.all(),
  147. field_name='cluster__site__group',
  148. lookup_expr='in',
  149. label='Site group (ID)',
  150. )
  151. site_group = TreeNodeMultipleChoiceFilter(
  152. queryset=SiteGroup.objects.all(),
  153. field_name='cluster__site__group',
  154. lookup_expr='in',
  155. to_field_name='slug',
  156. label='Site group (slug)',
  157. )
  158. site_id = django_filters.ModelMultipleChoiceFilter(
  159. field_name='cluster__site',
  160. queryset=Site.objects.all(),
  161. label='Site (ID)',
  162. )
  163. site = django_filters.ModelMultipleChoiceFilter(
  164. field_name='cluster__site__slug',
  165. queryset=Site.objects.all(),
  166. to_field_name='slug',
  167. label='Site (slug)',
  168. )
  169. role_id = django_filters.ModelMultipleChoiceFilter(
  170. queryset=DeviceRole.objects.all(),
  171. label='Role (ID)',
  172. )
  173. role = django_filters.ModelMultipleChoiceFilter(
  174. field_name='role__slug',
  175. queryset=DeviceRole.objects.all(),
  176. to_field_name='slug',
  177. label='Role (slug)',
  178. )
  179. platform_id = django_filters.ModelMultipleChoiceFilter(
  180. queryset=Platform.objects.all(),
  181. label='Platform (ID)',
  182. )
  183. platform = django_filters.ModelMultipleChoiceFilter(
  184. field_name='platform__slug',
  185. queryset=Platform.objects.all(),
  186. to_field_name='slug',
  187. label='Platform (slug)',
  188. )
  189. mac_address = MultiValueMACAddressFilter(
  190. field_name='interfaces__mac_address',
  191. label='MAC address',
  192. )
  193. has_primary_ip = django_filters.BooleanFilter(
  194. method='_has_primary_ip',
  195. label='Has a primary IP',
  196. )
  197. tag = TagFilter()
  198. class Meta:
  199. model = VirtualMachine
  200. fields = ['id', 'name', 'cluster', 'vcpus', 'memory', 'disk']
  201. def search(self, queryset, name, value):
  202. if not value.strip():
  203. return queryset
  204. return queryset.filter(
  205. Q(name__icontains=value) |
  206. Q(comments__icontains=value)
  207. )
  208. def _has_primary_ip(self, queryset, name, value):
  209. params = Q(primary_ip4__isnull=False) | Q(primary_ip6__isnull=False)
  210. if value:
  211. return queryset.filter(params)
  212. return queryset.exclude(params)
  213. class VMInterfaceFilterSet(PrimaryModelFilterSet):
  214. q = django_filters.CharFilter(
  215. method='search',
  216. label='Search',
  217. )
  218. cluster_id = django_filters.ModelMultipleChoiceFilter(
  219. field_name='virtual_machine__cluster',
  220. queryset=Cluster.objects.all(),
  221. label='Cluster (ID)',
  222. )
  223. cluster = django_filters.ModelMultipleChoiceFilter(
  224. field_name='virtual_machine__cluster__name',
  225. queryset=Cluster.objects.all(),
  226. to_field_name='name',
  227. label='Cluster',
  228. )
  229. virtual_machine_id = django_filters.ModelMultipleChoiceFilter(
  230. field_name='virtual_machine',
  231. queryset=VirtualMachine.objects.all(),
  232. label='Virtual machine (ID)',
  233. )
  234. virtual_machine = django_filters.ModelMultipleChoiceFilter(
  235. field_name='virtual_machine__name',
  236. queryset=VirtualMachine.objects.all(),
  237. to_field_name='name',
  238. label='Virtual machine',
  239. )
  240. parent_id = django_filters.ModelMultipleChoiceFilter(
  241. field_name='parent',
  242. queryset=VMInterface.objects.all(),
  243. label='Parent interface (ID)',
  244. )
  245. mac_address = MultiValueMACAddressFilter(
  246. label='MAC address',
  247. )
  248. tag = TagFilter()
  249. class Meta:
  250. model = VMInterface
  251. fields = ['id', 'name', 'enabled', 'mtu']
  252. def search(self, queryset, name, value):
  253. if not value.strip():
  254. return queryset
  255. return queryset.filter(
  256. Q(name__icontains=value)
  257. )