filtersets.py 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. import django_filters
  2. from django.db.models import Q
  3. from dcim.models import Device, 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 MultiValueCharFilter, 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. status = django_filters.MultipleChoiceFilter(
  84. choices=ClusterStatusChoices,
  85. null_value=None
  86. )
  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(
  98. NetBoxModelFilterSet,
  99. TenancyFilterSet,
  100. ContactModelFilterSet,
  101. LocalConfigContextFilterSet
  102. ):
  103. status = django_filters.MultipleChoiceFilter(
  104. choices=VirtualMachineStatusChoices,
  105. null_value=None
  106. )
  107. cluster_group_id = django_filters.ModelMultipleChoiceFilter(
  108. field_name='cluster__group',
  109. queryset=ClusterGroup.objects.all(),
  110. label='Cluster group (ID)',
  111. )
  112. cluster_group = django_filters.ModelMultipleChoiceFilter(
  113. field_name='cluster__group__slug',
  114. queryset=ClusterGroup.objects.all(),
  115. to_field_name='slug',
  116. label='Cluster group (slug)',
  117. )
  118. cluster_type_id = django_filters.ModelMultipleChoiceFilter(
  119. field_name='cluster__type',
  120. queryset=ClusterType.objects.all(),
  121. label='Cluster type (ID)',
  122. )
  123. cluster_type = django_filters.ModelMultipleChoiceFilter(
  124. field_name='cluster__type__slug',
  125. queryset=ClusterType.objects.all(),
  126. to_field_name='slug',
  127. label='Cluster type (slug)',
  128. )
  129. cluster_id = django_filters.ModelMultipleChoiceFilter(
  130. queryset=Cluster.objects.all(),
  131. label='Cluster (ID)',
  132. )
  133. cluster = django_filters.ModelMultipleChoiceFilter(
  134. field_name='cluster__name',
  135. queryset=Cluster.objects.all(),
  136. to_field_name='name',
  137. label='Cluster',
  138. )
  139. device_id = django_filters.ModelMultipleChoiceFilter(
  140. queryset=Device.objects.all(),
  141. label='Device (ID)',
  142. )
  143. device = django_filters.ModelMultipleChoiceFilter(
  144. field_name='device__name',
  145. queryset=Device.objects.all(),
  146. to_field_name='name',
  147. label='Device',
  148. )
  149. region_id = TreeNodeMultipleChoiceFilter(
  150. queryset=Region.objects.all(),
  151. field_name='site__region',
  152. lookup_expr='in',
  153. label='Region (ID)',
  154. )
  155. region = TreeNodeMultipleChoiceFilter(
  156. queryset=Region.objects.all(),
  157. field_name='site__region',
  158. lookup_expr='in',
  159. to_field_name='slug',
  160. label='Region (slug)',
  161. )
  162. site_group_id = TreeNodeMultipleChoiceFilter(
  163. queryset=SiteGroup.objects.all(),
  164. field_name='site__group',
  165. lookup_expr='in',
  166. label='Site group (ID)',
  167. )
  168. site_group = TreeNodeMultipleChoiceFilter(
  169. queryset=SiteGroup.objects.all(),
  170. field_name='site__group',
  171. lookup_expr='in',
  172. to_field_name='slug',
  173. label='Site group (slug)',
  174. )
  175. site_id = django_filters.ModelMultipleChoiceFilter(
  176. queryset=Site.objects.all(),
  177. label='Site (ID)',
  178. )
  179. site = django_filters.ModelMultipleChoiceFilter(
  180. field_name='site__slug',
  181. queryset=Site.objects.all(),
  182. to_field_name='slug',
  183. label='Site (slug)',
  184. )
  185. name = MultiValueCharFilter(
  186. lookup_expr='iexact'
  187. )
  188. role_id = django_filters.ModelMultipleChoiceFilter(
  189. queryset=DeviceRole.objects.all(),
  190. label='Role (ID)',
  191. )
  192. role = django_filters.ModelMultipleChoiceFilter(
  193. field_name='role__slug',
  194. queryset=DeviceRole.objects.all(),
  195. to_field_name='slug',
  196. label='Role (slug)',
  197. )
  198. platform_id = django_filters.ModelMultipleChoiceFilter(
  199. queryset=Platform.objects.all(),
  200. label='Platform (ID)',
  201. )
  202. platform = django_filters.ModelMultipleChoiceFilter(
  203. field_name='platform__slug',
  204. queryset=Platform.objects.all(),
  205. to_field_name='slug',
  206. label='Platform (slug)',
  207. )
  208. mac_address = MultiValueMACAddressFilter(
  209. field_name='interfaces__mac_address',
  210. label='MAC address',
  211. )
  212. has_primary_ip = django_filters.BooleanFilter(
  213. method='_has_primary_ip',
  214. label='Has a primary IP',
  215. )
  216. class Meta:
  217. model = VirtualMachine
  218. fields = ['id', 'cluster', 'vcpus', 'memory', 'disk']
  219. def search(self, queryset, name, value):
  220. if not value.strip():
  221. return queryset
  222. return queryset.filter(
  223. Q(name__icontains=value) |
  224. Q(comments__icontains=value)
  225. )
  226. def _has_primary_ip(self, queryset, name, value):
  227. params = Q(primary_ip4__isnull=False) | Q(primary_ip6__isnull=False)
  228. if value:
  229. return queryset.filter(params)
  230. return queryset.exclude(params)
  231. class VMInterfaceFilterSet(NetBoxModelFilterSet):
  232. cluster_id = django_filters.ModelMultipleChoiceFilter(
  233. field_name='virtual_machine__cluster',
  234. queryset=Cluster.objects.all(),
  235. label='Cluster (ID)',
  236. )
  237. cluster = django_filters.ModelMultipleChoiceFilter(
  238. field_name='virtual_machine__cluster__name',
  239. queryset=Cluster.objects.all(),
  240. to_field_name='name',
  241. label='Cluster',
  242. )
  243. virtual_machine_id = django_filters.ModelMultipleChoiceFilter(
  244. field_name='virtual_machine',
  245. queryset=VirtualMachine.objects.all(),
  246. label='Virtual machine (ID)',
  247. )
  248. virtual_machine = django_filters.ModelMultipleChoiceFilter(
  249. field_name='virtual_machine__name',
  250. queryset=VirtualMachine.objects.all(),
  251. to_field_name='name',
  252. label='Virtual machine',
  253. )
  254. parent_id = django_filters.ModelMultipleChoiceFilter(
  255. field_name='parent',
  256. queryset=VMInterface.objects.all(),
  257. label='Parent interface (ID)',
  258. )
  259. bridge_id = django_filters.ModelMultipleChoiceFilter(
  260. field_name='bridge',
  261. queryset=VMInterface.objects.all(),
  262. label='Bridged interface (ID)',
  263. )
  264. mac_address = MultiValueMACAddressFilter(
  265. label='MAC address',
  266. )
  267. vrf_id = django_filters.ModelMultipleChoiceFilter(
  268. field_name='vrf',
  269. queryset=VRF.objects.all(),
  270. label='VRF',
  271. )
  272. vrf = django_filters.ModelMultipleChoiceFilter(
  273. field_name='vrf__rd',
  274. queryset=VRF.objects.all(),
  275. to_field_name='rd',
  276. label='VRF (RD)',
  277. )
  278. class Meta:
  279. model = VMInterface
  280. fields = ['id', 'name', 'enabled', 'mtu', 'description']
  281. def search(self, queryset, name, value):
  282. if not value.strip():
  283. return queryset
  284. return queryset.filter(
  285. Q(name__icontains=value) |
  286. Q(description__icontains=value)
  287. )