2
0

filtersets.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473
  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, Interface
  5. from ipam.models import IPAddress, RouteTarget, VLAN
  6. from netbox.filtersets import NetBoxModelFilterSet, OrganizationalModelFilterSet
  7. from tenancy.filtersets import TenancyFilterSet
  8. from utilities.filters import ContentTypeFilter, MultiValueCharFilter, MultiValueNumberFilter
  9. from virtualization.models import VirtualMachine, VMInterface
  10. from .choices import *
  11. from .models import *
  12. __all__ = (
  13. 'IKEPolicyFilterSet',
  14. 'IKEProposalFilterSet',
  15. 'IPSecPolicyFilterSet',
  16. 'IPSecProfileFilterSet',
  17. 'IPSecProposalFilterSet',
  18. 'L2VPNFilterSet',
  19. 'L2VPNTerminationFilterSet',
  20. 'TunnelFilterSet',
  21. 'TunnelGroupFilterSet',
  22. 'TunnelTerminationFilterSet',
  23. )
  24. class TunnelGroupFilterSet(OrganizationalModelFilterSet):
  25. class Meta:
  26. model = TunnelGroup
  27. fields = ('id', 'name', 'slug', 'description')
  28. class TunnelFilterSet(NetBoxModelFilterSet, TenancyFilterSet):
  29. status = django_filters.MultipleChoiceFilter(
  30. choices=TunnelStatusChoices
  31. )
  32. group_id = django_filters.ModelMultipleChoiceFilter(
  33. queryset=TunnelGroup.objects.all(),
  34. label=_('Tunnel group (ID)'),
  35. )
  36. group = django_filters.ModelMultipleChoiceFilter(
  37. field_name='group__slug',
  38. queryset=TunnelGroup.objects.all(),
  39. to_field_name='slug',
  40. label=_('Tunnel group (slug)'),
  41. )
  42. encapsulation = django_filters.MultipleChoiceFilter(
  43. choices=TunnelEncapsulationChoices
  44. )
  45. ipsec_profile_id = django_filters.ModelMultipleChoiceFilter(
  46. queryset=IPSecProfile.objects.all(),
  47. label=_('IPSec profile (ID)'),
  48. )
  49. ipsec_profile = django_filters.ModelMultipleChoiceFilter(
  50. field_name='ipsec_profile__name',
  51. queryset=IPSecProfile.objects.all(),
  52. to_field_name='name',
  53. label=_('IPSec profile (name)'),
  54. )
  55. class Meta:
  56. model = Tunnel
  57. fields = ('id', 'name', 'tunnel_id', 'description')
  58. def search(self, queryset, name, value):
  59. if not value.strip():
  60. return queryset
  61. return queryset.filter(
  62. Q(name__icontains=value) |
  63. Q(description__icontains=value) |
  64. Q(comments__icontains=value)
  65. )
  66. class TunnelTerminationFilterSet(NetBoxModelFilterSet):
  67. tunnel_id = django_filters.ModelMultipleChoiceFilter(
  68. field_name='tunnel',
  69. queryset=Tunnel.objects.all(),
  70. label=_('Tunnel (ID)'),
  71. )
  72. tunnel = django_filters.ModelMultipleChoiceFilter(
  73. field_name='tunnel__name',
  74. queryset=Tunnel.objects.all(),
  75. to_field_name='name',
  76. label=_('Tunnel (name)'),
  77. )
  78. role = django_filters.MultipleChoiceFilter(
  79. choices=TunnelTerminationRoleChoices
  80. )
  81. termination_type = ContentTypeFilter()
  82. interface = django_filters.ModelMultipleChoiceFilter(
  83. field_name='interface__name',
  84. queryset=Interface.objects.all(),
  85. to_field_name='name',
  86. label=_('Interface (name)'),
  87. )
  88. interface_id = django_filters.ModelMultipleChoiceFilter(
  89. field_name='interface',
  90. queryset=Interface.objects.all(),
  91. label=_('Interface (ID)'),
  92. )
  93. vminterface = django_filters.ModelMultipleChoiceFilter(
  94. field_name='vminterface__name',
  95. queryset=VMInterface.objects.all(),
  96. to_field_name='name',
  97. label=_('VM interface (name)'),
  98. )
  99. vminterface_id = django_filters.ModelMultipleChoiceFilter(
  100. field_name='vminterface',
  101. queryset=VMInterface.objects.all(),
  102. label=_('VM interface (ID)'),
  103. )
  104. outside_ip_id = django_filters.ModelMultipleChoiceFilter(
  105. field_name='outside_ip',
  106. queryset=IPAddress.objects.all(),
  107. label=_('Outside IP (ID)'),
  108. )
  109. class Meta:
  110. model = TunnelTermination
  111. fields = ('id', 'termination_id')
  112. class IKEProposalFilterSet(NetBoxModelFilterSet):
  113. ike_policy_id = django_filters.ModelMultipleChoiceFilter(
  114. field_name='ike_policies',
  115. queryset=IKEPolicy.objects.all(),
  116. label=_('IKE policy (ID)'),
  117. )
  118. ike_policy = django_filters.ModelMultipleChoiceFilter(
  119. field_name='ike_policies__name',
  120. queryset=IKEPolicy.objects.all(),
  121. to_field_name='name',
  122. label=_('IKE policy (name)'),
  123. )
  124. authentication_method = django_filters.MultipleChoiceFilter(
  125. choices=AuthenticationMethodChoices
  126. )
  127. encryption_algorithm = django_filters.MultipleChoiceFilter(
  128. choices=EncryptionAlgorithmChoices
  129. )
  130. authentication_algorithm = django_filters.MultipleChoiceFilter(
  131. choices=AuthenticationAlgorithmChoices
  132. )
  133. group = django_filters.MultipleChoiceFilter(
  134. choices=DHGroupChoices
  135. )
  136. class Meta:
  137. model = IKEProposal
  138. fields = ('id', 'name', 'sa_lifetime', 'description')
  139. def search(self, queryset, name, value):
  140. if not value.strip():
  141. return queryset
  142. return queryset.filter(
  143. Q(name__icontains=value) |
  144. Q(description__icontains=value) |
  145. Q(comments__icontains=value)
  146. )
  147. class IKEPolicyFilterSet(NetBoxModelFilterSet):
  148. version = django_filters.MultipleChoiceFilter(
  149. choices=IKEVersionChoices
  150. )
  151. mode = django_filters.MultipleChoiceFilter(
  152. choices=IKEModeChoices
  153. )
  154. ike_proposal_id = django_filters.ModelMultipleChoiceFilter(
  155. field_name='proposals',
  156. queryset=IKEProposal.objects.all()
  157. )
  158. ike_proposal = django_filters.ModelMultipleChoiceFilter(
  159. field_name='proposals__name',
  160. queryset=IKEProposal.objects.all(),
  161. to_field_name='name'
  162. )
  163. # TODO: Remove in v4.1
  164. proposal = ike_proposal
  165. proposal_id = ike_proposal_id
  166. class Meta:
  167. model = IKEPolicy
  168. fields = ('id', 'name', 'preshared_key', 'description')
  169. def search(self, queryset, name, value):
  170. if not value.strip():
  171. return queryset
  172. return queryset.filter(
  173. Q(name__icontains=value) |
  174. Q(description__icontains=value) |
  175. Q(comments__icontains=value)
  176. )
  177. class IPSecProposalFilterSet(NetBoxModelFilterSet):
  178. ipsec_policy_id = django_filters.ModelMultipleChoiceFilter(
  179. field_name='ipsec_policies',
  180. queryset=IPSecPolicy.objects.all(),
  181. label=_('IPSec policy (ID)'),
  182. )
  183. ipsec_policy = django_filters.ModelMultipleChoiceFilter(
  184. field_name='ipsec_policies__name',
  185. queryset=IPSecPolicy.objects.all(),
  186. to_field_name='name',
  187. label=_('IPSec policy (name)'),
  188. )
  189. encryption_algorithm = django_filters.MultipleChoiceFilter(
  190. choices=EncryptionAlgorithmChoices
  191. )
  192. authentication_algorithm = django_filters.MultipleChoiceFilter(
  193. choices=AuthenticationAlgorithmChoices
  194. )
  195. class Meta:
  196. model = IPSecProposal
  197. fields = ('id', 'name', 'sa_lifetime_seconds', 'sa_lifetime_data', 'description')
  198. def search(self, queryset, name, value):
  199. if not value.strip():
  200. return queryset
  201. return queryset.filter(
  202. Q(name__icontains=value) |
  203. Q(description__icontains=value) |
  204. Q(comments__icontains=value)
  205. )
  206. class IPSecPolicyFilterSet(NetBoxModelFilterSet):
  207. pfs_group = django_filters.MultipleChoiceFilter(
  208. choices=DHGroupChoices
  209. )
  210. ipsec_proposal_id = django_filters.ModelMultipleChoiceFilter(
  211. field_name='proposals',
  212. queryset=IPSecProposal.objects.all()
  213. )
  214. ipsec_proposal = django_filters.ModelMultipleChoiceFilter(
  215. field_name='proposals__name',
  216. queryset=IPSecProposal.objects.all(),
  217. to_field_name='name'
  218. )
  219. # TODO: Remove in v4.1
  220. proposal = ipsec_proposal
  221. proposal_id = ipsec_proposal_id
  222. class Meta:
  223. model = IPSecPolicy
  224. fields = ('id', 'name', 'description')
  225. def search(self, queryset, name, value):
  226. if not value.strip():
  227. return queryset
  228. return queryset.filter(
  229. Q(name__icontains=value) |
  230. Q(description__icontains=value) |
  231. Q(comments__icontains=value)
  232. )
  233. class IPSecProfileFilterSet(NetBoxModelFilterSet):
  234. mode = django_filters.MultipleChoiceFilter(
  235. choices=IPSecModeChoices
  236. )
  237. ike_policy_id = django_filters.ModelMultipleChoiceFilter(
  238. queryset=IKEPolicy.objects.all(),
  239. label=_('IKE policy (ID)'),
  240. )
  241. ike_policy = django_filters.ModelMultipleChoiceFilter(
  242. field_name='ike_policy__name',
  243. queryset=IKEPolicy.objects.all(),
  244. to_field_name='name',
  245. label=_('IKE policy (name)'),
  246. )
  247. ipsec_policy_id = django_filters.ModelMultipleChoiceFilter(
  248. queryset=IPSecPolicy.objects.all(),
  249. label=_('IPSec policy (ID)'),
  250. )
  251. ipsec_policy = django_filters.ModelMultipleChoiceFilter(
  252. field_name='ipsec_policy__name',
  253. queryset=IPSecPolicy.objects.all(),
  254. to_field_name='name',
  255. label=_('IPSec policy (name)'),
  256. )
  257. class Meta:
  258. model = IPSecProfile
  259. fields = ('id', 'name', 'description')
  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. Q(comments__icontains=value)
  267. )
  268. class L2VPNFilterSet(NetBoxModelFilterSet, TenancyFilterSet):
  269. type = django_filters.MultipleChoiceFilter(
  270. choices=L2VPNTypeChoices,
  271. null_value=None
  272. )
  273. import_target_id = django_filters.ModelMultipleChoiceFilter(
  274. field_name='import_targets',
  275. queryset=RouteTarget.objects.all(),
  276. label=_('Import target'),
  277. )
  278. import_target = django_filters.ModelMultipleChoiceFilter(
  279. field_name='import_targets__name',
  280. queryset=RouteTarget.objects.all(),
  281. to_field_name='name',
  282. label=_('Import target (name)'),
  283. )
  284. export_target_id = django_filters.ModelMultipleChoiceFilter(
  285. field_name='export_targets',
  286. queryset=RouteTarget.objects.all(),
  287. label=_('Export target'),
  288. )
  289. export_target = django_filters.ModelMultipleChoiceFilter(
  290. field_name='export_targets__name',
  291. queryset=RouteTarget.objects.all(),
  292. to_field_name='name',
  293. label=_('Export target (name)'),
  294. )
  295. class Meta:
  296. model = L2VPN
  297. fields = ('id', 'identifier', 'name', 'slug', 'type', 'description')
  298. def search(self, queryset, name, value):
  299. if not value.strip():
  300. return queryset
  301. qs_filter = Q(name__icontains=value) | Q(description__icontains=value)
  302. try:
  303. qs_filter |= Q(identifier=int(value))
  304. except ValueError:
  305. pass
  306. return queryset.filter(qs_filter)
  307. class L2VPNTerminationFilterSet(NetBoxModelFilterSet):
  308. l2vpn_id = django_filters.ModelMultipleChoiceFilter(
  309. queryset=L2VPN.objects.all(),
  310. label=_('L2VPN (ID)'),
  311. )
  312. l2vpn = django_filters.ModelMultipleChoiceFilter(
  313. field_name='l2vpn__slug',
  314. queryset=L2VPN.objects.all(),
  315. to_field_name='slug',
  316. label=_('L2VPN (slug)'),
  317. )
  318. region = MultiValueCharFilter(
  319. method='filter_region',
  320. field_name='slug',
  321. label=_('Region (slug)'),
  322. )
  323. region_id = MultiValueNumberFilter(
  324. method='filter_region',
  325. field_name='pk',
  326. label=_('Region (ID)'),
  327. )
  328. site = MultiValueCharFilter(
  329. method='filter_site',
  330. field_name='slug',
  331. label=_('Site (slug)'),
  332. )
  333. site_id = MultiValueNumberFilter(
  334. method='filter_site',
  335. field_name='pk',
  336. label=_('Site (ID)'),
  337. )
  338. device = django_filters.ModelMultipleChoiceFilter(
  339. field_name='interface__device__name',
  340. queryset=Device.objects.all(),
  341. to_field_name='name',
  342. label=_('Device (name)'),
  343. )
  344. device_id = django_filters.ModelMultipleChoiceFilter(
  345. field_name='interface__device',
  346. queryset=Device.objects.all(),
  347. label=_('Device (ID)'),
  348. )
  349. virtual_machine = django_filters.ModelMultipleChoiceFilter(
  350. field_name='vminterface__virtual_machine__name',
  351. queryset=VirtualMachine.objects.all(),
  352. to_field_name='name',
  353. label=_('Virtual machine (name)'),
  354. )
  355. virtual_machine_id = django_filters.ModelMultipleChoiceFilter(
  356. field_name='vminterface__virtual_machine',
  357. queryset=VirtualMachine.objects.all(),
  358. label=_('Virtual machine (ID)'),
  359. )
  360. interface = django_filters.ModelMultipleChoiceFilter(
  361. field_name='interface__name',
  362. queryset=Interface.objects.all(),
  363. to_field_name='name',
  364. label=_('Interface (name)'),
  365. )
  366. interface_id = django_filters.ModelMultipleChoiceFilter(
  367. field_name='interface',
  368. queryset=Interface.objects.all(),
  369. label=_('Interface (ID)'),
  370. )
  371. vminterface = django_filters.ModelMultipleChoiceFilter(
  372. field_name='vminterface__name',
  373. queryset=VMInterface.objects.all(),
  374. to_field_name='name',
  375. label=_('VM interface (name)'),
  376. )
  377. vminterface_id = django_filters.ModelMultipleChoiceFilter(
  378. field_name='vminterface',
  379. queryset=VMInterface.objects.all(),
  380. label=_('VM Interface (ID)'),
  381. )
  382. vlan = django_filters.ModelMultipleChoiceFilter(
  383. field_name='vlan__name',
  384. queryset=VLAN.objects.all(),
  385. to_field_name='name',
  386. label=_('VLAN (name)'),
  387. )
  388. vlan_vid = django_filters.NumberFilter(
  389. field_name='vlan__vid',
  390. label=_('VLAN number (1-4094)'),
  391. )
  392. vlan_id = django_filters.ModelMultipleChoiceFilter(
  393. field_name='vlan',
  394. queryset=VLAN.objects.all(),
  395. label=_('VLAN (ID)'),
  396. )
  397. assigned_object_type = ContentTypeFilter()
  398. class Meta:
  399. model = L2VPNTermination
  400. fields = ('id', 'assigned_object_id')
  401. def search(self, queryset, name, value):
  402. if not value.strip():
  403. return queryset
  404. qs_filter = Q(l2vpn__name__icontains=value)
  405. return queryset.filter(qs_filter)
  406. def filter_assigned_object(self, queryset, name, value):
  407. qs = queryset.filter(
  408. Q(**{'{}__in'.format(name): value})
  409. )
  410. return qs
  411. def filter_site(self, queryset, name, value):
  412. qs = queryset.filter(
  413. Q(
  414. Q(**{'vlan__site__{}__in'.format(name): value}) |
  415. Q(**{'interface__device__site__{}__in'.format(name): value}) |
  416. Q(**{'vminterface__virtual_machine__site__{}__in'.format(name): value})
  417. )
  418. )
  419. return qs
  420. def filter_region(self, queryset, name, value):
  421. qs = queryset.filter(
  422. Q(
  423. Q(**{'vlan__site__region__{}__in'.format(name): value}) |
  424. Q(**{'interface__device__site__region__{}__in'.format(name): value}) |
  425. Q(**{'vminterface__virtual_machine__site__region__{}__in'.format(name): value})
  426. )
  427. )
  428. return qs