filtersets.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  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 ContactModelFilterSet, 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, ContactModelFilterSet):
  25. class Meta:
  26. model = TunnelGroup
  27. fields = ('id', 'name', 'slug', 'description')
  28. class TunnelFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilterSet):
  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. class Meta:
  164. model = IKEPolicy
  165. fields = ('id', 'name', 'preshared_key', 'description')
  166. def search(self, queryset, name, value):
  167. if not value.strip():
  168. return queryset
  169. return queryset.filter(
  170. Q(name__icontains=value) |
  171. Q(description__icontains=value) |
  172. Q(comments__icontains=value)
  173. )
  174. class IPSecProposalFilterSet(NetBoxModelFilterSet):
  175. ipsec_policy_id = django_filters.ModelMultipleChoiceFilter(
  176. field_name='ipsec_policies',
  177. queryset=IPSecPolicy.objects.all(),
  178. label=_('IPSec policy (ID)'),
  179. )
  180. ipsec_policy = django_filters.ModelMultipleChoiceFilter(
  181. field_name='ipsec_policies__name',
  182. queryset=IPSecPolicy.objects.all(),
  183. to_field_name='name',
  184. label=_('IPSec policy (name)'),
  185. )
  186. encryption_algorithm = django_filters.MultipleChoiceFilter(
  187. choices=EncryptionAlgorithmChoices
  188. )
  189. authentication_algorithm = django_filters.MultipleChoiceFilter(
  190. choices=AuthenticationAlgorithmChoices
  191. )
  192. class Meta:
  193. model = IPSecProposal
  194. fields = ('id', 'name', 'sa_lifetime_seconds', 'sa_lifetime_data', 'description')
  195. def search(self, queryset, name, value):
  196. if not value.strip():
  197. return queryset
  198. return queryset.filter(
  199. Q(name__icontains=value) |
  200. Q(description__icontains=value) |
  201. Q(comments__icontains=value)
  202. )
  203. class IPSecPolicyFilterSet(NetBoxModelFilterSet):
  204. pfs_group = django_filters.MultipleChoiceFilter(
  205. choices=DHGroupChoices
  206. )
  207. ipsec_proposal_id = django_filters.ModelMultipleChoiceFilter(
  208. field_name='proposals',
  209. queryset=IPSecProposal.objects.all()
  210. )
  211. ipsec_proposal = django_filters.ModelMultipleChoiceFilter(
  212. field_name='proposals__name',
  213. queryset=IPSecProposal.objects.all(),
  214. to_field_name='name'
  215. )
  216. class Meta:
  217. model = IPSecPolicy
  218. fields = ('id', 'name', 'description')
  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(description__icontains=value) |
  225. Q(comments__icontains=value)
  226. )
  227. class IPSecProfileFilterSet(NetBoxModelFilterSet):
  228. mode = django_filters.MultipleChoiceFilter(
  229. choices=IPSecModeChoices
  230. )
  231. ike_policy_id = django_filters.ModelMultipleChoiceFilter(
  232. queryset=IKEPolicy.objects.all(),
  233. label=_('IKE policy (ID)'),
  234. )
  235. ike_policy = django_filters.ModelMultipleChoiceFilter(
  236. field_name='ike_policy__name',
  237. queryset=IKEPolicy.objects.all(),
  238. to_field_name='name',
  239. label=_('IKE policy (name)'),
  240. )
  241. ipsec_policy_id = django_filters.ModelMultipleChoiceFilter(
  242. queryset=IPSecPolicy.objects.all(),
  243. label=_('IPSec policy (ID)'),
  244. )
  245. ipsec_policy = django_filters.ModelMultipleChoiceFilter(
  246. field_name='ipsec_policy__name',
  247. queryset=IPSecPolicy.objects.all(),
  248. to_field_name='name',
  249. label=_('IPSec policy (name)'),
  250. )
  251. class Meta:
  252. model = IPSecProfile
  253. fields = ('id', 'name', 'description')
  254. def search(self, queryset, name, value):
  255. if not value.strip():
  256. return queryset
  257. return queryset.filter(
  258. Q(name__icontains=value) |
  259. Q(description__icontains=value) |
  260. Q(comments__icontains=value)
  261. )
  262. class L2VPNFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilterSet):
  263. type = django_filters.MultipleChoiceFilter(
  264. choices=L2VPNTypeChoices,
  265. null_value=None
  266. )
  267. status = django_filters.MultipleChoiceFilter(
  268. choices=L2VPNStatusChoices,
  269. )
  270. import_target_id = django_filters.ModelMultipleChoiceFilter(
  271. field_name='import_targets',
  272. queryset=RouteTarget.objects.all(),
  273. label=_('Import target'),
  274. )
  275. import_target = django_filters.ModelMultipleChoiceFilter(
  276. field_name='import_targets__name',
  277. queryset=RouteTarget.objects.all(),
  278. to_field_name='name',
  279. label=_('Import target (name)'),
  280. )
  281. export_target_id = django_filters.ModelMultipleChoiceFilter(
  282. field_name='export_targets',
  283. queryset=RouteTarget.objects.all(),
  284. label=_('Export target'),
  285. )
  286. export_target = django_filters.ModelMultipleChoiceFilter(
  287. field_name='export_targets__name',
  288. queryset=RouteTarget.objects.all(),
  289. to_field_name='name',
  290. label=_('Export target (name)'),
  291. )
  292. class Meta:
  293. model = L2VPN
  294. fields = ('id', 'identifier', 'name', 'slug', 'status', 'type', 'description')
  295. def search(self, queryset, name, value):
  296. if not value.strip():
  297. return queryset
  298. qs_filter = Q(name__icontains=value) | Q(description__icontains=value)
  299. try:
  300. qs_filter |= Q(identifier=int(value))
  301. except ValueError:
  302. pass
  303. return queryset.filter(qs_filter)
  304. class L2VPNTerminationFilterSet(NetBoxModelFilterSet):
  305. l2vpn_id = django_filters.ModelMultipleChoiceFilter(
  306. queryset=L2VPN.objects.all(),
  307. label=_('L2VPN (ID)'),
  308. )
  309. l2vpn = django_filters.ModelMultipleChoiceFilter(
  310. field_name='l2vpn__slug',
  311. queryset=L2VPN.objects.all(),
  312. to_field_name='slug',
  313. label=_('L2VPN (slug)'),
  314. )
  315. region = MultiValueCharFilter(
  316. method='filter_region',
  317. field_name='slug',
  318. label=_('Region (slug)'),
  319. )
  320. region_id = MultiValueNumberFilter(
  321. method='filter_region',
  322. field_name='pk',
  323. label=_('Region (ID)'),
  324. )
  325. site = MultiValueCharFilter(
  326. method='filter_site',
  327. field_name='slug',
  328. label=_('Site (slug)'),
  329. )
  330. site_id = MultiValueNumberFilter(
  331. method='filter_site',
  332. field_name='pk',
  333. label=_('Site (ID)'),
  334. )
  335. device = django_filters.ModelMultipleChoiceFilter(
  336. field_name='interface__device__name',
  337. queryset=Device.objects.all(),
  338. to_field_name='name',
  339. label=_('Device (name)'),
  340. )
  341. device_id = django_filters.ModelMultipleChoiceFilter(
  342. field_name='interface__device',
  343. queryset=Device.objects.all(),
  344. label=_('Device (ID)'),
  345. )
  346. virtual_machine = django_filters.ModelMultipleChoiceFilter(
  347. field_name='vminterface__virtual_machine__name',
  348. queryset=VirtualMachine.objects.all(),
  349. to_field_name='name',
  350. label=_('Virtual machine (name)'),
  351. )
  352. virtual_machine_id = django_filters.ModelMultipleChoiceFilter(
  353. field_name='vminterface__virtual_machine',
  354. queryset=VirtualMachine.objects.all(),
  355. label=_('Virtual machine (ID)'),
  356. )
  357. interface = django_filters.ModelMultipleChoiceFilter(
  358. field_name='interface__name',
  359. queryset=Interface.objects.all(),
  360. to_field_name='name',
  361. label=_('Interface (name)'),
  362. )
  363. interface_id = django_filters.ModelMultipleChoiceFilter(
  364. field_name='interface',
  365. queryset=Interface.objects.all(),
  366. label=_('Interface (ID)'),
  367. )
  368. vminterface = django_filters.ModelMultipleChoiceFilter(
  369. field_name='vminterface__name',
  370. queryset=VMInterface.objects.all(),
  371. to_field_name='name',
  372. label=_('VM interface (name)'),
  373. )
  374. vminterface_id = django_filters.ModelMultipleChoiceFilter(
  375. field_name='vminterface',
  376. queryset=VMInterface.objects.all(),
  377. label=_('VM Interface (ID)'),
  378. )
  379. vlan = django_filters.ModelMultipleChoiceFilter(
  380. field_name='vlan__name',
  381. queryset=VLAN.objects.all(),
  382. to_field_name='name',
  383. label=_('VLAN (name)'),
  384. )
  385. vlan_vid = django_filters.NumberFilter(
  386. field_name='vlan__vid',
  387. label=_('VLAN number (1-4094)'),
  388. )
  389. vlan_id = django_filters.ModelMultipleChoiceFilter(
  390. field_name='vlan',
  391. queryset=VLAN.objects.all(),
  392. label=_('VLAN (ID)'),
  393. )
  394. assigned_object_type = ContentTypeFilter()
  395. class Meta:
  396. model = L2VPNTermination
  397. fields = ('id', 'assigned_object_id')
  398. def search(self, queryset, name, value):
  399. if not value.strip():
  400. return queryset
  401. qs_filter = Q(l2vpn__name__icontains=value)
  402. return queryset.filter(qs_filter)
  403. def filter_assigned_object(self, queryset, name, value):
  404. qs = queryset.filter(
  405. Q(**{'{}__in'.format(name): value})
  406. )
  407. return qs
  408. def filter_site(self, queryset, name, value):
  409. qs = queryset.filter(
  410. Q(
  411. Q(**{'vlan__site__{}__in'.format(name): value}) |
  412. Q(**{'interface__device__site__{}__in'.format(name): value}) |
  413. Q(**{'vminterface__virtual_machine__site__{}__in'.format(name): value})
  414. )
  415. )
  416. return qs
  417. def filter_region(self, queryset, name, value):
  418. qs = queryset.filter(
  419. Q(
  420. Q(**{'vlan__site__region__{}__in'.format(name): value}) |
  421. Q(**{'interface__device__site__region__{}__in'.format(name): value}) |
  422. Q(**{'vminterface__virtual_machine__site__region__{}__in'.format(name): value})
  423. )
  424. )
  425. return qs