filtersets.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  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 netbox.filtersets import OrganizationalModelFilterSet, PrimaryModelFilterSet
  6. from tenancy.filtersets import TenancyFilterSet
  7. from utilities.filters import MultiValueMACAddressFilter, TreeNodeMultipleChoiceFilter
  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. class Meta:
  87. model = Cluster
  88. fields = ['id', 'name']
  89. def search(self, queryset, name, value):
  90. if not value.strip():
  91. return queryset
  92. return queryset.filter(
  93. Q(name__icontains=value) |
  94. Q(comments__icontains=value)
  95. )
  96. class VirtualMachineFilterSet(PrimaryModelFilterSet, TenancyFilterSet, LocalConfigContextFilterSet):
  97. q = django_filters.CharFilter(
  98. method='search',
  99. label='Search',
  100. )
  101. status = django_filters.MultipleChoiceFilter(
  102. choices=VirtualMachineStatusChoices,
  103. null_value=None
  104. )
  105. cluster_group_id = django_filters.ModelMultipleChoiceFilter(
  106. field_name='cluster__group',
  107. queryset=ClusterGroup.objects.all(),
  108. label='Cluster group (ID)',
  109. )
  110. cluster_group = django_filters.ModelMultipleChoiceFilter(
  111. field_name='cluster__group__slug',
  112. queryset=ClusterGroup.objects.all(),
  113. to_field_name='slug',
  114. label='Cluster group (slug)',
  115. )
  116. cluster_type_id = django_filters.ModelMultipleChoiceFilter(
  117. field_name='cluster__type',
  118. queryset=ClusterType.objects.all(),
  119. label='Cluster type (ID)',
  120. )
  121. cluster_type = django_filters.ModelMultipleChoiceFilter(
  122. field_name='cluster__type__slug',
  123. queryset=ClusterType.objects.all(),
  124. to_field_name='slug',
  125. label='Cluster type (slug)',
  126. )
  127. cluster_id = django_filters.ModelMultipleChoiceFilter(
  128. queryset=Cluster.objects.all(),
  129. label='Cluster (ID)',
  130. )
  131. cluster = django_filters.ModelMultipleChoiceFilter(
  132. field_name='cluster__name',
  133. queryset=Cluster.objects.all(),
  134. to_field_name='name',
  135. label='Cluster',
  136. )
  137. region_id = TreeNodeMultipleChoiceFilter(
  138. queryset=Region.objects.all(),
  139. field_name='cluster__site__region',
  140. lookup_expr='in',
  141. label='Region (ID)',
  142. )
  143. region = TreeNodeMultipleChoiceFilter(
  144. queryset=Region.objects.all(),
  145. field_name='cluster__site__region',
  146. lookup_expr='in',
  147. to_field_name='slug',
  148. label='Region (slug)',
  149. )
  150. site_group_id = TreeNodeMultipleChoiceFilter(
  151. queryset=SiteGroup.objects.all(),
  152. field_name='cluster__site__group',
  153. lookup_expr='in',
  154. label='Site group (ID)',
  155. )
  156. site_group = TreeNodeMultipleChoiceFilter(
  157. queryset=SiteGroup.objects.all(),
  158. field_name='cluster__site__group',
  159. lookup_expr='in',
  160. to_field_name='slug',
  161. label='Site group (slug)',
  162. )
  163. site_id = django_filters.ModelMultipleChoiceFilter(
  164. field_name='cluster__site',
  165. queryset=Site.objects.all(),
  166. label='Site (ID)',
  167. )
  168. site = django_filters.ModelMultipleChoiceFilter(
  169. field_name='cluster__site__slug',
  170. queryset=Site.objects.all(),
  171. to_field_name='slug',
  172. label='Site (slug)',
  173. )
  174. role_id = django_filters.ModelMultipleChoiceFilter(
  175. queryset=DeviceRole.objects.all(),
  176. label='Role (ID)',
  177. )
  178. role = django_filters.ModelMultipleChoiceFilter(
  179. field_name='role__slug',
  180. queryset=DeviceRole.objects.all(),
  181. to_field_name='slug',
  182. label='Role (slug)',
  183. )
  184. platform_id = django_filters.ModelMultipleChoiceFilter(
  185. queryset=Platform.objects.all(),
  186. label='Platform (ID)',
  187. )
  188. platform = django_filters.ModelMultipleChoiceFilter(
  189. field_name='platform__slug',
  190. queryset=Platform.objects.all(),
  191. to_field_name='slug',
  192. label='Platform (slug)',
  193. )
  194. mac_address = MultiValueMACAddressFilter(
  195. field_name='interfaces__mac_address',
  196. label='MAC address',
  197. )
  198. has_primary_ip = django_filters.BooleanFilter(
  199. method='_has_primary_ip',
  200. label='Has a primary IP',
  201. )
  202. class Meta:
  203. model = VirtualMachine
  204. fields = ['id', 'name', 'cluster', 'vcpus', 'memory', 'disk']
  205. def search(self, queryset, name, value):
  206. if not value.strip():
  207. return queryset
  208. return queryset.filter(
  209. Q(name__icontains=value) |
  210. Q(comments__icontains=value)
  211. )
  212. def _has_primary_ip(self, queryset, name, value):
  213. params = Q(primary_ip4__isnull=False) | Q(primary_ip6__isnull=False)
  214. if value:
  215. return queryset.filter(params)
  216. return queryset.exclude(params)
  217. class VMInterfaceFilterSet(PrimaryModelFilterSet):
  218. q = django_filters.CharFilter(
  219. method='search',
  220. label='Search',
  221. )
  222. cluster_id = django_filters.ModelMultipleChoiceFilter(
  223. field_name='virtual_machine__cluster',
  224. queryset=Cluster.objects.all(),
  225. label='Cluster (ID)',
  226. )
  227. cluster = django_filters.ModelMultipleChoiceFilter(
  228. field_name='virtual_machine__cluster__name',
  229. queryset=Cluster.objects.all(),
  230. to_field_name='name',
  231. label='Cluster',
  232. )
  233. virtual_machine_id = django_filters.ModelMultipleChoiceFilter(
  234. field_name='virtual_machine',
  235. queryset=VirtualMachine.objects.all(),
  236. label='Virtual machine (ID)',
  237. )
  238. virtual_machine = django_filters.ModelMultipleChoiceFilter(
  239. field_name='virtual_machine__name',
  240. queryset=VirtualMachine.objects.all(),
  241. to_field_name='name',
  242. label='Virtual machine',
  243. )
  244. parent_id = django_filters.ModelMultipleChoiceFilter(
  245. field_name='parent',
  246. queryset=VMInterface.objects.all(),
  247. label='Parent interface (ID)',
  248. )
  249. bridge_id = django_filters.ModelMultipleChoiceFilter(
  250. field_name='bridge',
  251. queryset=VMInterface.objects.all(),
  252. label='Bridged interface (ID)',
  253. )
  254. mac_address = MultiValueMACAddressFilter(
  255. label='MAC address',
  256. )
  257. class Meta:
  258. model = VMInterface
  259. fields = ['id', 'name', 'enabled', 'mtu']
  260. def search(self, queryset, name, value):
  261. if not value.strip():
  262. return queryset
  263. return queryset.filter(
  264. Q(name__icontains=value) |
  265. Q(description__icontains=value)
  266. )