filtersets.py 11 KB

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