filtersets.py 10 KB

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