filtersets.py 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  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 ipam.models import VRF
  6. from netbox.filtersets import OrganizationalModelFilterSet, NetBoxModelFilterSet
  7. from tenancy.filtersets import TenancyFilterSet, ContactModelFilterSet
  8. from utilities.filters import MultiValueMACAddressFilter, TreeNodeMultipleChoiceFilter
  9. from .choices import *
  10. from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface
  11. __all__ = (
  12. 'ClusterFilterSet',
  13. 'ClusterGroupFilterSet',
  14. 'ClusterTypeFilterSet',
  15. 'VirtualMachineFilterSet',
  16. 'VMInterfaceFilterSet',
  17. )
  18. class ClusterTypeFilterSet(OrganizationalModelFilterSet):
  19. class Meta:
  20. model = ClusterType
  21. fields = ['id', 'name', 'slug', 'description']
  22. class ClusterGroupFilterSet(OrganizationalModelFilterSet, ContactModelFilterSet):
  23. class Meta:
  24. model = ClusterGroup
  25. fields = ['id', 'name', 'slug', 'description']
  26. class ClusterFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilterSet):
  27. region_id = TreeNodeMultipleChoiceFilter(
  28. queryset=Region.objects.all(),
  29. field_name='site__region',
  30. lookup_expr='in',
  31. label='Region (ID)',
  32. )
  33. region = TreeNodeMultipleChoiceFilter(
  34. queryset=Region.objects.all(),
  35. field_name='site__region',
  36. lookup_expr='in',
  37. to_field_name='slug',
  38. label='Region (slug)',
  39. )
  40. site_group_id = TreeNodeMultipleChoiceFilter(
  41. queryset=SiteGroup.objects.all(),
  42. field_name='site__group',
  43. lookup_expr='in',
  44. label='Site group (ID)',
  45. )
  46. site_group = TreeNodeMultipleChoiceFilter(
  47. queryset=SiteGroup.objects.all(),
  48. field_name='site__group',
  49. lookup_expr='in',
  50. to_field_name='slug',
  51. label='Site group (slug)',
  52. )
  53. site_id = django_filters.ModelMultipleChoiceFilter(
  54. queryset=Site.objects.all(),
  55. label='Site (ID)',
  56. )
  57. site = django_filters.ModelMultipleChoiceFilter(
  58. field_name='site__slug',
  59. queryset=Site.objects.all(),
  60. to_field_name='slug',
  61. label='Site (slug)',
  62. )
  63. group_id = django_filters.ModelMultipleChoiceFilter(
  64. queryset=ClusterGroup.objects.all(),
  65. label='Parent group (ID)',
  66. )
  67. group = django_filters.ModelMultipleChoiceFilter(
  68. field_name='group__slug',
  69. queryset=ClusterGroup.objects.all(),
  70. to_field_name='slug',
  71. label='Parent group (slug)',
  72. )
  73. type_id = django_filters.ModelMultipleChoiceFilter(
  74. queryset=ClusterType.objects.all(),
  75. label='Cluster type (ID)',
  76. )
  77. type = django_filters.ModelMultipleChoiceFilter(
  78. field_name='type__slug',
  79. queryset=ClusterType.objects.all(),
  80. to_field_name='slug',
  81. label='Cluster type (slug)',
  82. )
  83. class Meta:
  84. model = Cluster
  85. fields = ['id', 'name']
  86. def search(self, queryset, name, value):
  87. if not value.strip():
  88. return queryset
  89. return queryset.filter(
  90. Q(name__icontains=value) |
  91. Q(comments__icontains=value)
  92. )
  93. class VirtualMachineFilterSet(
  94. NetBoxModelFilterSet,
  95. TenancyFilterSet,
  96. ContactModelFilterSet,
  97. LocalConfigContextFilterSet
  98. ):
  99. status = django_filters.MultipleChoiceFilter(
  100. choices=VirtualMachineStatusChoices,
  101. null_value=None
  102. )
  103. cluster_group_id = django_filters.ModelMultipleChoiceFilter(
  104. field_name='cluster__group',
  105. queryset=ClusterGroup.objects.all(),
  106. label='Cluster group (ID)',
  107. )
  108. cluster_group = django_filters.ModelMultipleChoiceFilter(
  109. field_name='cluster__group__slug',
  110. queryset=ClusterGroup.objects.all(),
  111. to_field_name='slug',
  112. label='Cluster group (slug)',
  113. )
  114. cluster_type_id = django_filters.ModelMultipleChoiceFilter(
  115. field_name='cluster__type',
  116. queryset=ClusterType.objects.all(),
  117. label='Cluster type (ID)',
  118. )
  119. cluster_type = django_filters.ModelMultipleChoiceFilter(
  120. field_name='cluster__type__slug',
  121. queryset=ClusterType.objects.all(),
  122. to_field_name='slug',
  123. label='Cluster type (slug)',
  124. )
  125. cluster_id = django_filters.ModelMultipleChoiceFilter(
  126. queryset=Cluster.objects.all(),
  127. label='Cluster (ID)',
  128. )
  129. cluster = django_filters.ModelMultipleChoiceFilter(
  130. field_name='cluster__name',
  131. queryset=Cluster.objects.all(),
  132. to_field_name='name',
  133. label='Cluster',
  134. )
  135. region_id = TreeNodeMultipleChoiceFilter(
  136. queryset=Region.objects.all(),
  137. field_name='cluster__site__region',
  138. lookup_expr='in',
  139. label='Region (ID)',
  140. )
  141. region = TreeNodeMultipleChoiceFilter(
  142. queryset=Region.objects.all(),
  143. field_name='cluster__site__region',
  144. lookup_expr='in',
  145. to_field_name='slug',
  146. label='Region (slug)',
  147. )
  148. site_group_id = TreeNodeMultipleChoiceFilter(
  149. queryset=SiteGroup.objects.all(),
  150. field_name='cluster__site__group',
  151. lookup_expr='in',
  152. label='Site group (ID)',
  153. )
  154. site_group = TreeNodeMultipleChoiceFilter(
  155. queryset=SiteGroup.objects.all(),
  156. field_name='cluster__site__group',
  157. lookup_expr='in',
  158. to_field_name='slug',
  159. label='Site group (slug)',
  160. )
  161. site_id = django_filters.ModelMultipleChoiceFilter(
  162. field_name='cluster__site',
  163. queryset=Site.objects.all(),
  164. label='Site (ID)',
  165. )
  166. site = django_filters.ModelMultipleChoiceFilter(
  167. field_name='cluster__site__slug',
  168. queryset=Site.objects.all(),
  169. to_field_name='slug',
  170. label='Site (slug)',
  171. )
  172. role_id = django_filters.ModelMultipleChoiceFilter(
  173. queryset=DeviceRole.objects.all(),
  174. label='Role (ID)',
  175. )
  176. role = django_filters.ModelMultipleChoiceFilter(
  177. field_name='role__slug',
  178. queryset=DeviceRole.objects.all(),
  179. to_field_name='slug',
  180. label='Role (slug)',
  181. )
  182. platform_id = django_filters.ModelMultipleChoiceFilter(
  183. queryset=Platform.objects.all(),
  184. label='Platform (ID)',
  185. )
  186. platform = django_filters.ModelMultipleChoiceFilter(
  187. field_name='platform__slug',
  188. queryset=Platform.objects.all(),
  189. to_field_name='slug',
  190. label='Platform (slug)',
  191. )
  192. mac_address = MultiValueMACAddressFilter(
  193. field_name='interfaces__mac_address',
  194. label='MAC address',
  195. )
  196. has_primary_ip = django_filters.BooleanFilter(
  197. method='_has_primary_ip',
  198. label='Has a primary IP',
  199. )
  200. class Meta:
  201. model = VirtualMachine
  202. fields = ['id', 'name', 'cluster', 'vcpus', 'memory', 'disk']
  203. def search(self, queryset, name, value):
  204. if not value.strip():
  205. return queryset
  206. return queryset.filter(
  207. Q(name__icontains=value) |
  208. Q(comments__icontains=value)
  209. )
  210. def _has_primary_ip(self, queryset, name, value):
  211. params = Q(primary_ip4__isnull=False) | Q(primary_ip6__isnull=False)
  212. if value:
  213. return queryset.filter(params)
  214. return queryset.exclude(params)
  215. class VMInterfaceFilterSet(NetBoxModelFilterSet):
  216. cluster_id = django_filters.ModelMultipleChoiceFilter(
  217. field_name='virtual_machine__cluster',
  218. queryset=Cluster.objects.all(),
  219. label='Cluster (ID)',
  220. )
  221. cluster = django_filters.ModelMultipleChoiceFilter(
  222. field_name='virtual_machine__cluster__name',
  223. queryset=Cluster.objects.all(),
  224. to_field_name='name',
  225. label='Cluster',
  226. )
  227. virtual_machine_id = django_filters.ModelMultipleChoiceFilter(
  228. field_name='virtual_machine',
  229. queryset=VirtualMachine.objects.all(),
  230. label='Virtual machine (ID)',
  231. )
  232. virtual_machine = django_filters.ModelMultipleChoiceFilter(
  233. field_name='virtual_machine__name',
  234. queryset=VirtualMachine.objects.all(),
  235. to_field_name='name',
  236. label='Virtual machine',
  237. )
  238. parent_id = django_filters.ModelMultipleChoiceFilter(
  239. field_name='parent',
  240. queryset=VMInterface.objects.all(),
  241. label='Parent interface (ID)',
  242. )
  243. bridge_id = django_filters.ModelMultipleChoiceFilter(
  244. field_name='bridge',
  245. queryset=VMInterface.objects.all(),
  246. label='Bridged interface (ID)',
  247. )
  248. mac_address = MultiValueMACAddressFilter(
  249. label='MAC address',
  250. )
  251. vrf_id = django_filters.ModelMultipleChoiceFilter(
  252. field_name='vrf',
  253. queryset=VRF.objects.all(),
  254. label='VRF',
  255. )
  256. vrf = django_filters.ModelMultipleChoiceFilter(
  257. field_name='vrf__rd',
  258. queryset=VRF.objects.all(),
  259. to_field_name='rd',
  260. label='VRF (RD)',
  261. )
  262. class Meta:
  263. model = VMInterface
  264. fields = ['id', 'name', 'enabled', 'mtu', 'description']
  265. def search(self, queryset, name, value):
  266. if not value.strip():
  267. return queryset
  268. return queryset.filter(
  269. Q(name__icontains=value) |
  270. Q(description__icontains=value)
  271. )